docker run命令指定GPU多个显卡不生效的问题解决和代码示例

问题描述:我有一个程序(app),需要用到显卡来跑。原本的部署方式 是直接修改程序的配置文件来指定要用到的显卡。

这是我服务器的显卡信息:总共3卡 分别是 0卡 ,1卡和2卡。

[root@k8s-rancher1 etc]# nvidia-smi 
Sat Sep  4 12:50:17 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.84       Driver Version: 460.84       CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 1070    Off  | 00000000:02:00.0 Off |                  N/A |
| 21%   37C    P0    37W / 180W |      0MiB /  8119MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 1070    Off  | 00000000:03:00.0 Off |                  N/A |
| 24%   46C    P5    13W / 180W |      0MiB /  8119MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  GeForce GTX 1070    Off  | 00000000:04:00.0 Off |                  N/A |
| 24%   48C    P5    16W / 180W |      0MiB /  8119MiB |      2%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

这是程序的配置文件a.conf修改显卡使用的地方:注意这里我启用了0卡和1卡

docker run命令指定GPU多个显卡不生效的问题解决和代码示例

 

 

 

 原始的程序启动命令 ./app -c ./a.conf。程序启动后执行nvidia-smi,观察到0卡和1卡都已经被占用,我就不贴图了。

我想做的是直接在docker指定要启用的显卡,摆脱配置文件,这样在后续封装pyhon-docker接口的时候就不用再动态的修改配置文件然后再挂载进容器内。

现在,我把程序打包成镜像文件,下面是我容器启动命令:

[root@k8s-rancher1 /]# docker run -it --rm -p 2021:2021 -v /root/a.conf:/root/a.conf  --gpus all 192.168.9.102:2021/example/app:latest

这里我用 --gpus all 使用全部显卡(总共3卡),容器启动后会根据挂载的a.conf来选定要使用的卡,也就是0卡和1卡会被占用,2卡会空闲起来。这并没有问题,我们可以这么理解为,docker run 显卡指定all的时候,程序会根据自身的配置文件来启用对应的显卡

那么,问题来了,如果我在docker run 指定要用的一个或多个显卡,那么容器启动时,显卡占用情况是怎么样的呢?

实验1:

  1. a.conf 配置0卡和1卡

        2. docker run 指定显卡为2卡

[root@k8s-rancher1 /]# docker run -it --rm -p 2021:2021  -v /root/a.conf:/root/a.conf  --gpus "device=2" 192.168.9.102:2021/example/app:latest

结果:

docker run命令指定GPU多个显卡不生效的问题解决和代码示例

 

结果程序启用的是2卡,也就是说可以不可以理解为docker run 指定显卡和配置文件不一致时,会以docker分配的显卡为主

 

 

 实验2:

  1. a.conf 配置0卡

        2. docker run 指定显卡为1卡和2卡

[root@k8s-rancher1 /]# docker run -it --rm -p 2021:2021  -v /root/a.conf:/root/a.conf  --gpus "device=1,2" 192.168.9.102:2021/example/app:latest

docker run命令指定GPU多个显卡不生效的问题解决和代码示例

 

 

 结果显卡1被占用,2卡没被占用,0卡也没被占用,这我就没弄明白是什么情况。

 后续我又把配置文件改成1卡,docker指定1,2卡,结果被占用的只有2卡。如此反复,毫无规律。

后面我又测试了很多次,网上也找不到任何相关的资料,最终找到了一个完美的办法,可以完全不对配置文件做任何修改,也不用挂载配置文件了,过程就不说了。

解决方案:

我们在对程序做镜像的时候把a.conf配置文件显卡配置那块全部拉满,把所有卡都配置进去!。这里考虑到了四卡情况,虽然当前服务器只有3卡。

docker run命令指定GPU多个显卡不生效的问题解决和代码示例

 

 测试:

[root@k8s-rancher1 /]# docker run -it --rm -p 2021:2021  -v /root/a.conf:/root/a.conf  --gpus "device=1,2" 192.168.9.102:2021/example/app:latest

docker run命令指定GPU多个显卡不生效的问题解决和代码示例

 

[root@k8s-rancher1 /]# docker run -it --rm -p 2021:2021  -v /root/a.conf:/root/a.conf  --gpus "device=0,2" 192.168.9.102:2021/example/app:latest

docker run命令指定GPU多个显卡不生效的问题解决和代码示例

 

 

[root@k8s-rancher1 /]# docker run -it --rm -p 2021:2021  -v /root/a.conf:/root/a.conf  --gpus "device=0" 192.168.9.102:2021/example/app:latest

docker run命令指定GPU多个显卡不生效的问题解决和代码示例

 

 

 验证没有任何问题。我的理解是配置文件先把显卡占用拉满,用不用得到另说,程序最终具体用到哪些显卡就看docker给它分配哪些了。

有没有docker大佬告诉我一下具体是什么原理呢?

 

docker run命令指定GPU多个显卡不生效的问题解决和代码示例

上一篇:一个 简单 的 数论题 : p 是 素数, p 最大是多少 ?


下一篇:MySQL Replication(主从复制)