如何在较旧版本的docker中使用gpu

发布时间 2023-11-26 16:35:42作者: 思念殇千寻

  参考资料:

  自己摸索

  https://blog.csdn.net/qq_43684922/article/details/127024933

  之前我写过一篇如何在docker中使用gpu的随笔(传送门),当时反响还不错(收获了三个推荐)。但是今天却遇到了坑爹的情况,当时的方法不管用了。

  回顾一下当时的解决方案:只要加上 --gpus all,以及两个环境变量就好了。但是这次我遇到问题的坑爹之处在于,我的docker版本不再是19以上,而是恰恰好好地卡在了18。这就使得它不能够理解--gpus all这个参数项。此时我们就需要一些更加...离谱的操作。

  首先,我的这个宿主机,他有一个docker,版本是18。有一个nvidia-docker,版本没看(这个项目nvidia早已停止维护)。目前的症状是虽然能够用nvidia-docker正常运行NGC中的pytorch容器。但是这个破东西对于其他的镜像都无效。比如,nvidia-docker run一个ubuntu镜像,你会发现没法使用gpu(nvidia-smi命令都没有)。nvidia-docker run一个NGC官方的pytorch镜像,却可以使用gpu(nvidia-smi命令存在)。但是我又确确实实地不想用官方的镜像,此时应该怎么办呢?

  参考资料2中给出的命令已经非常接近标准答案:

1 docker run \
2 --device /dev/nvidia0:/dev/nvidia0 \
3 --device /dev/nvidiactl:/dev/nvidiactl \
4 --device /dev/nvidia-uvm:/dev/nvidia-uvm \
5 -v /usr/local/nvidia:/usr/local/nvidia \
6 -it --privileged nvidia/cuda

  简单分析一下它为什么能work,因为这个其实就是nvidia-docker(相较于旧版本docker)多做的事情:1)挂载一些奇怪的device(nvidiactl, nvidia-uvm)2)挂载实实在在的gpu device(nvidia0, nvidia1...)3)对nvidia文件夹做一个路径映射

  为什么说这个命令已经非常接近但不是标准答案呢?就在于第三步,这里实际上没有点清楚。这个nvidia文件夹从哪里来呢?

  理论上来讲,这个nvidia文件夹应该是在安装nvidia驱动的时候伴生的。但是我却没有在宿主机中发现这个文件夹(懒得找了浪费时间,根本不再/usr/local下面),于是乎我找到了一个可以正常使用gpu的容器(也就是nvidia的官方容器),把它的nvidia文件夹打包copy了过来。这样一来,就拿这个文件夹来映射容器中的/usr/local/nvidia就好了。显然这种做法解决不了问题,所以读者如果没有一个容器的gpu能用的话,就老实在宿主机中把nvidia文件夹找到吧。

          里面实际上是一些库,和一些可执行文件。我们惊喜地发现nvidia-smi就在这里面。为了让GPU彻底能work,我们还需要做两件事。

export PATH=$PATH:/usr/local/nvidia/bin
export LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64

  即在docker容器中把这俩环境变量给配置好。这样就大功告成了。最终的命令如下:

docker run -it --name XX \
    --device /dev/nvidia0:/dev/nvidia0 \
    --device /dev/nvidia1:/dev/nvidia1 \
    --device /dev/nvidia2:/dev/nvidia2 \
    --device /dev/nvidia3:/dev/nvidia3 \
    --device /dev/nvidiactl:/dev/nvidiactl \
    --device /dev/nvidia-uvm:/dev/nvidia-uvm \
    -v /pathto/nvidia:/usr/local/nvidia \
    -e LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64 \
    image_id /bin/bash

  为了一个老版本的问题,掰扯了得有四五个小时... 毕竟更新docker很有可能就把正在运行的容器弄得打不开。所以:真的坑啊!