深度学习环境配置docker+pycharm+GPU

前言

在机器学习过程中,可能要使用各种机器学习框架,如tensorflow,mxnet,caffe等等。相信配过这些环境的人都对这个过程很是厌烦。有没有一种更好的方法呢?回答是肯定的:有!下面就隆重介绍一下一个神奇的工具docker。

docker

docker是一个很强大的工具,非常方便开发,测试以及发布产品。并能保证在这几个环节中软件运行的环境是一模一样的。对docker不太熟悉的人可以暂时把docker当做一个轻量级的虚拟机(注意:docker和虚拟机是不一样的,虚拟机需要大量的资源来模拟硬件,运行操作系统。而docker几乎不会有计算性能的损失)。下面说几个docker的概念:

  • image: 就是镜像,是别人或自己做好的机器学习的环境,只要下载下来就可以了。这里是一些别人提交的镜像docker hub
  • container: 也叫容器,是docker根据镜像产生的,一个镜像可以产生多个容器。我们的代码运行实际上是在容器中。容器中也可以装这种软件但容器停止运行后并不会提交到镜像中,如果要保存这些改变可以使用commiting指令(这里我也没有仔细研究)。
  • deamon: daocker守护进程,当安装完docker并启动后docker守护进程就开始运行,用来管理镜像、容器等。可以通过docker API和socket两种方式与deamon进行交互。

开始配置

先说一下我当时开始研究这个的目的实际上是因为之前听说docker非常方便,正好又准备安装mxnet,mxnet的官网也提供docker方式安装的教程,因此就试了一下。按说有教程那还不简单,问题是mxnet的教程只教到mxnet安装成功,然后在terminal里启动容器,就开始编程,我总不能在终端里搞开发吧?于是我的研究之路就开始了。

环境

  • 系统:ubuntu16.04
  • nvidia驱动版本:375.20
  • cuda:8.0.61
  • cudnn:6.0.21

安装docker和MXnet

我们先按照mxnet官网提示的安装方式安装docker

  1. 按照这里的提示安装docker(可以选择CE版)
  2. 按照这里的提示是docker运行不需要超级用户权限(也就是不用使用sudo,如果不做这一步以后执行docker指令时前边要加sudo。这一步在mxnet官网说是可选的,我开始偷懒就没做,这会导致后边pycharm连接docker时权限不够的问题,所以还是做了吧)。
  3. 按照这里的提示安装nvidia-docker2(这一步是为了能够使用GPU运算)
  4. 拉取MXnet docker 镜像
    $ docker pull mxnet/python:gpu # Use sudo if you skip Step 2
    使用下边的指令查看镜像是否拉取成功

    $ docker images # Use sudo if you skip Step 2
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mxnet/python        gpu                 493b2683c269        3 weeks ago         4.77 GB
  5. 运行如下指令就可以使用MXnet了

    $ nvidia-docker run -it mxnet/python:gpu bash # Use sudo if you skip Step 2 in the installation instruction
    
    # Start a python terminal
    
    root@4919c4f58cac:/# python
    >>> import mxnet as mx
    >>> a = mx.nd.ones((2, 3), mx.gpu())
    >>> b = a * 2 + 1
    >>> b.asnumpy()
    array([[ 3.,  3.,  3.],
           [ 3.,  3.,  3.]], dtype=float32)

    恭喜你!到了这里你已经成功安装了docker和mxnet,但问题是我总不能在terminal里做开发吧?
    不行,还要继续研究!

PyCharm设置

