前言:连续配了几个晚上,搞深度学习的环境,之前配成功过,但是这次再配的时候,发现遇到的坑和以前不一样,算了,直接上Docker大法,不想为环境再浪费宝贵的时间
首先我们先了解一下,docker配深度学习环境需要什么。
答:只需1.显卡驱动,2.docker 3.深度学习环境镜像
对就是这么简单。
1.首要的是显卡驱动,在下载显卡驱动之前先查一下,你即将要安装的版本,最低是多少。
比如我是要安装cuda10的,那么传送门,看一下你应该需要安装的最低版本。
知道了最低的版本。
先不管其他,卸载之前可能安装的驱动:
sudo apt-get --purge remove "*nvidia*"
看一下系统推荐的显卡驱动:
sudo ubuntu-drivers devices
查到推荐的显卡驱动,一般就是那个free的版本,18.04直接是指令安装就有,没有的上官网去下载。
(重点:安装驱动之前,一定一定,要记得关闭ubuntu的secue boot,不知道怎么关,来教你,传送门)
安装好了驱动之后,运行nvidia-smi,可能会报以下错误:
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver 18.04
但是如果你cd 到/usr/src 下看到你的显卡驱动版本,那么就不用担心了,继续,因为我是第二天就好了(知道为什么的大佬求教)
2.安装docker
这个网上一大堆教程,主要思路是先安装docker-ce,然后安装Nvidia Docker2
参考这位大神写的安装docker部分,传送门,其中有一个/etc/docker/daemon.json
内容修改成,没有这个文件需要新建,这是唯一我和他安装docker不一样的部分。
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
3.开始拉tensorflow-gpu的镜像,有很多教程直接上nvidia官网拉cuda和cudnn的环境,里面并没有tensorflow,其实搞起来很麻烦。后来我直接上docker-hub,搜tensorflow的镜像一大堆,拉镜像之前,先看一下自己需要的版本,在tensorflow官网有
因为我下的cuda10,所以直接上1.13.1的镜像
docker pull tensorflow/tensorflow-1.13.1-gpu-py3
拉下载之后,创建container运行
docker run -it --name DL_ENV02 -v /home/jun/DL2/:/home/jun/DL2/ --runtime=nvidia -e NVIDIA_VISIBLE_DEVICE=0 tensorflow/tensorflow:1.13.1-gpu-py3
这个我大概解释一下,DL_ENV02是我的容器名字,然后/home/jun/DL2/:/home/jun/DL2/,是信息交互的文件夹位置,一个在容器内,一个在你的主机上,就通过这个路径和容器进行信息交互。NVIDIA_VISIBLE_DEVICE=0是你的显卡设备号,我就一张卡,所以默认是0
如果遇到下面的坑:
docker: Error response from daemon: Unknown runtime specified nvidia.
问题解决传送门,安装好之后,问题消失,完美。
搞定之后,我们测试一下,运行下面的程序,
import tensorflow as tf
with tf.device('/cpu:0'):
a = tf.constant([1.0,2.0,3.0],shape=[3],name='a')
b = tf.constant([1.0,2.0,3.0],shape=[3],name='b')
with tf.device('/gpu:1'):
c = a+b
#注意:allow_soft_placement=True表明:计算设备可自行选择,如果没有这个参数,会报错。
#因为不是所有的操作都可以被放在GPU上,如果强行将无法放在GPU上的操作指定到GPU上,将会报错。
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True))
#sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
sess.run(tf.global_variables_initializer())
print(sess.run(c))
结果是【2,4,6】
这段是参考别人的博客,这里是传送门
关于docker的指令:
查看有哪些容器:docker container ls
运行容器:docker start
进入容器:docker attach
退出容器:exit
搞定,碎觉!