Cách chạy Docker Soạn vùng chứa với quyền truy cập GPU

[ad_1]

Quyền truy cập GPU trong Docker cho phép bạn chứa các khối lượng công việc yêu cầu cao như các ứng dụng máy học. GPU không tự động có sẵn khi bạn bắt đầu một vùng chứa mới nhưng chúng có thể được kích hoạt bằng --gpus cờ cho docker run hoặc bằng cách thêm các trường bổ sung vào một docker-compose.yml tập tin.

Trong bài viết này, chúng tôi sẽ hướng dẫn cách bật hỗ trợ GPU trong Docker Compose. Bạn sẽ cần phiên bản Docker Compose v1.28 hoặc mới hơn để làm theo hướng dẫn. GPU không được hỗ trợ trong các phiên bản Soạn v1.18 trở lên; các bản phát hành giữa v1.19 và v1.27 sử dụng cấu trúc trường kế thừa cung cấp ít quyền kiểm soát hơn.

Chuẩn bị hệ thống của bạn

Máy chủ Docker của bạn cần được chuẩn bị trước khi nó có thể làm lộ phần cứng GPU của bạn. Mặc dù các vùng chứa chia sẻ hạt nhân của máy chủ lưu trữ của bạn, nhưng chúng không thể thấy các gói hệ thống mà bạn đã cài đặt. Một vùng chứa đơn giản sẽ thiếu các trình điều khiển thiết bị giao tiếp với GPU của bạn.

Bạn có thể kích hoạt hỗ trợ cho GPU NVIDIA bằng cách cài đặt Bộ công cụ vùng chứa Docker của NVIDIA:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) 
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - 
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update
sudo apt install -y nvidia-docker2
sudo systemctl restart docker

Gói này kết thúc thời gian chạy vùng chứa của Docker với một giao diện với trình điều khiển NVIDIA của máy chủ lưu trữ của bạn. Kiểm tra của bạn /etc/docker/daemon.json tệp sẽ xác nhận rằng thời gian chạy vùng chứa được định cấu hình đã được thay đổi. Bộ công cụ NVIDIA sẽ xử lý việc đưa các kết nối thiết bị GPU vào khi các bộ chứa mới bắt đầu. Sau đó, nó sẽ chuyển giao cho thời gian chạy vùng chứa thông thường của bạn.

$ cat /etc/docker/daemon.json
và}#13;
    "runtimes": và}#13;
        "nvidia": và}#13;
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

Chuẩn bị hình ảnh của bạn

Quyền truy cập GPU trong Docker cũng dựa vào hình ảnh vùng chứa của bạn được định cấu hình chính xác. Thông thường, việc căn cứ hình ảnh của bạn vào một biến thể của nvidia/cuda. Điểm khởi đầu do NVIDIA cung cấp này được định cấu hình sẵn với hỗ trợ CUDA. Cài đặt bất kỳ ngôn ngữ lập trình nào bạn cần, sau đó sao chép mã phụ thuộc vào GPU của bạn:

FROM nvidia/cuda:11.4.0-base-ubuntu20.04
RUN apt update && 
  apt-get install -y python3 python3-pip &&
  pip install tensorflow-gpu

COPY tensor.py .
ENTRYPONT ["python3", "tensor.py"]

Bạn nên sử dụng cùng một phiên bản CUDA mà bạn đã cài đặt trên máy chủ của mình. Bạn có thể kiểm tra điều này bằng cách chạy nvidia-smi:

$ nvidia-smi
Tue May 10 19:15:00 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.103.01   Driver Version: 470.103.01   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
...

Giờ đây, bạn có thể viết tệp Docker Compose để bắt đầu vùng chứa của mình với tệp đính kèm GPU.

Truy cập GPU trong Docker Compose

GPU được tham chiếu trong docker-compose.yml nộp qua deploy.resources.reservations.devices trong các dịch vụ của bạn cần chúng. Cơ chế này cho phép bạn xác định GPU mà bạn muốn gắn vào. Mỗi thiết bị đã chọn sẽ được cung cấp cho các vùng chứa của bạn.

Đây là một ví dụ đơn giản bắt đầu một vùng chứa bằng cách sử dụng nvidia/cuda hình ảnh. Nó sẽ phát ra thông tin về GPU của bạn khi vùng chứa khởi động.

services:
  app:
    image: nvidia/cuda:11.4.0-base-ubuntu20.04
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: [gpu]

