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卡

 

 

 

 原始的程序啟動命令 ./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

結果:

 

結果程序啟用的是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

 

 

 結果顯卡1被占用,2卡沒被占用,0卡也沒被占用,這我就沒弄明白是什么情況。

 后續我又把配置文件改成1卡,docker指定1,2卡,結果被占用的只有2卡。如此反復,毫無規律。

后面我又測試了很多次,網上也找不到任何相關的資料,最終找到了一個完美的辦法,可以完全不對配置文件做任何修改,也不用掛載配置文件了,過程就不說了。

解決方案:

我們在對程序做鏡像的時候把a.conf配置文件顯卡配置那塊全部拉滿,把所有卡都配置進去!。這里考慮到了四卡情況,雖然當前服務器只有3卡。

 

 測試:

[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

 

[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

 

 

[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給它分配哪些了。

有沒有docker大佬告訴我一下具體是什么原理呢?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM