Docker搭建tensorflow-gpu环境

前言:连续配了几个晚上,搞深度学习的环境,之前配成功过,但是这次再配的时候,发现遇到的坑和以前不一样,算了,直接上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 <container-name>

进入容器:docker attach <container-name>

退出容器:exit

搞定,碎觉!


版权声明:本文为qq_31638535原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。