0Pricing
Learn AI with Python · Урок

Контейнеризация моделей машинного обучения с помощью Docker

Многоэтапный Dockerfile, базовые образы CUDA, COPY артефакта модели, конечные точки проверки работоспособности

«Контейнеризация моделей машинного обучения с помощью Docker» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.

Зачем контейнеризировать модели машинного обучения

Модели машинного обучения зависят от конкретной версии Python, системных библиотек и зафиксированных версий пакетов. Docker упаковывает всё это в один неизменяемый образ, поэтому модель работает одинаково на ноутбуке, в исполнителе CI и в рабочем кластере.

Для машинного обучения самая серьёзная проблема — расхождение зависимостей: модель, обученная с numpy 1.24, может незаметно работать некорректно с numpy 2.0. Контейнер фиксирует эти версии.

Наивный одноэтапный образ

Первая попытка устанавливает всё на одном этапе. Это работает, но в итоговый образ попадают инструменты сборки — компиляторы, кэши и заголовочные файлы для разработки, — из-за чего он становится большим и увеличивается поверхность атаки.

FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "serve.py"]

Многоэтапная сборка: идея

Многоэтапная сборка использует один этап для компиляции и установки зависимостей — сборщик, — а затем копирует только готовые артефакты в чистый финальный этап. Инструменты, нужные только для сборки, никогда не попадают в рабочую среду.

  • Этап сборщика: полный базовый образ, выполняется pip install
  • Финальный этап: облегчённый базовый образ, копируются установленные пакеты

Этап сборщика: pip install

Сборщик устанавливает пакеты в известный префикс, чтобы их было легко скопировать. Использование --user помещает их в /root/.local — один каталог, который можно забрать позднее.

FROM python:3.11 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

Финальный облегчённый этап

Финальный этап начинается с образа python:3.11-slim и копирует установленные пакеты из сборщика. В облегчённом образе отсутствуют цепочки инструментов сборки, что уменьшает размер образа на сотни мегабайт.

FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH
COPY . .

Копирование весов модели

Большие веса модели следует копировать в отдельный слой, чтобы Docker мог кэшировать их. Если меняется только ваш код, слой с весами используется повторно, и сборка выполняется быстро.

COPY model/ /app/model/
COPY src/ /app/src/

Объявление порта сервера

Серверы инференса (FastAPI, Triton, TorchServe) прослушивают порт. EXPOSE 8000 документирует, что контейнер обслуживает запросы на порту 8000. Само по себе это не публикует порт: при запуске его по-прежнему нужно сопоставить с помощью -p 8000:8000.

EXPOSE 8000
CMD ["uvicorn", "src.serve:app", "--host", "0.0.0.0", "--port", "8000"]

Основы HEALTHCHECK

Оркестраторам нужно знать, работает ли сервер модели. Инструкция HEALTHCHECK выполняет команду через заданный интервал; ненулевой код завершения помечает контейнер как неисправный, чтобы его можно было перезапустить или убрать из балансировщика нагрузки.

HEALTHCHECK с curl

Распространённый подход — обращаться к лёгкой конечной точке /health. Команда curl -f завершается с ошибкой (с ненулевым кодом) при любой ошибке HTTP — именно этого ожидает HEALTHCHECK.

HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
  CMD curl -f http://localhost:8000/health || exit 1

Минимальная конечная точка проверки состояния

Ваше приложение для обслуживания запросов должно предоставлять быструю конечную точку, подтверждающую, что модель загружена, без выполнения полного инференса.

from fastapi import FastAPI

app = FastAPI()
model = None  # loaded at startup

@app.get("/health")
def health():
    return {"status": "ok", "model_loaded": model is not None}

Полный Dockerfile

Соберём всё вместе: на этапе сборки устанавливаются зависимости, а на облегчённом финальном этапе они копируются вместе с моделью, объявляется порт 8000 и задаётся проверка состояния.

FROM python:3.11 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH
COPY model/ /app/model/
COPY src/ /app/src/
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
  CMD curl -f http://localhost:8000/health || exit 1
CMD ["uvicorn", "src.serve:app", "--host", "0.0.0.0", "--port", "8000"]

Быстрая проверка

Проверьте, насколько хорошо Вы поняли сборки из нескольких этапов.

Итоги

Вы научились контейнеризировать ML-модель с помощью Dockerfile, подходящего для промышленной эксплуатации:

  • Сборка из нескольких этапов: на этапе сборки устанавливаются зависимости, а на облегчённом финальном этапе они копируются
  • EXPOSE 8000 документирует порт обслуживания
  • HEALTHCHECK CMD curl позволяет оркестраторам обнаруживать неработающие контейнеры
  • Копируйте веса в отдельный слой, который можно кэшировать

Далее Вы развернёте контейнеризированную модель в управляемом облачном сервисе.

Часто задаваемые вопросы

Урок «Контейнеризация моделей машинного обучения с помощью Docker» бесплатный?

Да — полный текст урока «Контейнеризация моделей машинного обучения с помощью Docker» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.

Чему я научусь в уроке «Контейнеризация моделей машинного обучения с помощью Docker»?

Многоэтапный Dockerfile, базовые образы CUDA, COPY артефакта модели, конечные точки проверки работоспособности Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn AI with Python?

Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Контейнеризация моделей машинного обучения с помощью Docker»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn AI with Python?

Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Контейнеризация моделей машинного обучения с помощью Docker
  2. Развертывание в облаке: AWS SageMaker
  3. Высокопроизводительное предоставление моделей с Triton Inference Server
  4. Масштабирование и автоматическое масштабирование конечных точек моделей
← Назад к Learn AI with Python