用过python的人对pycharm肯定非常熟悉了,能不能在pycharm里使用docker呢?pycharm says-yes!不过,首先你需要一个Professional edition版的pycharm。下面开始设置(英文好的看这里):

  1. 保证Docker integration和Python Docker两个插件是开启的
    Professional版的pycharm默认是安装了这两个插件,并且是开启的。
  2. docker配置
    在pycharm的设置->build,Execution,Deployment->Docker页面里,点击‘+’号就会出现一个docker设置页面,我们是Linux系统所以我们在Connect to Docker daemon with选项里直接选Unix socket就可以了。如果设置成功会在下方看到Connection successful的提示,如果你跳过了安装docker和MXnet中的第2步,这一步就会有权限不够的错误提示。深度学习环境配置docker+pycharm+GPU_第1张图片
    如果这一步成功了,就可以在pycharm下方看到Docker tool window,这是一个用来管理镜像,容器的可视化工具。
    这里写图片描述
    在这里可以很方便的启动,停止,添加和删除镜像、容器。也可以查看容器的一些参数。当然也可以使用docker的指令进行这些操作。
    深度学习环境配置docker+pycharm+GPU_第2张图片

  3. 为你的代码配置镜像里的解释器
    其实整篇文章就只为了这一步,只要我们的代码能使用镜像里的python解释器,那就达到了我们的目的了。添加本地解释器大家应该都会。在Professional版的pycharm里有个添加远程解释器。我们就是用这个
    深度学习环境配置docker+pycharm+GPU_第3张图片
    点击后会出现下边这个对话框
    深度学习环境配置docker+pycharm+GPU_第4张图片
    我们选择Docker这个选项,此时Server和Python interpreter path已经自动填好,大家不用管它,主要是选择你要使用的镜像。如果你不使用GPU版的镜像,那么其实到了这一步就已经配置好了。
    说一下我这里为什么选择tensorflow/tensorflow:latest-gpu镜像,不是已经装好了MXnet了嘛?说多了都是泪啊!MXnet的镜像里并没有吧MXnet安装在python的安装包路径下,而是在根路径下,使用nvidia-docker run -it mxnet/python:gpu bash指令启动时通过设置PYTHONPATH=/mxnet/python环境变量让python可以使用,但是!当你在pycharm中启动时,这个环境变量是没有设置的。所以import mxnet会不成功。这个问题还是有方法解决的,就是在Edit Configuration里添加环境变量。而且只能在这里添加,别的地方添加不好用,反正我实验的是不行的。
    深度学习环境配置docker+pycharm+GPU_第5张图片
    使用tensorflow的镜像就不会有这个问题,因为tensorflow是安装在python的的路径下的。所以请大家在接下来也先使用tensorflow作为这次配置的镜像,我们这次的目标是能在GPU上跑,所以用下面的指令下载GPU版的
    docker pull tensorflow/tensorflow:latest-gpu

  4. 使用GPU运行你的代码
    到这里有人就会发现问题,之前我们装了dockernvidia-docker那pycharm用的是哪一个呢?很不幸的是pycharm使用的是标准的docker。 那么这就有问题,我们不能使用GPU做运算。如何才能使用GPU呢?
    实际上如果我们用的是nvidia-docker1我们可能还需要安装docker-composenvidia-docker-compose,很不幸nvidia-docker-compose不能和nvidia-docker2兼容,那怎么办?看这里,这个连接提供了解决的方法就是吧"default-runtime": "nvidia",添加到/etc/docker/daemon.json文件中

    {
        "default-runtime": "nvidia",
        "runtimes": {
            "nvidia": {
                "path": "/usr/bin/nvidia-container-runtime",
                "runtimeArgs": [ ]
            }
        }
    }

    接下来是非常关键的一步,也是最白痴的一步,我在这里卡了很久。
    重启docker的守护进程
    重启docker的守护进程
    重启docker的守护进程
    sudo pkill -SIGHUP dockerd
    由于我的电脑下班后不关机,所以只要我不主动重启docker守护进程,这几天就从没有重启过。这样我们刚刚改的daemon.json文件是不会生效的。所以一直不能使用GPU运算。

小结

好啦,现在大家就可以使用镜像里的python解释器运行pycharm里的代码了,而且即使你本机上没有装tensorflow,写代码时也会有自动补全,其实在做完PyCharm设置中的第3步时写代码就有自动补全功能了,只是运行时会提示找不到libcuda.so.1的库,导致不能使用GPU运行。

最后

现在大家可以继续使用PyCharm愉快的编程了。另外有了docker这个神器,以后再也不用发愁环境搭建,电脑重装系统啦。对测试团队,以及产品的部署也是很方便的。
另外,PyCharm还有一种方式和docker配合,有兴趣的可以研究下docker-compose。但由于这种方式在运行代码时会有一个docker-compose up的过程,感觉不是很爽。也许有有其他我不了解的优点。
祝大家学习愉快!

你可能感兴趣的:(人工智能-神经网络算法)