Các deploy.resources.reservations.devices trường chỉ định các thiết bị mà vùng chứa của bạn có thể sử dụng. Đặt driver đến nvidia và thêm gpu khả năng xác định một thiết bị GPU.

Chạy docker-compose up (hoặc docker compose up cho Soạn v2) để bắt đầu vùng chứa của bạn:

$ docker compose up
Creating network "scratch_default" with the default driver
Creating scratch_app_1 ... done
Attaching to scratch_app_1
app_1  | Tue May 10 14:21:14 2022       
app_1  | +-----------------------------------------------------------------------------+
app_1  | | NVIDIA-SMI 470.103.01   Driver Version: 470.103.01   CUDA Version: 11.4     |
app_1  | |-------------------------------+----------------------+----------------------+

Vùng chứa sẽ có được quyền truy cập thành công vào GPU của bạn. Phiên bản trình điều khiển và CUDA sẽ khớp với những phiên bản được cài đặt trên máy chủ của bạn.

Sử dụng nhiều GPU

Vùng chứa của bạn nhận được quyền truy cập vào tất cả các GPU trong hệ thống của bạn trừ khi được cung cấp thêm cấu hình. Có hai cách khác nhau để truy cập một tập hợp con các thiết bị GPU của bạn.

Truy cập một số lượng thiết bị cố định

Các count trường dự trữ một số lượng thiết bị được chỉ định. Trong ví dụ này, một hệ thống có hai GPU sẽ cung cấp một trong số chúng cho vùng chứa. Nó là tùy ý mà cái nào sẽ được chọn.

services:
  app:
    image: nvidia/cuda:11.4.0-base-ubuntu20.04
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

Truy cập các thiết bị cụ thể

Bạn có thể xác định các thiết bị riêng lẻ trong hệ thống của mình bằng cách sử dụng device_ids đồng ruộng. Điều này chấp nhận một mảng các ID thiết bị được lập chỉ mục 0 để cung cấp cho vùng chứa. Bạn có thể tìm thấy các ID này bằng cách liệt kê các GPU của mình với nvidia-smi:

$ nvidia-smi --list-gpus
GPU 0: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-5ba4538b-234f-2c18-6a7a-458d0a7fb348)
GPU 1: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-d5ce9af3-710c-4222-95f8-271db933d438)
GPU 2: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-50d4eb4f-7b08-4f8f-8d20-27d797fb7f19)
GPU 3: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-bed2d40a-c6e7-4547-8d7d-a1576c5247b2)

Để truy cập đáng tin cậy vào hai thiết bị cuối cùng trong danh sách, hãy bao gồm ID thiết bị của chúng trong cấu hình dịch vụ của bạn:

services:
  app:
    image: nvidia/cuda:11.4.0-base-ubuntu20.04
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["2", "3"]
              capabilities: [gpu]

Bạn có thể dùng count hoặc device_ids trong mỗi định nghĩa dịch vụ của bạn. Bạn sẽ gặp lỗi khi chạy docker-compose up nếu bạn cố gắng kết hợp cả hai, hãy chỉ định ID thiết bị không hợp lệ hoặc sử dụng giá trị count cao hơn số lượng GPU trong hệ thống của bạn.

Bản tóm tắt

Bản phát hành Docker Compose hiện đại hỗ trợ truy cập GPU thông qua deploy.resources tính năng đặt trước thiết bị. Bạn vẫn chịu trách nhiệm chuẩn bị môi trường máy chủ của mình và sử dụng hình ảnh vùng chứa hỗ trợ GPU. Sau khi điều đó được chăm sóc, chạy docker-compose up -d đơn giản hơn là nhớ bao gồm --gpus all gắn cờ mỗi khi bạn sử dụng docker run.

Bạn có thể cam kết của bạn docker-compose.yml tệp vào kiểm soát nguồn để mọi người đều có quyền truy cập GPU tự động. Bạn nên đảm bảo rằng bạn chuẩn hóa các phiên bản nhất quán của trình điều khiển NVIDIA, vì bản phát hành được sử dụng bởi hình ảnh của bạn cần phải phù hợp với bản phát hành được cài đặt trên máy chủ của bạn. Trong tương lai, hỗ trợ GPU của Docker cũng có thể hoạt động với các thiết bị Intel và AMD nhưng cố gắng sử dụng nó ngay hôm nay sẽ dẫn đến lỗi. NVIDIA là nhà cung cấp GPU duy nhất hiện được hỗ trợ bởi dự án Moby.



[ad_2]

Đánh giá dịch vụ post
Chat Zalo
0979106855