Проблеми стандартного Docker для AI/ML
Припустимо, ваша команда використовує Docker для навчання моделей. Ви помічаєте, що образи важать 10+ ГБ, збірка займає 20 хвилин, а при деплої на продакшн виникає помилка «CUDA driver version is insufficient». Ці проблеми вирішуються правильним налаштуванням: вибір базового образу, багатостадійне складання та NVIDIA Container Toolkit. Нижче — перевірений підхід, який застосовують наші інженери з досвідом роботи понад 8 років.
Docker для AI/ML — це не просто упаковка коду. Це гарантія, що модель запуститься однаково на будь-якій інфраструктурі: від RTX 4090 розробника до A100 у хмарі. За 8+ років роботи ми розгорнули понад 50 продакшн-пайплайнів і виробили підходи, які економлять години налагодження. NVIDIA офіційно рекомендує використовувати Container Toolkit для GPU-прискорення в контейнерах.
NVIDIA Container Toolkit: призначення та встановлення
NVIDIA Container Toolkit — це прошарок, який пробрасовує GPU-пристрої з хоста в контейнер. Без нього Docker не бачить відеокарти. Встановлення стандартне:
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 install nvidia-container-toolkit sudo systemctl restart docker docker run --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi Після цього nvidia-smi всередині контейнера показує всі GPU. Важливо перевірити сумісність версії драйвера хоста та CUDA в образі.
Як налаштувати GPU в Docker? Покрокова інструкція
- Встановіть драйвер NVIDIA на хост (версія 525+).
- Встановіть NVIDIA Container Toolkit, як показано вище.
- Перевірте доступність GPU:
docker run --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi. - Використовуйте базовий образ з CUDA:
nvidia/cuda:12.2.0-cudnn8-runtime-ubuntu22.04. - Запускайте контейнер з флагом
--gpus allабо черезdocker-composeз resource reservations.
Чому багатостадійне складання критичне для AI?
Образи PyTorch з CUDA toolkit легко важать 10 ГБ. Якщо не розділяти стадії, підсумковий образ копіює всі заголовні файли та компілятори, не потрібні в продакшені. Наші інженери гарантують: використання runtime-тегу зменшує образ у 2 рази, а багатостадійне складання дає економію до 80%.
| Тип образу | Розмір | Призначення |
|---|---|---|
| devel (full CUDA) | 8-10 ГБ | Розробка, збірка, навчання з динамічними графами |
| runtime | 4-5 ГБ | Інференс, донавчання без компіляції |
| runtime + ONNX | 2-3 ГБ | Інференс на ONNX Runtime, мінімальні залежності |
Dockerfile для ML-проєкту: багатостадійне складання
Ми використовуємо багатостадійне складання, щоб підсумковий образ був мінімальним. Спочатку builder встановлює всі залежності, потім runtime копіює лише результат.
FROM nvidia/cuda:12.2.0-cudnn8-devel-ubuntu22.04 AS builder RUN apt-get update && apt-get install -y python3.11 python3-pip git \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt FROM nvidia/cuda:12.2.0-cudnn8-runtime-ubuntu22.04 RUN apt-get update && apt-get install -y python3.11 \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /root/.local /root/.local ENV PATH=/root/.local/bin:$PATH WORKDIR /app COPY src/ ./src/ RUN useradd -m -u 1000 mluser USER mluser CMD ["python", "src/train.py"] Docker Compose для локальної розробки
Для розробки додаємо сервіси: MLflow для трекінгу, Postgres для метаданих. Приклад docker-compose.yml:
version: '3.8' services: training: build: . deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] volumes: - ./data:/app/data:ro - ./src:/app/src - ./outputs:/app/outputs environment: - MLFLOW_TRACKING_URI=http://mlflow:5000 depends_on: - mlflow mlflow: image: python:3.11-slim command: mlflow server --host 0.0.0.0 --port 5000 ports: - "5000:5000" volumes: - mlflow-data:/mlflow volumes: mlflow-data: Що робити, якщо контейнер не бачить GPU?
Типова причина — відсутність NVIDIA Container Toolkit або несумісність драйвера. Перевірте: nvidia-smi на хості працює? Встановлений toolkit? Чи правильно вказаний флаг --gpus all? Якщо проблема залишається, перевірте версію CUDA в образі (команда nvidia-smi всередині контейнера покаже сумісність). У 90% випадків допомагає перевстановлення драйвера або вибір іншого тегу CUDA.
Як оптимізувати розмір образу для інференсу?
Типові помилки та їх виправлення:
- Використовувати
develзамістьruntime— замінити наruntime. - Відсутність
--no-cache-dirу pip — завжди додавати. - Кеш apt після встановлення — видаляти через
rm -rf /var/lib/apt/lists/*. - Монтування всього проєкту замість копіювання тільки
src/— структурувати.
Підсумковий образ для інференсу: PyTorch, ONNX Runtime, додаток — 2-3 ГБ. Порівняйте з 8-10 ГБ при наївному підході — різниця в 3-4 рази, що прямо впливає на вартість зберігання та швидкість розгортання.
| Оптимізація | Економія місця | Складність |
|---|---|---|
| Багатостадійне складання | 60-80% | Низька |
| Використання runtime-тегу | 40-50% | Низька |
| ONNX Runtime замість PyTorch | 30-40% | Середня |
| Видалення кешу pip/apt | 10-20% | Дуже низька |
Що входить у роботу?
При замовленні послуги ви отримуєте:
- Готові Dockerfile та docker-compose для ML-пайплайнів з GPU-підтримкою.
- Інтеграцію моніторингу (Prometheus + Grafana) для збору GPU-метрик.
- CI-пайплайн з кешуванням шарів для прискорення збірок.
- Документацію (model card, інструкції із запуску) та навчання команди.
- Гарантію відтворюваності середовища на будь-якому етапі.
Зв'яжіться з нами, щоб оцінити ваш проєкт — отримайте консультацію та пропозицію під ключ протягом 3-5 днів. Понад 5 років на ринку, 8+ років досвіду в інженерів, 50+ впроваджених проєктів — ваш успіх у надійних руках. Замовте налаштування Docker для вашого ML-пайплайну — і ваша команда сфокусується на фічах, а не на оточенні.







