如何用DockerCompose来管理GPU资源
本篇内容主要讲解“如何用Docker Compose来管理GPU资源”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用Docker Compose来管理GPU资源”吧!
10年积累的成都网站设计、成都网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有甘州免费网站建设让你可以放心的选择与我们合作。
在面向 AI
开发的大趋势下,容器化可以将环境无缝迁移,将配置环境的成本无限降低。但是,在容器中配置 CUDA
并运行 TensorFlow
一段时间内确实是个比较麻烦的时候,所以我们这里就介绍和使用它。
Enabling GPU access with Compose
Runtime options with Memory, CPUs, and GPUs
The Compose Specification
The Compose Specification - Deployment support
The Compose Specification - Build support
在 Compose 中使用 GPU 资源
如果我们部署
Docker
服务的的主机上正确安装并设置了其对应配置,且该主机上恰恰也有对应的GPU
显卡,那么就可以在Compose
中来定义和设置这些GPU
显卡了。
# 需要安装的配置$ apt-get install nvidia-container-runtime
旧版本 <= 19.03
# runtime$ docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
新版本 >= 19.03
# with --gpus$ docker run -it --rm --gpus all ubuntu nvidia-smi# use device$ docker run -it --rm --gpus \ device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a \ ubuntu nvidia-smi# specific gpu$ docker run -it --rm --gpus '"device=0,2"' ubuntu nvidia-smi# set nvidia capabilities$ docker run --gpus 'all,capabilities=utility' --rm ubuntu nvidia-smi
对应
Compose
工具的老版本(v2.3
)配置文件来说的话,想要在部署的服务当中使用GPU
显卡资源的话,就必须使用runtime
参数来进行配置才可以。虽然可以作为运行时为容器提供GPU
的访问和使用,但是在该模式下并不允许对GPU
设备的特定属性进行控制。
services: test: image: nvidia/cuda:10.2-base command: nvidia-smi runtime: nvidia environment: - NVIDIA_VISIBLE_DEVICES=all
在
Compose v1.28.0+
的版本中,使用Compose Specification
的配置文件写法,并提供了一些可以更细粒度的控制GPU
资源的配置属性可被使用,因此可以在启动的时候来精确表达我们的需求。咳咳咳,那这里我们就一起看看吧!
capabilities
- 必须字段指定需要支持的功能;可以配置多个不同功能;必须配置的字段
man 7 capabilities
deploy: resources: reservations: devices: - capabilities: ["gpu"]
count
指定需要使用的
GPU
数量;值为int
类型;与device_ids
字段二选一
deploy: resources: reservations: devices: - capabilities: ["tpu"] count: 2
device_ids
指定使用
GPU
设备ID
值;与count
字段二选一
deploy: resources: reservations: devices: - capabilities: ["gpu"] device_ids: ["0", "3"]
deploy: resources: reservations: devices: - capabilities: ["gpu"] device_ids: ["GPU-f123d1c9-26bb-df9b-1c23-4a731f61d8c7"]
driver
指定
GPU
设备驱动类型
deploy: resources: reservations: devices: - capabilities: ["nvidia-compute"] driver: nvidia
options
指定驱动程序的特定选项
deploy: resources: reservations: devices: - capabilities: ["gpu"] driver: gpuvendor options: virtualization: false
咳咳咳,看也看了,说也说了,那我们就简单的编写一个示例文件,让启动的 cuda
容器服务来使用一个 GPU
设备资源,并运行得到如下输出。
services: test: image: nvidia/cuda:10.2-base command: nvidia-smi deploy: restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s resources: limits: cpus: "0.50" memory: 50M reservations: cpus: "0.25" memory: 20M devices: - driver: nvidia count: 1 capabilities: [gpu, utility] update_config: parallelism: 2 delay: 10s order: stop-first
注意这里,如果设置
count: 2
的话,就会下面的输出中看到两块显卡设置的信息。如果,我们这里均未设置count
或device_ids
字段的话,则默认情况下将主机上所有GPU
一同使用。
# 前台直接运行$ docker-compose up Creating network "gpu_default" with the default driver Creating gpu_test_1 ... doneAttaching to gpu_test_1 test_1 | +-----------------------------------------------------------------------------+ test_1 | | NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.1 | test_1 | |-------------------------------+----------------------+----------------------+ test_1 | | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | test_1 | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | test_1 | | | | MIG M. | test_1 | |===============================+======================+======================| test_1 | | Tesla T4 On | 00000000:00:1E.0 Off | | test_1 | | N/A 23C P8 9W / 70W | MiB / 15109MiB | % Default | test_1 | | | | N/A | test_1 | +-------------------------------+----------------------+----------------------+ test_1 | test_1 | +-----------------------------------------------------------------------------+ test_1 | | Processes: | test_1 | | GPU GI CI PID Type Process name GPU Memory | test_1 | | ID ID Usage | test_1 | |=============================================================================| test_1 | | No running processes found | test_1 | +-----------------------------------------------------------------------------+ gpu_test_1 exited with code
当然,如果设置了
count
或device_ids
字段的话,就可以在容器里面的程序中使用多块显卡资源了。可以通过以下部署配置文件来进行验证和使用。
services: test: image: tensorflow/tensorflow:latest-gpu command: python -c "import tensorflow as tf;tf.test.gpu_device_name()" deploy: resources: reservations: devices: - driver: nvidia device_ids: ["0", "3"] capabilities: [gpu]
运行结果,如下所示,我们可以看到两块显卡均可以被使用到。
# 前台直接运行$ docker-compose up ... Created TensorFlow device (/device:GPU:0 with 13970 MB memory -> physical GPU (device: 0, name: Tesla T4, pci bus id: 0000:00:1b.0, compute capability: 7.5)...Created TensorFlow device (/device:GPU:1 with 13970 MB memory) -> physical GPU (device: 1, name: Tesla T4, pci bus id: 0000:00:1e.0, compute capability: 7.5) ... gpu_test_1 exited with code
http://cdiso.cn/article/pipoie.html