一直都听说docker是一个很不错的工具,不需要复杂的环境配置,以及移植性很强。这次在给服务器配置完了深度学习环境后,也尝试了一下使用docker,因为之前没接触过docker,就稍微借鉴了几篇博客来梳理一下安装和使用的流程。
1.docker的安装
docker的安装主要是参考了博客教你如何用Docker快速搭建深度学习环境,直接参考这个博客来安装,基本上不会有什么错误发生,需要注意的就是要根据自己系统的来添加相应的镜像源。
2.接着就是安装Nvidia-docker
这一部分在上面的博客中也写的很清楚
3.拉取镜像
docker pull ufoym/deepo:all-py36-jupyter
这个是真的费时间,拉取的速度很慢,所以就学习了一下docker的基本操作
3.1 用户加入到docker组中
如果不把用户加入docker组中的话,运行docker相关操作就需要加sudo,还是比较麻烦的,所以直接加入一了百了
先查看是否存在docker组:cat /etc/group | grep docker 输出:docker:x:999 则证明含有docker组
把当前用户添加到docker组: sudo gpasswd -a ${USER} docker
切换到docker组: newgrp - docker
重启docker服务: sudo service docker restart
可以不加sudo就执行docker操作了。
3.2 image文件以及拉取image文件来生产container
image可以看做是container的类,而container是image的一个实例,所以一个image可以产生多个container
查看image文件:docker image ls
删除image文件:docker image rm imageID 其中的imageID可以通过查看image文件中的输出来找到
拉取一个入门的image文件,hello world: docker image pull hello-world
运行这个image文件来产生一个container:docker container run hello-world
运行成功的话,输出为:Hello fromDocker! 证明你的docker可以正常试用了。但是这个container输出后会自动关闭。
接下来展示一个不会自动关闭的container,运行一个Ubuntu的image:docker container run -it ubuntu bash
因为这个container是不会自动终止的,所以需要自己去终止它,先查看正在运行的container以及ID
docker container ls 还有一个查看方法是列出所有的container,包括终止的:docker container ls --all
接着使用:docker container stop containerID 来终止在运行的container,其中的stop也可以换成kill
但是终止container只是让其停止运行了,而文件之类的都在,如果要删除这个container使用:docker container rm containerID
再使用docker container ls --all 进行查看之后就不会再看到以及被删除的container了。
3.3 docker的其他有用命令
重复使用之前使用run生成的container,但把它终止了:docker container start containerID
进入正在运行的docker中:docker container exec -it containerID /bin/bash
把容器中的文件拷贝到本地的当前目录下:docker container cp [containerID]:[/path/to/file]
把本地文件上传到container中:docker container cp 本地路径 containerID:容器路径
4. 启动拉取的深度学习image
目前我只拉取了4个image,Ubuntu和hello-world都玩了,就剩下ufory/deepo和nvidia/cuda了。
刚开始的是使用的指令:docker run -it ufoym/deepo:all-py36-jupyter 来建立ufoym/deepo的一个container,发现虽然可以建立,但是不能够正常使用其中的Nvidia驱动等环境。所以就把这个container删了。
接着使用的指令:nvidia-docker run -it ufoym/deepo:all-py36-jupyter 来配合nvidia环境来建立container,可以完美的使用其中的环境,而且发现跑mnist的一个epoch只需要5s,比直接在服务器上跑还要快一些,觉得很神奇。
而直接在服务器中配置好的本地环境上跑需要的时间稍微长一些,而且在前面几个epoch甚至需要10s,但docker中不会有这猴子那个现象
还有一个对比就是使用pycharm在我的windows环境下远程在服务器上调试和跑程序需要的事件更加长,基本保持10s
真是不同的配置环境和运行环境下需要的训练时间完全不一样,不过还是觉得在pycharm上在本地进行代码的修改和调试在开发效率上会更加的高。关于pycharm如何配置好远程调试代码的步骤将会在我的下篇博客中介绍。
这就是使用docker来配置深度学习环境和使用深度学习环境,配置起来的确比自己手把手的配置要省时省力多了。