巧用 Docker Compose 管理 GPU 資源

2021-12-28 奇妙的Linux世界

在容器中使用 GPU 一直是使用 Compose 的一個痛點!


在面向 AI 開發的大趨勢下,容器化可以將環境無縫遷移,將配置環境的成本無限降低。但是,在容器中配置 CUDA 並運行 TensorFlow 一段時間內確實是個比較麻煩的時候,所以我們這裡就介紹和使用它。

Enabling GPU access with ComposeRuntime options with Memory, CPUs, and GPUsThe Compose SpecificationThe Compose Specification - Deployment supportThe Compose Specification - Build support

在 Compose 中使用 GPU 資源

如果我們部署 Docker 服務的的主機上正確安裝並設置了其對應配置,且該主機上恰恰也有對應的 GPU 顯卡,那麼就可以在 Compose 中來定義和設置這些 GPU 顯卡了。
# 需要安裝的配置
$ apt-get install nvidia-container-runtime

# runtime
$ docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

# 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 資源的配置屬性可被使用,因此可以在啟動的時候來精確表達我們的需求。咳咳咳,那這裡我們就一起看看吧!

指定需要支持的功能;可以配置多個不同功能;必須配置的欄位
deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["gpu"]

指定需要使用的GPU數量;值為int類型;與device_ids欄位二選一
deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["tpu"]
          count: 2

deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["gpu"]
          device_ids: ["0", "3"]

deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["gpu"]
          device_ids: ["GPU-f123d1c9-26bb-df9b-1c23-4a731f61d8c7"]

deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["nvidia-compute"]
          driver: nvidia

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 ... done
Attaching 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  | |   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
test_1  | | N/A   23C    P8     9W /  70W |      0MiB / 15109MiB |      0%      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 0

當然,如果設置了 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 0

本文轉載自:「 Ecsape 的博客 」,原文:http://t.cn/A6c6d4l1 ,版權歸原作者所有。歡迎投稿,投稿郵箱: editor@hi-linux.com。

