Фаза 00 · урок 07

Docker для AI

Цель урока: Вы обучили модель на ноутбуке с PyTorch 2.3, CUDA 12.4 и Python 3.12. У вашего коллеги установлены PyTorch 2.1, CUDA 11.8 и Python 3.10. На его компьютере модель аварийно завершается. Ваш Dockerfile работает на обеих машинах.

Текущий релиз AlexBred.com: первые 100 уроков русскоязычной программы.

Курс
AI Engineering from Scratch
Фаза
Настройка и инструменты
Чтение
11 мин.
Проверено
Содержание урока
  1. Цели обучения
  2. Проблема
  3. Концепция
  4. Почему AI-проектам Docker нужен сильнее, чем большинству других
  5. Основные термины
  6. Распространённые шаблоны контейнеров в AI
  7. Собираем сами
  8. Шаг 1. Установите Docker
  9. Шаг 2. Установите NVIDIA Container Toolkit — Linux с GPU NVIDIA
  10. Шаг 3. Разберитесь с базовыми образами
  11. Шаг 4. Напишите Dockerfile для разработки AI
  12. Шаг 5. Подключение томов для данных и моделей
  13. Шаг 6. Docker Compose для многосервисных AI-приложений
  14. Шаг 7. Полезные команды Docker для работы с AI
  15. Используем готовое
  16. Нет GPU?
  17. Упражнения
  18. Ключевые термины

Контейнеры оставляют фразу «на моей машине работает» в прошлом.

Тип: Практика Языки: Docker Предварительные требования: Фаза 0, уроки 01 и 03 Время: около 60 минут

Цели обучения

  • Собрать из Dockerfile образ с поддержкой GPU, CUDA, PyTorch и AI-библиотеками.
  • Подключать каталоги хоста как тома, чтобы сохранять модели, наборы данных и код между пересборками контейнера.
  • Настроить NVIDIA Container Toolkit для предоставления контейнерам доступа к GPU.
  • Оркестрировать многосервисные AI-приложения — сервер инференса и векторную базу данных — с помощью Docker Compose.

Проблема

Вы обучили модель на ноутбуке с PyTorch 2.3, CUDA 12.4 и Python 3.12. У вашего коллеги установлены PyTorch 2.1, CUDA 11.8 и Python 3.10. На его компьютере модель аварийно завершается. Ваш Dockerfile работает на обеих машинах.

Проекты AI — настоящий кошмар зависимостей. Типичный стек включает Python, PyTorch, драйверы CUDA, cuDNN, системные библиотеки C и специализированные пакеты вроде flash-attn, которым нужны точные версии компиляторов. Docker упаковывает всё это в единый образ, одинаково работающий в любой среде.

Концепция

Docker объединяет ваш код, среду выполнения, библиотеки и системные инструменты в изолированную единицу — контейнер. Его можно представить как лёгкую виртуальную машину, но вместо запуска собственного ядра ОС контейнер использует ядро хост-системы. Поэтому он запускается за секунды, а не минуты.

Диаграмма к уроку «Docker для AI»

Почему AI-проектам Docker нужен сильнее, чем большинству других

  1. Драйверы GPU хрупки. Код для CUDA 12.4 не работает на CUDA 11.8. Docker изолирует набор инструментов CUDA внутри контейнера, одновременно предоставляя ему драйвер GPU хоста через NVIDIA Container Toolkit.

  2. Веса моделей велики. Модель с 7 миллиардами параметров занимает 14 ГБ в формате fp16. Вам не захочется скачивать её заново после каждой пересборки. Тома Docker позволяют подключить каталог моделей с хоста.

  3. Многосервисные архитектуры встречаются часто. Реальное AI-приложение — не один скрипт Python. Оно включает сервер инференса, векторную базу данных для RAG и, возможно, веб-интерфейс. Docker Compose оркестрирует все эти компоненты одной командой.

Основные термины

Термин Значение
Образ (image) Шаблон только для чтения — ваш рецепт; собирается из Dockerfile
Контейнер (container) Запущенный экземпляр образа — ваша кухня
Dockerfile Поуровневые инструкции для сборки образа
Том (volume) Постоянное хранилище, переживающее перезапуски контейнера
docker-compose Инструмент описания многоконтейнерных приложений в YAML

Распространённые шаблоны контейнеров в AI

