前言
在机器学习过程中,可能要使用各种机器学习框架,如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
-
按照这里的提示安装docker(可以选择CE版)
-
按照这里的提示是docker运行不需要超级用户权限(也就是不用使用sudo,如果不做这一步以后执行docker指令时前边要加sudo。这一步在mxnet官网说是可选的,我开始偷懒就没做,这会导致后边pycharm连接docker时权限不够的问题,所以还是做了吧)。
-
按照这里的提示安装nvidia-docker2(这一步是为了能够使用GPU运算)
-
拉取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
-
运行如下指令就可以使用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。下面开始设置(英文好的看这里):
-
保证Docker integration和Python Docker两个插件是开启的
Professional版的pycharm默认是安装了这两个插件,并且是开启的。 -
docker配置
在pycharm的设置->build,Execution,Deployment->Docker页面里,点击‘+’号就会出现一个docker设置页面,我们是Linux系统所以我们在Connect to Docker daemon with选项里直接选Unix socket就可以了。如果设置成功会在下方看到Connection successful的提示,如果你跳过了安装docker和MXnet中的第2步,这一步就会有权限不够的错误提示。
如果这一步成功了,就可以在pycharm下方看到Docker tool window,这是一个用来管理镜像,容器的可视化工具。
在这里可以很方便的启动,停止,添加和删除镜像、容器。也可以查看容器的一些参数。当然也可以使用docker的指令进行这些操作。
-
为你的代码配置镜像里的解释器
其实整篇文章就只为了这一步,只要我们的代码能使用镜像里的python解释器,那就达到了我们的目的了。添加本地解释器大家应该都会。在Professional版的pycharm里有个添加远程解释器。我们就是用这个
点击后会出现下边这个对话框
我们选择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里添加环境变量。而且只能在这里添加,别的地方添加不好用,反正我实验的是不行的。
使用tensorflow的镜像就不会有这个问题,因为tensorflow是安装在python的的路径下的。所以请大家在接下来也先使用tensorflow作为这次配置的镜像,我们这次的目标是能在GPU上跑,所以用下面的指令下载GPU版的
docker pull tensorflow/tensorflow:latest-gpu
-
使用GPU运行你的代码
到这里有人就会发现问题,之前我们装了docker
和nvidia-docker
那pycharm用的是哪一个呢?很不幸的是pycharm使用的是标准的docker
。 那么这就有问题,我们不能使用GPU做运算。如何才能使用GPU呢?
实际上如果我们用的是nvidia-docker1
我们可能还需要安装docker-compose
和nvidia-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
的过程,感觉不是很爽。也许有有其他我不了解的优点。
祝大家学习愉快!