Docker
Docker упаковывает код, библиотеки и веса модели в образы контейнеров, которые одинаково работают на ноутбуках, GPU-серверах, исполнителях CI и периферийных устройствах.
Docker — платформа с открытым исходным кодом для сборки, обмена и запуска приложений в контейнерах: изолированных процессах с собственной файловой системой, содержащей код, библиотеки и системные пакеты, но использующих ядро операционной системы хоста. Компания dotCloud, позже переименованная в Docker, Inc., открыла исходный код платформы в марте 2013 года, а её интерфейс командной строки, формат слоистых образов и общедоступный реестр сделали контейнеры Linux привычным инструментом разработчиков. В машинном обучении образ Docker фиксирует точную версию Python, библиотеки CUDA, сборку PyTorch и веса модели, поэтому модель одинаково работает на ноутбуке, сервере с GPU, агенте непрерывной интеграции и периферийном устройстве.
Как работает Docker#
Dockerfile перечисляет шаги сборки образа: исходный базовый образ, команды установки пакетов, копируемые файлы и команду запуска. Каждая инструкция RUN, COPY или ADD добавляет слой только для чтения, а при следующей сборке используются закэшированные слои вплоть до инструкции или входного файла, который изменился. Поэтому зависимости, установленные на ранних этапах, остаются в кэше, а код приложения пересобирается за секунды. Образ — это набор таких слоёв и метаданных. Контейнер — запущенный экземпляр образа с тонким доступным для записи слоем поверх него. Этот слой удаляется вместе с контейнером, если данные не сохраняются в подключённый том.
Команда docker взаимодействует с Docker Engine — фоновой службой, которая передаёт каждый контейнер containerd и низкоуровневой среде выполнения runc. Они используют пространства имён Linux для изоляции процессов, сети и файловой системы контейнера, а cgroups — для ограничения ресурсов CPU и памяти. Образы распространяются через реестры, такие как Docker Hub, GitHub Container Registry, NVIDIA NGC и собственный реестр каждого облачного провайдера. Образы соответствуют формату Open Container Initiative, поэтому Podman, containerd и Kubernetes запускают их без изменений.
Ultralytics публикует официальные образы Docker для каждой аппаратной платформы, включая GPU с CUDA, CPU, платы ARM64, устройства NVIDIA Jetson и GPU AMD. Каждый образ также помечен номером выпуска Ultralytics, что обеспечивает воспроизводимость сборок. Используемый ниже облегчённый образ latest-python уже содержит Python, PyTorch, пакет ultralytics и нано-веса YOLO26, поэтому Dockerfile проекта нужно добавить только собственный код:
# Official Ultralytics CPU image with Python, PyTorch, ultralytics, and yolo26n.pt
FROM ultralytics/ultralytics:latest-python
# Install extra dependencies in their own layer, cached until requirements.txt changes
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the application last, so code edits rebuild only this layer
COPY app.py .
# Command every container runs when it starts
CMD ["python", "app.py"]Команда docker build -t yolo-app . превращает этот файл и файлы рядом с ним в образ, а docker run --rm yolo-app запускает из него контейнер. Если отправить образ в реестр, любая другая машина сможет получить его и запустить ту же среду, например как API для обслуживания моделей или ночное задание инференса.
Docker для машинного обучения#
Контейнеры получают доступ к GPU через NVIDIA Container Toolkit. Драйвер NVIDIA остаётся на хосте, а образ содержит только пользовательские библиотеки CUDA, совместимость которых с драйвером обязательна. В Linux Docker 28.2 и более поздние версии включают CDI по умолчанию, поэтому --device nvidia.com/gpu=all запрашивает GPU как устройства CDI и сохраняет доступ к GPU в долгоживущих контейнерах. Более старый флаг --gpus all может потерять доступ при перезагрузке systemd на хосте.
Для обучения важны ещё два параметра. Рабочие процессы загрузчика данных PyTorch передают батчи процессу обучения через разделяемую память /dev/shm, размер которой Docker по умолчанию ограничивает 64 МБ. Поэтому контейнеры для обучения запускают с --ipc=host или более крупным значением --shm-size. Наборы данных и результаты нужно хранить в подключённых томах: если процесс обучения сохраняет контрольные точки внутри контейнера, после его удаления они пропадут. Фиксация тега выпуска или дайджеста образа вместо latest гарантирует, что задание распределённого обучения или развёртывание модели будет использовать один и тот же образ на всех машинах. И серверы инференса, например NVIDIA Triton Inference Server, и управляемые сервисы, такие как Vertex AI, запускают модели в виде образов контейнеров.
Docker, виртуальные машины и Kubernetes#
- Виртуальные машины: Гипервизор эмулирует оборудование, а каждая ВМ загружает собственное гостевое ядро. Это обеспечивает более строгую изоляцию рабочих нагрузок и позволяет использовать любую гостевую операционную систему, но требует полного образа ОС для каждой ВМ и увеличивает время запуска. Поскольку контейнеры используют ядро Linux хоста, Docker Desktop в macOS и Windows запускает их внутри облегчённой виртуальной машины Linux.
- Docker Compose: Описывает несколько контейнеров, которые работают вместе на одном хосте, например API инференса, кэш и сборщик метрик.
- Kubernetes: Планирует работу контейнеров в кластере, перезапускает сбойные контейнеры и масштабирует реплики в зависимости от трафика. В Kubernetes 1.24 удалили dockershim — встроенный адаптер для Docker Engine, поэтому кластеры запускают контейнеры через containerd или CRI-O. Образы, собранные Docker, по-прежнему работают, поскольку это стандартные образы OCI.










