zoukankan      html  css  js  c++  java
  • 利用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之间是隔离的,不需要担心环境之间相互影响。
    • 可以同时准备多个可用环境(caffepytorch f等),想用哪个用哪个
    • 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

  • 相关阅读:
    Linux中带颜色输出的printf使用简介(33)
    Windows中检测当前是否有窗口全屏
    duilib WindowImplBase BUG修复 --- 按一次ESC键, 关闭多个窗口
    【转】OSI七层模型与TCP/IP五层模型
    linux修改文件所有者和文件所在组
    【转】开发人员该如何应对线上故障
    【转】jstack命令的使用
    【转】【JVM】jmap命令详解----查看JVM内存使用详情
    【转】【JVM】jstat命令详解---JVM的统计监测工具
    阿里开源java诊断工具Arthas
  • 原文地址:https://www.cnblogs.com/jiading/p/12748701.html
Copyright © 2011-2022 走看看