Enabling GPUs in the Container Runtime Ecosystem

Docker 容器不会自动看到您系统的 GPU。这会导致依赖 GPU 的工作负载(例如机器学习框架)的性能降低。以下是将主机的 NVIDIA GPU 公开给容器的方法。

让 GPU 在 Docker 中工作
Docker 容器共享您主机的内核,但带有自己的操作系统和软件包。这意味着它们缺少用于与 GPU 交互的 NVIDIA 驱动程序。默认情况下,Docker 甚至不会向容器添加 GPU,因此docker run根本看不到您的硬件。

概括地说,让 GPU 工作是一个两步过程:在images中安装驱动程序,然后指示 Docker 在运行时将 GPU 设备添加到容器中。

查看linux是否有gpu机器

lspci | grep -i nvidia

查看 NVIDIA 驱动 是否安装

nvidia-smi

如果Docker主机包含这样的设备,并且Docker Daemon也被相应地设置,则Compose服务可以定义GPU设备预留!

1.先决条件

安装NVIDIA-容器-运行时: 遵循(https://nvidia.github.io/nvidia-container-runtime/)上的说明,然后运行以下命令:

$ apt-get install nvidia-container-runtime

确保nvidia-container-runtime-hook可从访问$PATH.

$ which nvidia-container-runtime-hook

Expose GPUs for use:

当你启动一个容器来访问GPU资源时,包括 --GPU 标志。指定要使用多少个gpu,例如:

docker run -it --rm --gpus all ubuntu nvidia-smi				暴露 Exposes 所有可用的gpu
docker run -it --rm --gpus device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a ubuntu nvidia-smi        使用device选项指定gpu
docker run -it --rm --gpus '"device=0,2"' ubuntu nvidia-smi		暴露 Exposes 特定的GPU(暴露第一个和第三个gpu)

Note: NVIDIA GPUs只能由运行单引擎的系统访问
设置NVIDIA功能:

docker run --gpus 'all,capabilities=utility' --rm ubuntu nvidia-smi	   

这启用utility驱动程序功能,增加了nvidia-smi工具放入容器

2.配置daemon.json

vim /etc/docker/daemon.json

{
    
    
    "default-runtime": "nvidia",
    "runtimes": {
    
    
        "nvidia": {
    
    
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

3.编写配置文件

vi docker-compose.yaml
version: "3.7"
services:
#执照
  服务名:
    image: 镜像文件名称
    container_name: business-zhizhao-ocr
    command: [ "sh", "-c","./bin/docker_run.sh" ]
    #network_mode: "host"
    ports:
      - 8000:8000
    restart: always
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: "all"
              capabilities: [gpu]

下面几节中的例子特别关注使用Docker Compos提供对GPU设备的服务容器访问:

[1] 使用Compose v2.3格式的服务运行时属性 (legacy)

Docker Compose v1.27.0+切换到使用Compose规范模式,这是2.x和3.x版本所有属性的组合。这重新启用了服务属性作为运行时来提供对服务容器的GPU访问。但是这并不允许对GPU设备的特定属性进行控制。

services:
  test:
    image: nvidia/cuda:10.2-base
    command: nvidia-smi
    runtime: nvidia

[2] 启用GPU访问服务容器

Docker Compose v1.28.0+ 允许使用Compose规范中定义的 device 结构定义GPU预留。这为GPU预留提供了更细粒度的控制,因为可以为以下设备属性设置自定义值:

capabilities   值指定为字符串列表(例如capabilities: [gpu]).您必须在合成文件中设置此字段。否则它会返回一个服务部署错误。
count  	       value指定为int值或value的值all表示应该保留的GPU设备的数量(如果主机拥有这个数量的gpu)
device_ids     指定为代表主机中GPU设备id的字符串列表的值。设备ID可以在主机上nvidia-smi的输出信息中找到。
driver   	   指定为字符串的值(例如driver: 'nvidia')
options        代表驱动程序特定选项的键值对

您必须设置 capabilities 字段。否则它会返回一个服务部署错误。count和device_ids是相互排斥的。一次只能定义一个字段。
运行一个访问1个GPU设备的服务的Compose文件示例:

services:
  test:
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

如果没有设置count或device_ids,默认情况下将使用主机上所有可用的gpu。

services:
···
          devices:
            - capabilities: [gpu]

在托管多个GPU的机器上:
device_ids字段可以设置为针对特定的GPU设备。 count可用于限制分配给服务容器的GPU设备的数量。如果count超过主机上可用的GPU数量,部署将出错。

      devices:
      - driver: nvidia
        device_ids: ['0', '3']
        capabilities: [gpu]

[3] 参数说明

devices
devices配置容器可以使用的设备的预留。它包含一个预订列表,每个预订都被设置为一个对象,具有以下参数 capabilities, driver, count, device_ids和options
使用capabilities列表来保留设备,使得capabilities唯一的必填字段。device必须满足成功预留所需的所有能力。

1.capabilities

capabilities设置为字符串列表,表示通用和驱动程序特定的功能。以下是目前公认的通用功能:
gpu: 图形加速器
tpu: 人工智能加速器
为了避免名称冲突,特定于驱动程序的功能必须以驱动程序名称作为前缀。例如,保留一个支持nVidia cuda的加速器可能是这样的:

  devices:
    - capabilities: ["nvidia-compute"]

2.driver

可以使用驱动程序字段请求预留设备的不同驱动程序。该值以字符串形式指定。

3.count

如果count被设置为all或未指定,Compose实现必须保留满足请求功能的所有设备。否则,Compose实现必须至少保留指定的设备数量。该值以整数形式指定。

4.device_ids

如果设置了device_ids, Compose实现必须保留具有指定id的设备,前提是它们满足所请求的功能。该值以字符串列表的形式指定。

5.options

特定于驱动程序的选项可以通过options作为键值对

  devices:
    - capabilities: ["gpu"]
      driver: gpuvendor
      options:
        virtualization: false

Whether you think you can or you don’t, you are right

猜你喜欢

转载自blog.csdn.net/qq_50573146/article/details/128356114