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设备预留!
安装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工具放入容器
vim /etc/docker/daemon.json
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
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设备的服务容器访问:
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
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]
devices
devices配置容器可以使用的设备的预留。它包含一个预订列表,每个预订都被设置为一个对象,具有以下参数 capabilities, driver, count, device_ids和options
使用capabilities列表来保留设备,使得capabilities唯一的必填字段。device必须满足成功预留所需的所有能力。
capabilities设置为字符串列表,表示通用和驱动程序特定的功能。以下是目前公认的通用功能:
gpu: 图形加速器
tpu: 人工智能加速器
为了避免名称冲突,特定于驱动程序的功能必须以驱动程序名称作为前缀。例如,保留一个支持nVidia cuda的加速器可能是这样的:
devices:
- capabilities: ["nvidia-compute"]
可以使用驱动程序字段请求预留设备的不同驱动程序。该值以字符串
形式指定。
如果count被设置为all或未指定,Compose实现必须保留满足请求功能的所有设备。否则,Compose实现必须至少保留指定的设备数量。该值以整数形式指定。
如果设置了device_ids, Compose实现必须保留具有指定id的设备,前提是它们满足所请求的功能。该值以字符串列表的形式指定。
特定于驱动程序的选项可以通过options作为键值对
devices:
- capabilities: ["gpu"]
driver: gpuvendor
options:
virtualization: false
Whether you think you can or you don’t, you are right