相關焦點

  • 教程 | Docker Compose + GPU + TensorFlow 所產生的奇妙火花
    Docker Compose超級有用的實用程序,允許你在文件中存儲 docker run 配置,並更輕鬆地管理應用程式狀態。儘管它的設計目的是組合多個 docker 容器,但 docker compose 在你只有一個服務的時候依然非常有用。
  • Docker集群管理之Docker Compose
    前言:在上一篇《Docker集群管理之Docker Machine》中,我們通過源碼分析了解了Docker Machine的工作原理,使用者可以通過Docker Machine的一條命令在任意支持的平臺創建一個Docker主機,並能集中管理這些主機。Docker主機創建好之後,接下來就該考慮Docker容器部署的問題了。
  • Docker再體驗之Docker Compose,及它與Kubernetes的區別
    具體的如圖,簡單點說,Docker Compose是單機管理Docker的,Kubernetes是多節點管理Docker的。雖然Docker Swarm也是多節點管理,但基本已棄用,了解一下就好了。安裝Docker Compose接上一篇的例子,安裝Docker Compose,並進行賦權和檢驗。
  • docker-compose是個好東西,越用越香
    這次記錄我在工作中利用 docker-compose部署企業級web應用。本文會講述企業級示例項目中用到的 docker volume、docker network、redis、sqlite、docker HealthCheck 等相關知識,忽略CentOS基本操作、Linux 下安裝Docker、docker compose工具, Linux安裝Redis等前置知識點。
  • 雲計算核心技術Docker教程:Docker Compose指定單個compose文件
    docker-compose可以使用該-f標誌通過命令行或通過在外殼程序或環境文件中設置COMPOSE_FILE環境變量來指定不在當前目錄中的Compose文件的路徑。
  • 雲計算核心技術Docker教程:docker-compose命令up,run以及start...
    通常,您需要docker-compose up。使用up啟動或重新啟動所有定義的服務docker-compose.yml。該docker-compose up命令匯總每個容器的輸出(本質上是docker-compose logs -f)。當命令退出時,所有容器都將停止。
  • 雲計算核心技術Docker教程:docker-compose up命令介紹
    在下載安裝Docker Compose後通過創建 Dockerfile 文件就可以使用Docker Compose命令構建和啟動應用了,本文主要介紹docker-compose up命令。命令格式:docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
  • 雲計算核心技術Docker教程:docker-compose 常用命令介紹
    在下載安裝Docker Compose後通過創建 Dockerfile 文件就可以使用Docker Compose命令構建和啟動應用了,本文主要介紹docker-compose的常用命令。1.重啟項目中的服務。
  • 雲計算核心技術Docker教程:Docker Compose run命令詳解
    docker-compose run web bash您使用的命令run從具有由服務定義的配置的新容器中啟動,包括卷,連結和其他詳細信息。但是,有兩個重要的區別。首先,通過的命令將run覆蓋服務配置中定義的命令。
  • 雲計算核心技術Docker教程:Compose使用
    2.使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起運行。3.最後,執行 docker-compose up 命令來啟動並運行整個應用程式。運行以下命令以下載 Docker Compose 的當前穩定版本:$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local
  • 雲計算核心技術Docker教程:Docker Compose up命令詳解
    --force-recreate 強制重新創建compose服務,即使沒有任何改變。重新創建後啟動容器--always-recreate-deps 創建容器的依賴。不兼容——no-recreate。--no-recreate 如果容器已經存在,不重新創建.--no-build 不創建重啟,即使鏡像不存在.
  • 雲計算核心技術Docker教程:Docker Compose編寫CLI環境變量
    如果使用docker-machine,則eval "$(docker-machine env my-docker-vm)"命令應將它們設置為正確的值。(在此示例中,my-docker-vm是您創建的計算機的名稱。)COMPOSE_PROJECT_NAME設置項目名稱。啟動時,此值與服務名稱一起添加到容器中。
  • 雲計算核心技術Docker教程:Docker Compose的pull和push命令詳解
    Docker-Compose pull命令可以拉取docker-compose.yml或者docker-stack.yml文件中定義的服務關聯的鏡像,Docker-Compose push命令可以將服務鏡像推送到registry/repository中。
  • 雲計算核心技術Docker教程:docker Stack介紹
    Docker在進行多服務部署和管理時通常會使用Docker Stack來解決大規模部署管理問題,Docker引擎在1.12 版本集成了Docker Swarm, 內置新的容器編排工具docker stack,通過提供期望狀態、滾動升級、簡單易用、擴縮容、健康檢查等特性簡化了應用的管理
  • 如何用docker-compose安裝mongo並實現授權登錄和初始化數據
    我們在使用docker-compose安裝mongo的時候,有時需要實現:1、遠程授權登錄;2、資料庫初始化的時候需要初始化一些數據;那麼如何實現上述功能呢?一、準備1.1 建立對應的目錄結構1.2 我們把上述目錄建立在data目錄中mkdir /data創建docker-compose.yml文件
  • Docker Compose 1.21.0 發布,多容器應用編排
    新版本帶來了一些新特性,以及 bug 修復:Compose file version 2.4Introduced version 2.4 of the docker-compose.yml specification.
  • 雲計算核心技術Docker教程:Docker Compose的start和stop命令詳解
    例如Docker-Compose啟動nginx容器docker-compose start nginx語法格式Usage: stop [options] [SERVICE...]Options:-t, --timeout TIMEOUT 指定一個關閉超時在幾秒鐘內。
  • Docker中部署TensorFlow GPU
    在docker中部署的好處在於,可以不用管driver,cuda,cudnn以及tensorflow版本之間的依賴關係,只需要gpu的driver安裝好,就可以了。幾臺工作站,每次這些依賴關係搞得頭大。
  • 雲計算核心技術Docker教程:Docker Compose yml常用配置指令簡介
    Docker Compose 默認使用文件名 docker-compose.yml,例如以下就是一個docker-compose.yml文件示例:version:指定本 yml 依從的 compose 哪個版本制定的services:用於定義不同的應用服務,上例中分別定義了兩個服務
  • 【MongoDB】Docker-compose搭建MongoDB單機與副本集集群
    uname -adocker -vdocker-compose --version