利用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效率损失远小于虚拟机,性能损失不大

nvidia-gpu-docker

这里以一个caffe-gpu为例展示过程

安装步骤:

  1. 安装显卡驱动和CUDA。不需要安装CUDA Toolkit。

  2. 安装docker,版本要在19.03及以上

  3. # 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
    
  4. 此时我们就可以启动一个示例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,应该是旧版的,现在已经不适用了

  5. 测试程序如果没问题的话,就可以用我们自己需要的镜像了。这里我举个例子:

    sudo docker run --gpus all -it -v /home/jiading/Face-detection:/data --name caffeGPU bvlc/caffe:gpu /bin/bash

    这个命令熟悉docker的同学应该不难理解

    1. 我们可以使用ctrl+P+Q暂时退出容器(退出后容器依然在后台运行),然后查询docker ps找到容器的id,输入docker attach <id>重新进入。对于我们配置好的环境,我们可以使用docker commit id name保存为新的容器
  6. 这里还要再提一个事情,就是有些镜像为了减少体积做了许多的删减,我见到的大多数都没有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

posted @ 2020-04-21 23:02  别再闹了  阅读(1222)  评论(0编辑  收藏  举报