zoukankan      html  css  js  c++  java
  • 怎么在docker中使用nvidia显卡

      参考资料:

      https://blog.csdn.net/qq_33547243/article/details/107433616

      https://www.cnblogs.com/shoufu/p/12904832.html

      https://github.com/NVIDIA/nvidia-docker/issues/533

      首先介绍几个事实:

      1. 最初的docker是不支持gpu的

      2. 为了让docker支持nvidia显卡,英伟达公司开发了nvidia-docker。该软件是对docker的包装,使得容器能够看到并使用宿主机的nvidia显卡。

      3. 根据网上的资料,从docker 19版本之后,nvidia-docker成为了过去式。不需要单独去下nvidia-docker这个独立的docker应用程序,也就是说gpu docker所需要的Runtime被集成进docker中,使用的时候用--gpus参数来控制。

      (P.S.:因为本实验室服务器的docker默认是支持nvidia的runtime的,所以我在这里没有过多纠结,读者假如从零开始安装docker软件的话可能要细心地保证docker是支持gpu的docker)

      

      然后我做了几个有代表性的实验:

      1. docker run 的时候不加 --gpus参数,典型代码:

    docker run -it --name test --rm ubuntu:latest
    

      此时在容器内运行nvidia-smi会提示Command not found

      2. docker run 的时候加上 --gpus参数,典型代码:

    docker run -it --rm --name test --gpus all ubuntu:latest
    

      此时在容器内运行nvidia-smi会有如下输出:

      从这两个实验我们可以得出结论,docker在启动容器的时候添加的--gpus参数确实是给容器添加了新东西的。比如/usr/bin/nvidia-smi这个可执行程序,如果你不添加--gpus参数是不会给你放到容器中的!此外可以推测,不加--gpus参数,宿主的gpu将对于容器不可见。

      还有一个需要注意的点是nvidia-smi的输出!CUDA Version: N/A

      首先,我的宿主机的CUDA是明确的11.0版本,宿主机的nvidia driver是明确的450.57版本(这一点宿主和容器一致)。那么为什么这里显示 N/A 呢?

      抱着nvidia-smi能用driver一定没问题的想法,我三下五除二地在docker中安装了pytorch。可是运行测试代码的时候傻眼了,测试代码:

    import torch
    torch.cuda.is_available()
    

      输出报错结果如下:

      UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at /pytorch/c10/cuda/CUDAFunctions.cpp:100.)
      return torch._C._cuda_getDeviceCount() > 0

      为什么Pytorch找不到NVIDIA driver?? 我的driver哪里有问题?? nvidia-smi不是运行的好好的??

      尝试过在docker内重装多版本的cuda无果,尝试在docker内重装nvidia驱动反而导致nvidia-smi都无法运行。直到我在参考资料3中找到了解决方案,原来是环境变量的问题。


      最后,拉一个GPU docker的正确姿势:

    docker run -itd --gpus all --name 容器名 -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all 镜像名
    

      多出来的东西其实就是这个家伙:NVIDIA_DRIVER_CAPABILITIES=compute,utility

      也就是说,如果你不改这个环境变量,宿主机的nvidia driver在容器内是仅作为utility存在的,如果加上compute,宿主机的英伟达driver将对容器提供计算支持(所谓的计算支持也就是cuda支持)。

      docker exec进入容器,再次运行nvidia-smi

      和宿主机的输出就完全相同了。

      再次尝试pytorch的测试代码,输出为True。

      至此,你就获得了一个具有nvidia driver和cuda支持的docker。(需要注意的是,我的pytorch是直接用conda安装的,它的依赖cudatoolkits仅对conda可见,如果你需要cuda做更多事,可能还需要进一步的尝试。但是我猜想既然nvidia-smi的输出是好的,那么大概率没问题)

  • 相关阅读:
    指针常量,常指针,指向常量的常指针(从我大一写的QQ空间迁移过来)
    关于负数的除法和余数的结果
    我爱Java系列---【案例:使用session存储验证码完成登录功能】
    我爱Java系列---【Java生成验证码案例】
    我爱Java系列---【Tomcat介绍及配置教程(附tomcat8.5.34下载文件,解压即可用)】
    我爱Java系列---【HTML基本标签】
    我爱Java系列---【原生JDBC】
    我爱Java系列---【mysql多表查询】
    我爱Java系列---【mysql查询DQL&多表关系】
    我爱Java系列---【mysql基础&约束】
  • 原文地址:https://www.cnblogs.com/chester-cs/p/14444247.html
Copyright © 2011-2022 走看看