Новинка NVIDIA B300 · серверы 288 ГБ HBM3e — от 4 019 $/мес. за GPU

Посмотреть B300

Документация · Контейнеры

Docker с GPU: контейнеры NVIDIA и ROCm

Контейнеры избавляют хост от необходимости хранить версии CUDA, ROCm и фреймворков. На хосте нужны драйвер GPU, Docker и — для GPU NVIDIA — NVIDIA Container Toolkit.

Обновлено 6 мин чтения

Установите Docker Engine

Установите Docker Engine из собственного репозитория Docker, как описано в документации Docker:

sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run --rm hello-world

Чтобы запускать docker без sudo, добавьте своего пользователя в группу docker (sudo usermod -aG docker $USER, затем войдите в систему снова). Членство в этой группе равносильно root-доступу на сервере, поэтому давайте его только тем, у кого уже есть sudo.

Установка NVIDIA Container Toolkit

Этот инструмент позволяет контейнерам использовать драйвер NVIDIA хоста. Сначала установите драйвер на хосте (Драйверы NVIDIA и CUDA); тогда контейнерам не нужен собственный драйвер.

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update
sudo apt install -y nvidia-container-toolkit

sudo nvidia-ctk runtime configure --runtime=docker   # добавляет runtime nvidia в /etc/docker/daemon.json
sudo systemctl restart docker

sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

Выберите GPU для каждого контейнера:

docker run --rm --gpus all ubuntu nvidia-smi -L
docker run --rm --gpus '"device=0,1"' ubuntu nvidia-smi -L   # только GPU 0 и 1

Этот инструмент монтирует библиотеки драйвера хоста внутрь контейнера, поэтому версия CUDA внутри образа должна поддерживаться драйвером хоста (версия CUDA, которую показывает nvidia-smi). Подробности установки: руководство по NVIDIA Container Toolkit.

Образы NVIDIA NGC

Каталог NGC от NVIDIA публикует образы для PyTorch, Triton Inference Server, TensorRT-LLM и других инструментов, с тегами по релизам (YY.MM). Публичные образы скачиваются без аккаунта.

docker pull nvcr.io/nvidia/pytorch:<yy.mm>-py3
docker run --rm -it --gpus all --ipc=host \
  --ulimit memlock=-1 --ulimit stack=67108864 \
  -v /data:/workspace/data \
  nvcr.io/nvidia/pytorch:<yy.mm>-py3

Флаг --ipc=host и два флага --ulimit — то, что NVIDIA рекомендует для своих контейнеров с фреймворками: загрузчики данных PyTorch используют разделяемую память, а значение по умолчанию в Docker — всего 64 МБ. Каждый релиз собирается под конкретную версию CUDA; перед выбором тега сверьте её со своим драйвером по таблице совместимости фреймворков. Для закрытого контента выполните docker login nvcr.io, указав в качестве имени пользователя $oauthtoken и API-ключ NGC в качестве пароля.

Контейнеры ROCm на MI355X

Контейнерам ROCm не нужен дополнительный runtime: достаточно передать устройства AMD. Сначала установите драйвер ядра на хосте (ROCm на MI355X).

docker run -it --rm \
  --device=/dev/kfd --device=/dev/dri \
  --group-add video --ipc=host \
  --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
  -v /data:/data \
  rocm/pytorch:latest

Чтобы ограничить контейнер отдельными GPU, вместо /dev/dri передавайте конкретные render-узлы (--device=/dev/dri/renderD128 и так далее). Container Toolkit от AMD делает это сопоставление за вас: установите пакет amd-container-toolkit из репозитория AMD, выполните sudo amd-ctk runtime configure, перезапустите Docker, а затем выбирайте GPU по индексу:

docker run --rm --runtime=amd -e AMD_VISIBLE_DEVICES=0,1 rocm/dev-ubuntu-24.04 amd-smi list

На MI355X используйте образы, собранные для ROCm 7.0 или новее.

GPU в Docker Compose

Compose резервирует GPU NVIDIA через deploy.resources. Этот файл запускает vLLM на всех GPU, с кэшем модели на NVMe и API, опубликованным только на localhost:

# compose.yaml
services:
  vllm:
    image: vllm/vllm-openai:latest
    command: ["--model", "Qwen/Qwen3-4B", "--max-model-len", "8192"]
    environment:
      - VLLM_API_KEY=${VLLM_API_KEY}
      - HF_TOKEN=${HF_TOKEN}
    volumes:
      - /data/hf:/root/.cache/huggingface
    ports:
      - "127.0.0.1:8000:8000"
    ipc: host
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all          # или: device_ids: ["0", "1"]
              capabilities: [gpu]
export VLLM_API_KEY=$(openssl rand -hex 32)
docker compose up -d
docker compose logs -f vllm

count и device_ids взаимно исключают друг друга, а capabilities обязателен (поддержка GPU в Compose). На MI355X вместо этого указывайте устройства:

services:
  rocm:
    image: rocm/pytorch:latest
    command: sleep infinity
    devices:
      - /dev/kfd
      - /dev/dri
    group_add:
      - video
    ipc: host
    cap_add:
      - SYS_PTRACE
    security_opt:
      - seccomp=unconfined
    volumes:
      - /data:/data

Храните данные и образы на локальном NVMe

Контейнеры одноразовые; ваши данные не должны храниться внутри них. Монтируйте каталоги с NVMe-диска для данных (см. Хранилище и данные) и держите там же кэши моделей:

docker run --rm -it --gpus all \
  -v /data/datasets:/datasets:ro \
  -v /data/checkpoints:/checkpoints \
  -v /data/hf:/root/.cache/huggingface \
  nvcr.io/nvidia/pytorch:<yy.mm>-py3

Образы и именованные тома хранятся в каталоге данных Docker, по умолчанию это /var/lib/docker. Если системный диск маленький, перенесите его на диск для данных:

sudo systemctl stop docker docker.socket
sudo mkdir -p /data/docker
sudo rsync -aHAX /var/lib/docker/ /data/docker/
sudo nano /etc/docker/daemon.json     # добавьте "data-root" и сохраните запись "runtimes"
sudo systemctl start docker
docker info --format '{{ .DockerRootDir }}'
{
  "data-root": "/data/docker",
  "runtimes": {
    "nvidia": {
      "args": [],
      "path": "nvidia-container-runtime"
    }
  }
}

Проверяйте место с помощью docker system df и очищайте с помощью docker image prune. Всё на сервере, включая тома Docker, стирается при завершении срока без продления: храните копию важных данных где-то ещё.

Порты, пользователи и файрвол

  • Docker публикует порты через собственные правила файрвола, раньше, чем трафик увидит ufw (заметки Docker о файрволе). Контейнер, запущенный с -p 8000:8000, доступен из интернета, даже если ufw блокирует порт 8000. Публикуйте порт на loopback-адресе, -p 127.0.0.1:8000:8000, а к сервису обращайтесь через SSH-туннель или обратный прокси (см. Инференс-сервер).
  • Группа docker равносильна root: кто может запускать контейнеры, может смонтировать файловую систему хоста.
  • Закрепляйте теги образов за конкретной версией, а не за latest, чтобы пересборка не меняла ваш стек без предупреждения.

Нужна помощь с этим руководством?

Расскажите нам о своём GPU, командах, которые вы выполнили, и результате, который получили, через форму обратной связи.

Личный кабинет

Войти в CryptGPU

Ваши заказы, счета и серверы в одном месте.

Новичок в CryptGPU?

Аккаунты создаются при оформлении заказа: выберите сервер и программное обеспечение, затем создайте аккаунт на шаге Аккаунт первого заказа.

Запустить сервер