怎么在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的输出是好的,那么大概率没问题)

posted @ 2021-02-24 22:42  思念殇千寻  阅读(35236)  评论(4编辑  收藏  举报