Контейнер разработки
  Полный набор инструментов. Поддержка редактора. Jupyter. Средства отладки.
  Используется во время разработки и экспериментов.

Контейнер обучения
  Минимальный. Только скрипт обучения и зависимости.
  Работает в GPU-кластерах. Без редактора и Jupyter.

Контейнер инференса
  Оптимизирован для обслуживания запросов. Небольшой образ. Быстрый холодный запуск.
  Работает за балансировщиком нагрузки в продакшене.

Собираем сами

Шаг 1. Установите Docker

# macOS
brew install --cask docker
open /Applications/Docker.app

# Ubuntu
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Log out and back in for group change to take effect

Проверьте установку:

docker --version
docker run hello-world

Шаг 2. Установите NVIDIA Container Toolkit — Linux с GPU NVIDIA

Этот набор инструментов предоставляет контейнерам Docker доступ к вашему GPU. Пользователи macOS и Windows с WSL2 могут пропустить этот шаг: Docker Desktop управляет пробросом GPU на этих платформах иначе.

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
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/$distribution/libnvidia-container.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-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Проверьте доступ к GPU из контейнера:

docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi

Если отображается информация о GPU, набор инструментов работает.

[!note] Примечание переводчика Теги образов, версии CUDA, PyTorch и Qdrant, а также команды установки NVIDIA приведены по состоянию исходной ревизии от 25 июня 2026 года. Перед установкой сверяйте их с актуальной официальной документацией.

Шаг 3. Разберитесь с базовыми образами

Правильный выбор базового образа экономит часы отладки.

nvidia/cuda:12.4.1-devel-ubuntu22.04
  Полный набор инструментов CUDA. Компиляторы включены.
  Используйте для сборки пакетов, которым нужен nvcc: flash-attn, bitsandbytes.
  Размер: около 4 ГБ.

nvidia/cuda:12.4.1-runtime-ubuntu22.04
  Только среда выполнения CUDA. Без компиляторов.
  Используйте для запуска уже собранного кода.
  Размер: около 1,5 ГБ.

pytorch/pytorch:2.3.1-cuda12.4-cudnn9-runtime
  PyTorch заранее установлен поверх CUDA.
  Используйте, чтобы пропустить установку PyTorch.
  Размер: около 6 ГБ.

python:3.12-slim
  Без CUDA, только CPU.
  Используйте для инференса на CPU и лёгких инструментов.
  Размер: около 150 МБ.

Шаг 4. Напишите Dockerfile для разработки AI

Ниже приведён Dockerfile из code/Dockerfile. Разберём его:

FROM nvidia/cuda:12.4.1-devel-ubuntu22.04

ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONUNBUFFERED=1

RUN apt-get update && apt-get install -y --no-install-recommends \
    python3.12 \
    python3.12-venv \
    python3.12-dev \
    python3-pip \
    git \
    curl \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.12 1

RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel

RUN python -m pip install --no-cache-dir \
    torch==2.3.1 \
    torchvision==0.18.1 \
    torchaudio==2.3.1 \
    --index-url https://download.pytorch.org/whl/cu124

RUN python -m pip install --no-cache-dir \
    numpy \
    pandas \
    scikit-learn \
    matplotlib \
    jupyter \
    transformers \
    datasets \
    accelerate \
    safetensors

WORKDIR /workspace

VOLUME ["/workspace", "/models"]

EXPOSE 8888

CMD ["python"]

Соберите образ:

docker build -t ai-dev -f phases/00-setup-and-tooling/07-docker-for-ai/code/Dockerfile .

Первая сборка занимает некоторое время из-за загрузки базового образа CUDA и PyTorch. Последующие сборки используют кэшированные слои.

Запустите его:

docker run --rm -it --gpus all \
    -v $(pwd):/workspace \
    -v ~/models:/models \
    ai-dev python -c "import torch; print(f'PyTorch {torch.__version__}, CUDA: {torch.cuda.is_available()}')"

Запустите Jupyter внутри контейнера:

docker run --rm -it --gpus all \
    -v $(pwd):/workspace \
    -v ~/models:/models \
    -p 8888:8888 \
    ai-dev jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root

Шаг 5. Подключение томов для данных и моделей

Подключение томов критически важно для работы с AI. Без них загруженные 14 ГБ весов модели исчезнут при остановке контейнера.

# Mount your code
-v $(pwd):/workspace

