[AI] 切換cuda版本的萬金油


1. 環境

  • ubuntu16.04
  • GTX1080Ti x 4
  • nvidia-418
  • cuda-10.1
  • pytorch1.0.0

目標:在最新的顯卡驅動下,使用不同版本的cuda和深度學習框架來執行、編譯模型代碼。

2. 前言

眾所周知,NVIDIA的cuda版本更新的很快,且不同cuda版本不兼容,所以導致有些模型的部分layer在cuda編譯時,十分的麻煩。

例如我碰到的例子,實驗室需要運行flownet2.0,NVIDIA給出了官方實現,但其中有幾個layer使用了cuda編寫,在運行模型之前要先編譯這幾個layer,這就導致了幾個問題:

  1. pytorch版本限制為0.4.1,實驗室服務器的版本是1.0.0
  2. cuda版本要求9.0,實驗室服務器的版本是10.1

在不能回退服務器版本的情況下,就需要獻上docker大法了,這也是本篇博客的主題。

3. 更新nvidia驅動

在切換cuda之前,我推薦給你的服務器來個大升級,把驅動更新到最新以支持最新版的cuda(目前是10.1)。

但是驅動也不是隨意更新的,例如我安裝nvidia-410和nvidia-415驅動,都不能識別顯卡(nvidia-smi命令運行不了)。

大家肯定常常聽說,cuda的恐怖之處在於需要和顯卡驅動版本對應,其實cuda-8.0后就沒有這個問題了,可以看NVIDIA給出的版本對照表格:

https://github.com/NVIDIA/nvidia-docker/wiki/CUDA

nvidia-cuda

所以其實只需要保持驅動最新就行了,沒有版本的上限,所以推薦給你的驅動做一下升級。

首先查看推薦驅動:

sudo ubuntu-drivers devices

輸出:

== /sys/devices/pci0000:80/0000:80:03.0/0000:83:00.0 ==
modalias : pci:v000010DEd00001B06sv000010DEsd0000120Fbc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-418 - third-party free recommended
driver   : nvidia-396 - third-party free
driver   : nvidia-415 - third-party free
driver   : nvidia-390 - third-party free
driver   : nvidia-410 - third-party free
driver   : xserver-xorg-video-nouveau - distro free builtin
driver   : nvidia-384 - distro non-free

可見推薦的驅動為nvidia-418

建議在安裝新驅動之前卸載舊版本驅動:

sudo apt-get remove --purge '^nvidia-.*'
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-418

# 需要重啟才能生效
sudo reboot

安裝完成后檢查是否生效:

nvidia-smi

4. 安裝docker和nvidia-docker

這一步就跳過啦,網上已經有很多教程了。

驗證是否可以運行多cuda環境(會自動pull不存在的鏡像):

docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi

5. 萬金油,啟動

萬金油docker:https://github.com/ufoym/deepo (docker hub上的說明文檔更新不及時)

可以看到你可以選擇不同版本的cuda來安裝鏡像,這里以flownet2.0需要的pytorch0.4.1和cuda-9.0舉例:

首先把cuda-9.0 + pytorch的鏡像拉取下來:

docker pull ufoym/deepo:pytorch-py36-cu90

運行(這里假設你的數據放在/home/ubuntu/data下:

docker run --runtime=nvidia -it -v /home/ubuntu/data:/data ufoym/deepo:pytorch-py36-cu90 bash

此時就會進入docker的bash,我們來檢查一下版本是否正確:

root@6b0ddf89d46f:/# python
Python 3.6.8 (default, Dec 24 2018, 19:24:27)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.__version__
'1.0.0'
>>> torch.version.cuda
'9.0.176'
>>>

可以發現cuda版本對了,但是torch還是1.0.0,這個時候我們只需要查閱一下pytorch的官網,重裝一下pytorch就行了。

舊版本參閱:https://pytorch.org/get-started/previous-versions/

# 卸載舊版本
pip uninstall pytorch-nightly torchvision-nightly

# 安裝新版
pip install https://download.pytorch.org/whl/cu90/torch-0.4.1-cp36-cp36m-linux_x86_64.whl

再次驗證后,torch版本已經修改到了0.4.1:

root@6b0ddf89d46f:/# python
Python 3.6.8 (default, Dec 24 2018, 19:24:27)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.__version__
'0.4.1'
>>> torch.version.cuda
'9.0.176'
>>>

這個時候我們就能cd到data目錄下,對flownet的幾個cuda layer進行編譯了。

但是如果你退出了docker bash,這個鏡像會被關閉,這個時候只需要執行以下命令就可以再次進入:

# 查看剛剛啟動的鏡像id
docker ps -a

# 啟動鏡像
docker start 6b0dd

# 進入bash
docker exec -it 6b0dd bash

# 當你再次退出時就不需要重新啟動鏡像了,直接用上述命令進入即可。

6. 總結

做完上述事情后,我們就可以在最新的顯卡驅動下,使用各版本的cuda來編譯我們的代碼了。

7. 參考資料

參考博客:
http://andy51002000.blogspot.com/2019/01/nvidia-smi-has-failed-because-it.html

CUDA版本列表:
https://github.com/NVIDIA/nvidia-docker/wiki/CUDA

查看推薦驅動:

sudo ubuntu-drivers devices

查看顯卡是否識別:

lspci | grep 'VGA'

確認kernel版本:

uname -a

升級ubuntu:

sudo do-release-upgrade -d

安裝驅動:

sudo apt-get remove --purge '^nvidia-.*'
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-418

重啟

sudo reboot

查看安裝是否成功

nvidia-smi

檢測cuda10在docker中是否可用:

docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi

安裝deepo:

docker pull ufoym/deepo:all-jupyter-py36-cu100


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM