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

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

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

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

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

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

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

  1. [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卡

  1. [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卡

  1. [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卡。

测试:

  1. [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. [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

  1. [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多个显卡不生效的问题解决和代码示例的更多相关文章

  1. Docker run 命令的使用方法

    [编者的话]在Docker中,run应该是用户使用最多的命令了,很多读者反馈不是很明白run命令的用法,而且相关的书籍.中文资料中对run命令的描述也不是非常完整,所以DockerOne组织翻译了Do ...

  2. Docker run 命令参数及使用

    Docker run 命令参数及使用 Docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTI ...

  3. docker run命令运行以及参数详解

    命令格式: -a, --attach=[] 登录容器(必须是以docker run -d启动的容器) -w, --workdir="" 指定容器的工作目录 -c, --cpu-sh ...

  4. Docker(12)- docker run 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 创建一个新的容器并运行一个 ...

  5. 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 ...

  6. Docker run 命令

    docker run -d -p 8084:80 --name weather --restart always --link fme-postgis 192.168.1.220:5000/weath ...

  7. Docker run命令参数整理

    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, - ...

  8. 执行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. ...

  9. Docker学习总结之Run命令介绍

    Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...

随机推荐

  1. 【用例】编写App测试用例的关注点

    编写App测试用例的关注点 如何做到测试用例的百分百覆盖一直是测试用例编写过程中的难点,首先在测试时我们经常会遇见一些常见的bug,那么我们可以在编写测试用例时考虑到这些点.    一:关于业务逻辑 ...

  2. Mysql命令语句

    常用的管理命令 SHOW DATABASES;    //显示当前服务器下所有的数据库 USE 数据库名称;          //进入指定的数据 show tables;              ...

  3. java中 字符串的构造方法和直接创建

    java.long.String类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现.(程序当中所有的双引号字符串,都是String类的对象[没 ...

  4. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件

    精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件 内容简介:本文介绍 Spring Boot 的配置文件和配置管理,以及介绍了三种读取配置文 ...

  5. Java面向对象15——内部类

    内部类(了解) 成员内部类  package oop.demon01.demon10; ​ public class Outer { ​     private int id = 10;     pu ...

  6. Android开发音视频方向学习路线及资源分享,学完还怕什么互联网寒冬?

    接触Android音视频这一块已经有一段时间了,跟普通的应用层开发相比,的确更花费精力.期间为了学习音视频的录制,编码,处理也看过大大小小的几十个项目.总体感觉就是知识比较零散,对刚入门的朋友比较不友 ...

  7. 字节跳动、快手等大厂Android面试刨根问底之内存泄露篇

    现在快手字节跳动等公司都在大量招人,薪资优厚,但是想进去却没那么简单,面过的人都知道,这些公司的面试官巴不得把你会的东西都给你挖出来,所以要深入复习知识点,让自己耐问一点.一下是针对内存泄露真实面试过 ...

  8. Android音视频开发(1):H264 基本原理

    前言 H264 视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的.随着 x264/openh264 以及 ffmpeg 等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大 ...

  9. 了解CSS in JS(JSS)以及在React项目中配置并使用JSS

    目录 认识JSS 什么是JSS JSS 的常见实现 JSS 的好处与坏处 好处 坏处 使用模块化CSS实现JSS 安装插件 在React项目中的tsconfig.json中添加配置 vscode项目中 ...

  10. putty编译过程

    在Win7上用Visual Studio编译putty源代码. 安装vs2005,只安装c++和.net framework sdk即可: 将putty-src.zip解压到e:\MyDoc\VSPr ...