Фаза 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-проектам Docker нужен сильнее, чем большинству других
- Основные термины
- Распространённые шаблоны контейнеров в AI
- Собираем сами
- Шаг 1. Установите Docker
- Шаг 2. Установите NVIDIA Container Toolkit — Linux с GPU NVIDIA
- Шаг 3. Разберитесь с базовыми образами
- Шаг 4. Напишите Dockerfile для разработки AI
- Шаг 5. Подключение томов для данных и моделей
- Шаг 6. Docker Compose для многосервисных AI-приложений
- Шаг 7. Полезные команды Docker для работы с AI
- Используем готовое
- Нет GPU?
- Упражнения
- Ключевые термины
Контейнеры оставляют фразу «на моей машине работает» в прошлом.
Тип: Практика Языки: 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 объединяет ваш код, среду выполнения, библиотеки и системные инструменты в изолированную единицу — контейнер. Его можно представить как лёгкую виртуальную машину, но вместо запуска собственного ядра ОС контейнер использует ядро хост-системы. Поэтому он запускается за секунды, а не минуты.
Почему AI-проектам Docker нужен сильнее, чем большинству других
-
Драйверы GPU хрупки. Код для CUDA 12.4 не работает на CUDA 11.8. Docker изолирует набор инструментов CUDA внутри контейнера, одновременно предоставляя ему драйвер GPU хоста через NVIDIA Container Toolkit.
-
Веса моделей велики. Модель с 7 миллиардами параметров занимает 14 ГБ в формате fp16. Вам не захочется скачивать её заново после каждой пересборки. Тома Docker позволяют подключить каталог моделей с хоста.
-
Многосервисные архитектуры встречаются часто. Реальное 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.
Упражнения
- Соберите Dockerfile и выполните внутри контейнера
python -c "import torch; print(torch.__version__)". - Запустите стек docker-compose и убедитесь, что Qdrant доступен из AI-контейнера по адресу
http://qdrant:6333/collections. - Добавьте
flaskв Dockerfile, пересоберите образ и запустите простой API-сервер на порту 5000. Отобразите порт с помощью-p 5000:5000. - Измерьте размер образа командой
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 — Настройка редактора.