前言:给Ubuntu安装NVIDIA驱动+cuda+cudnn,网上教程很多,但问题都比较严重,试了3遍都不成功。而且强迫症如我,不喜欢电脑里有多余残留的东西。这时候想起docker了,毕业前还玩过一段时间,所以就开始尝试了(虽然也有不少坑)。
整个流程主要分几步:
1、安装NVIDIA驱动
(1)在NVIDIA官网选择的驱动程序,需要对应自己的GPU版本
网上的教程说可以通过
nvidia-smi
查询自己电脑的GPU版本,但是我是重新安装的Ubuntu系统,没有这个命令,需要安装NVIDIA驱动才可以。
(2)禁用开源nouveau驱动(使用vim,不会的童鞋自行学习)
编辑文件/etc/modprobe.d/disable-nouveau.conf,最后添加两行
sudo vim /etc/modprobe.d/disable-nouveau.conf
#
blacklist nouveau
options nouveau modeset = 0
退出后进行配置
sudo ldconfig
sudo update-initramfs -u
验证禁用是否成功:重新打开一个新的terminal,输入
sudo lspci | grep nouveau
如果没有内容则禁用成功。
(3)配置kernel以text模式启动
编辑文件/etc/default/grub,修改下面两句
sudo vim /etc/default/grub
#修改前
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
#修改后
GRUB_CMDLINE_LINUX_DEFAULT="quietsplash text"
GRUB_CMDLINE_LINUX="rdblacklist=nouveaunouveau.modeset=0"
保存更新,退出
sudo update-grub
重启电脑,在登录界面,使用Ctrl+Alt+F1进入控制台
用户名、密码登录后关闭图形界面
sudo service lightdm stop
不关闭可能会出现You appear to be running an X server; please exit X before的bug,关掉就行了。
关掉后cd到驱动所在目录
sudo sh NVIDIA-Linux-x86_64-3xx.xx.run
重启图形界面
sudo service lightdm start
再次修改grub文件,将原来的第一行改回来,第二行不改本人没有出现问题
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="rdblacklist=nouveaunouveau.modeset=0"
保存后更新
sudo update-grub
在此可以使用nvidia-smi就可以查看自己的显卡信息了。驱动安装完成。
2、安装docker
如果之前安装过较老的docker版本,可以使用下面的命令进行卸载
sudo apt-get remove docker docker-engine docker.io
用docker的官方hub下images啥的真的很慢,所以使用阿里的源
Ubuntu14.04/16.04
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce=[docker version]#可选择想要安装的版本号
Centos7
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
3、安装nvidia-docker
参考https://github.com/NVIDIA/nvidia-docker
# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
# Add the package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
#这应该能出现你的显卡信息,跟第一步一样。这时候是安装正确的。
centos7安装还要这些操作
新建/etc/docker/daemon.json
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
然后
yum install nvidia-container-runtime -y
这里要选择好自己要安装cuda以及cudnn的版本,我的显卡不支持cuda9.2,或者可能需要升级显卡驱动,不想再折腾出问题。
4、nvidia-docker pull pytorch images
pytorch docker image传送门
在这里下载合适的镜像,注意版本
我是选的0.4.1-cuda9-cudnn7-devel,那4个的区别就像开发环境和生产环境的区别,具体区别不是很懂。
下载完成后,run下载的镜像
sudo nvidia-docker run -ti -d --name="pytorch1.0" -p 8888:8888 --net=host -v /home/yq/Documents/nlp:/root/wordspace db3c6c9e9983
参数:
-p 8888:8888 -> 把本地端口映射到容器端口
--net=host -> 保证容器可以上网
-v -> 把本地的路径下文件共享到容器中 命令格式 local path:docker path
3febd5b72fb0是image的id 可以用sudo nvidia-docker images查看对应容器的id
5、安装notebook并配置远程访问
在Ubuntu里ipython notebook和jupyter notebook是一样的,装一个就行。但在docker里不是一个东西
pip install ipython notebook
Python验证pytorch是否可以使用GPU
import torch
print(torch.cuda.is_available())
True #结果是true的话就是OK的
生成配置文件
ipython notebook --allow-root --generate-config
结果应该是/.jupyter/jupyter_notebook_config.py,会问你要不要overwrite,其实无所谓。
使用ipython,创建一个密文密码
n [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:ce23d945972f:34769685a7ccd3d08c84a18c63968a41f1140274'
这个sha1…要复制保存
修改默认配置文件/.jupyter/jupyter_notebook_config.py
c.NotebookApp.password =u'sha:c........' 这里把复制的密文替换掉
c.NotebookApp.ip='*' # 就是设置所有ip皆可访问
#####我一开始是设置*,但是怎么都访问不了,后来查资料,改成
c.NotebookApp.ip='0.0.0.0' #就OK了
c.NotebookApp.open_browser = False # 禁止自动打开浏览器
c.NotebookApp.port =8888 #在Ubuntu中是随机指定端口的,但是这里只映射了8888端口,所以必须是8888了。如果不设置8888端口,是否可行,没有试过。
打开notebook
ipython notebook --allow-root
可以在浏览器使用 localhost:8888/tree或者ip:8888/tree登录了(tree也可不要)
强推一个docker hub,这个里面有常用的tf、Torch、caffe等深度学习工具,还支持jupyter远程访问,强的不行。
https://hub.docker.com/r/ufoym/deepo
参考致谢:
https://blog.csdn.net/chxw098/article/details/79741586
https://github.com/jupyter/docker-stacks/issues/718
https://blog.csdn.net/u014176855/article/details/78130240
https://blog.csdn.net/dihuanlai9093/article/details/79253963/
https://blog.csdn.net/mumodm/article/details/82503022