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,這就導致了幾個問題:
- pytorch版本限制為0.4.1,實驗室服務器的版本是1.0.0
- 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
所以其實只需要保持驅動最新就行了,沒有版本的上限,所以推薦給你的驅動做一下升級。
首先查看推薦驅動:
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