# Mount a shared models directory
-v ~/models:/models

# Mount datasets
-v ~/datasets:/data

В скрипте обучения загружайте данные из подключённого пути:

from transformers import AutoModel

model = AutoModel.from_pretrained("/models/llama-7b")

Модель находится в файловой системе хоста. Контейнер можно пересобирать сколько угодно, не загружая модель заново.

Шаг 6. Docker Compose для многосервисных AI-приложений

Настоящему RAG-приложению нужны сервер инференса и векторная база данных. Docker Compose запускает оба одной командой.

Смотрите code/docker-compose.yml:

services:
  ai-dev:
    build:
      context: .
      dockerfile: Dockerfile
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    volumes:
      - ../../../:/workspace
      - ~/models:/models
      - ~/datasets:/data
    ports:
      - "8888:8888"
    stdin_open: true
    tty: true
    command: jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root

  qdrant:
    image: qdrant/qdrant:v1.12.5
    ports:
      - "6333:6333"
      - "6334:6334"
    volumes:
      - qdrant_data:/qdrant/storage

volumes:
  qdrant_data:

Запустите всё:

cd phases/00-setup-and-tooling/07-docker-for-ai/code
docker compose up -d

Теперь контейнер разработки AI может обращаться к векторной базе по адресу http://qdrant:6333, используя имя сервиса. Docker Compose автоматически создаёт общую сеть.

Проверьте соединение из AI-контейнера:

from qdrant_client import QdrantClient

client = QdrantClient(host="qdrant", port=6333)
print(client.get_collections())

Остановите всё:

docker compose down

Добавьте -v, чтобы также удалить том Qdrant:

docker compose down -v

Шаг 7. Полезные команды Docker для работы с AI

# List running containers
docker ps

# List all images and their sizes
docker images

# Remove unused images (reclaim disk space)
docker system prune -a

# Check GPU usage inside a running container
docker exec -it <container_id> nvidia-smi

# Copy a file from container to host
docker cp <container_id>:/workspace/results.csv ./results.csv

# View container logs
docker logs -f <container_id>

Используем готовое

Теперь у вас есть воспроизводимое окружение разработки AI. В оставшейся части курса:

  • запускайте окружение разработки и векторную базу вместе командой docker compose up;
  • подключайте код, модели и данные как тома, чтобы ничего не терялось между пересборками;
  • когда уроку нужен новый пакет Python, добавляйте его в Dockerfile и пересобирайте образ;
  • делитесь Dockerfile с коллегами, чтобы они получали в точности такое же окружение.

Нет GPU?

Удалите флаг --gpus all и блок NVIDIA deploy. Контейнер продолжит работать для уроков на CPU. PyTorch автоматически обнаружит отсутствие CUDA и переключится на CPU.

Упражнения

  1. Соберите Dockerfile и выполните внутри контейнера python -c "import torch; print(torch.__version__)".
  2. Запустите стек docker-compose и убедитесь, что Qdrant доступен из AI-контейнера по адресу http://qdrant:6333/collections.
  3. Добавьте flask в Dockerfile, пересоберите образ и запустите простой API-сервер на порту 5000. Отобразите порт с помощью -p 5000:5000.
  4. Измерьте размер образа командой docker images. Замените базовый образ devel на runtime и сравните размеры.

Ключевые термины

Термин Как обычно говорят Что это означает на самом деле
Контейнер (container) «Лёгкая виртуальная машина» Изолированный процесс с собственной файловой системой и сетью, использующий ядро хоста
Слой образа (image layer) «Кэшированный шаг» Каждая инструкция Dockerfile создаёт слой; неизменившиеся слои кэшируются, поэтому повторная сборка выполняется быстро
NVIDIA Container Toolkit «GPU в Docker» Перехватчик среды выполнения, предоставляющий контейнерам GPU хоста через флаг --gpus
Подключение тома (volume mount) «Общая папка» Каталог хоста, отображённый внутрь контейнера; изменения сохраняются после остановки контейнера
Базовый образ (base image) «Отправная точка» Образ из инструкции FROM, поверх которого строится Dockerfile; определяет заранее установленное ПО

Источник: Docker for AI — оригинал Навигация: назад: 00.06 — Окружения Python · Фаза 0 — Настройка и инструменты · Полный каталог · далее: 00.08 — Настройка редактора.