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