利用dockerc创建机器学习环境
利用dockerc创建机器学习环境
学习机器学习以来,最让我感到头疼的就是环境配置:每个不同的模型可能使用完全不同的环境,并且很可能还是彼此冲突的,用conda也不能很好的管理,每次复现时候都需要很大的力气来搭建环境,但是这样的环境往往用了几次就没有了,放在机器中反而成为以后无用的累赘。此外,因为实验室的服务器是共用的,每次使用管理员账号都很小心,生怕一个操作改变了其他人的环境。这些问题其实都能用docker解决,特别是nvidia-docker允许在docker中使用CUDA。
docker一般服务于基于cpu 的应用,而我们的深度学习模型是跑在gpu上面的.最开始的解决方法是在容器内部安装nvidia driver,然后通过设置相应的设备参数来启动container,但是这样做带来一个弊端就是可能导致image无法共享,因为宿主机的driver的版本必须完全匹配容器内的driver版本,很可能本地机器的不一致导致每台机器都需要去重复操作,这很大的违背了docker的初衷。nvidia docker实际上是一个docker plugin,它在docker上做了一层封装,对docker进行调用,类似一个守护进程,发现宿主机驱动文件以及gpu 设备,并且将这些挂载到来自docker守护进程的请求中,以此来支持docker gpu的使用。
https://blog.csdn.net/weixin_42749767/article/details/82934294
docker在机器学习中应用的优点:
- 真*一站式解决复现时的依赖问题,极大地提高了复现效率
- 在docker中操作不需要担心对他人环境的改变,并且因为docker之间是隔离的,不需要担心环境之间相互影响。
- 可以同时准备多个可用环境(caffe\pytorch\tf等),想用哪个用哪个
- docker中可以放心用管理员账号
- docker效率损失远小于虚拟机,性能损失不大
这里以一个caffe-gpu为例展示过程
安装步骤:
-
安装显卡驱动和CUDA。不需要安装CUDA Toolkit。
-
安装docker,版本要在19.03及以上
-
# Add the package repositories distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker
-
此时我们就可以启动一个示例docker镜像了,这里还是看github上的原文指导
#### Test nvidia-smi with the latest official CUDA image docker run --gpus all nvidia/cuda:10.0-base nvidia-smi # Start a GPU enabled container on two GPUs docker run --gpus 2 nvidia/cuda:10.0-base nvidia-smi # Starting a GPU enabled container on specific GPUs docker run --gpus '"device=1,2"' nvidia/cuda:10.0-base nvidia-smi docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:10.0-base nvidia-smi # Specifying a capability (graphics, compute, ...) for my container # Note this is rarely if ever used this way docker run --gpus all,capabilities=utility nvidia/cuda:10.0-base nvidia-smi
-
所以,如果我们想要启用所有的GPU,参数就填all
-
测试的镜像要和你CUDA的版本对应,比如我的CUDA是9.0的,那么pull的镜像就应该是nvidia/cuda:9.0-base
-
这里可以看出启动的命令还是docker而不是nvidia-docker,之前看的一个教程上写的是nvidia-docker,应该是旧版的,现在已经不适用了
-
-
测试程序如果没问题的话,就可以用我们自己需要的镜像了。这里我举个例子:
sudo docker run --gpus all -it -v /home/jiading/Face-detection:/data --name caffeGPU bvlc/caffe:gpu /bin/bash
这个命令熟悉docker的同学应该不难理解
- 我们可以使用ctrl+P+Q暂时退出容器(退出后容器依然在后台运行),然后查询
docker ps
找到容器的id,输入docker attach <id>
重新进入。对于我们配置好的环境,我们可以使用docker commit id name
保存为新的容器
- 我们可以使用ctrl+P+Q暂时退出容器(退出后容器依然在后台运行),然后查询
-
这里还要再提一个事情,就是有些镜像为了减少体积做了许多的删减,我见到的大多数都没有vim,有的甚至连vi都没有。这就给apt更新带来了很大的问题(因为要先换源),所以没办法的话可以通过docker的共享文件夹将sources.list传进去然后替换掉。此外,有可能还会遇到apt 卡在0%的情况:
产生问题的原因在于docker的容器下实在是太干净简洁了,很多东西都没有,这里是因为缺少apt-transport-https包导致的,先在自己电脑上下载这个包(针对ubuntu 16.04 64位的下载地址为:http://archive.ubuntu.com/ubuntu/pool/main/a/apt/apt-transport-https_1.2.32_amd64.deb),下载好后使用dpkg -i /path/to/apt-transport-https_1.2.32_amd64.deb安装即可。
在apt-get update可以发现问题解决了,又可以愉快的使用apt-get装软件了
————————————————
版权声明:本文为CSDN博主「lhanchao」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lhanchao/java/article/details/104353847