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 run命令指定GPU多个显卡不生效的问题解决和代码示例的更多相关文章
- Docker run 命令的使用方法
[编者的话]在Docker中,run应该是用户使用最多的命令了,很多读者反馈不是很明白run命令的用法,而且相关的书籍.中文资料中对run命令的描述也不是非常完整,所以DockerOne组织翻译了Do ...
- Docker run 命令参数及使用
Docker run 命令参数及使用 Docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTI ...
- docker run命令运行以及参数详解
命令格式: -a, --attach=[] 登录容器(必须是以docker run -d启动的容器) -w, --workdir="" 指定容器的工作目录 -c, --cpu-sh ...
- Docker(12)- docker run 命令详解
如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 创建一个新的容器并运行一个 ...
- Docker run命令详解 转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Usage: doc ...
- Docker run 命令
docker run -d -p 8084:80 --name weather --restart always --link fme-postgis 192.168.1.220:5000/weath ...
- Docker run命令参数整理
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, - ...
- 执行docker run命令时报错Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
一.解决办法: 修改host 二.步骤如下 2.1 安装dig工具 sudo apt-get install dnsutils -y (ubuntu下的安装方法) 2.2 找到registry-1. ...
- Docker学习总结之Run命令介绍
Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...
随机推荐
- 一文说清OpenCL框架
背景 Read the fucking official documents! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: 对不 ...
- atom之插件安装及相关
1. simplified-chinese-menu 汉化软件 2. file-icons 加上文件图标 3. language-vue 加上vue语言支持 4. platformio-ide-ter ...
- 使用C#winform编写渗透测试工具--端口扫描
使用C#winform编写渗透测试工具--端口扫描器 主要介绍使用C#winform编写渗透测试工具--端口扫描器,端口扫描器则是一种检测服务器或者主机虚拟端口是开启或关闭的工具.由于连接到局域网或互 ...
- jboss未授权访问
测试 poc地址 https://github.com/joaomatosf/jexboss
- GoogleTest死亡测试的跨平台BUG
最近工作用到了GoogleTest来作单元测试,但是死亡测试的ASSERT_DEATH语句一直跑不通. GoogleTest会启动子进程来运行代码,并捕捉子进程的错误消息,这就是所谓的"死亡 ...
- [开源]入坑Qt,我的第一个小程序:MD5计算器
版权声明 --------- 本文仅在知乎与博客园发布.开发者为szx0427 MFC和Win32搞了好几年了,也算是懂了个皮毛,但是一直觉得用这两者开发软件都很麻烦,需要将大量的代码花费在UI等地方 ...
- VIM的命令历史
例如有一段文本,将所有CTRL替换为ctrl,将所有A替换为a,也就是执行了:%s/CTRL/ctrl/g和:%s/A/a/g两条命令,然后进行了很多其他编辑,最后关闭VIM. 后来又有一段文本,也需 ...
- Python Flask API实现方法-测试开发【提测平台】阶段小结(一)
微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 本篇主要是对之前几次分享的阶阶段的总结,温故而知新,况且虽然看起来是一个小模块简单的增删改查操作,但其实涉及的内容点是非常的密集的,是非常 ...
- 【原创】Spring Data Redis <=2.0.3反序列化漏洞
Spring Data Redis隶属于Spring Data家族, 提供简单易用的方式来访问Redis缓存. Spring Data Redis在往Redis里面写数据的时候,默认会先对数据进行序列 ...
- SQL注入的那些面试题总结
一.知识储备类 1.SQL与NoSQL的区别? SQL:关系型数据库 NoSQL:非关系型数据库 存储方式:SQL具有特定的结构表,NoSQL存储方式灵活 性能:NoSQL较优于SQL 数据类型:SQ ...