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时,执行最多的命令某 ...
随机推荐
- 第十二篇 -- QMainWindow与QAction(剪切-复制-粘贴)
效果图: 按照上一节的方法,将剪切-复制-粘贴图标放置到工具栏后,为其指定槽函数.这些功能无需自己编写代码来实现,QPlainTextEdit提供了实现这些编辑功能的槽函数,如cut().copy() ...
- xmind2020 zen 10.2.1win/mac/linux安装教程
xmind是一款优秀的思维导图软件,本文教大家如何安装xmind zen 2020 10.2.1版本,解锁使用全部功能,包括去掉xmind zen水印.上传图片等功能,支持windows/mac/li ...
- vue 跨域 springCloud @CrossOrigin注解
vue 跨域 springCloud @CrossOrigin注解 一丶什么是跨域 跨域问题来源于浏览器的同源策略,浏览器为了提高网站的安全性,在发送ajax请求时,只有在当前页面地址与请求地址的协 ...
- ASP.NET Datalist制作显示效果和img的数据库存储
1. 具体实现效果如下图: 2.首先使用datalist控件编辑模板,在属性面板选择RepeatColumns="3" RepeatDirection="Horizont ...
- a = input(a, yymmdd10.)引发的问题
在数据清理过程中,经常会遇到以文本储存的日期型数据,这种数据不能直接进行分析,需要先将其转化为以数值存储的格式. 首先准备数据集: data data1; input a :$10. b :$10. ...
- transform——转换
① 位移 transform:translate(x,y); 同时x轴和y轴的位移 translate(x); 在x轴上的位移 同 translateX(x) translate ...
- Linux账号管理(入门)
引言 对用户的操作要在root权限下执行 创建用户 useradd useradd -m username:创建一个用户名为:username的用户 -m参数代表自动创建这个用户的主目录 删除用户 u ...
- YsoSerial 工具常用Payload分析之Common-Collections2、4(五)
前言 Common-Collections <= 3.2.1 对应与YsoSerial为CC1.3.5.6.7 ,Commno-collections4.0对应与CC2.4. 这篇文章结束官方原 ...
- Excel VBA活动抽奖小程序
在活动中,我们常会有抽奖,抽奖箱准备繁琐,现在多采用线上抽奖方式,下面用Excel VBA写了一个简单的抽奖小程序 简单测试效果如下,可实现: 多次抽奖,且每次抽奖都不重复 抽奖界面滚动人员信息,点击 ...
- Lateral Movement
简介 这次去宁夏护网,发现我有的朋友连最基本的横向渗透有些都不晓得,他们问我 我也表达不清楚...,就想着写篇文章总结下吧 (慢慢更..) 可以发我邮箱讨论:muxue@protonmail.com ...