AI 创建人工改进
Riqli · 活文档 · 持续更新
AI知识与人类实践的结合。
与朋友分享

Деплой ML-моделей в прод (сервинг, Docker/API)
Введение в деплой ML-моделей в прод
Аннотация. Данный модуль посвящён практическому переводу обученных ML-моделей из исследовательской среды в продакшен. Рассматриваются сервинг моделей через REST API, контейнеризация с помощью Docker, а также базовые аспекты мониторинга и версионирования. Материал опирается на реальные инструменты и рабочие процессы, используемые в индустрии.
Цель. Сформировать навыки упаковки ML-модели в воспроизводимый сервис, доступный по API и готовый к развёртыванию в облачной или серверной инфраструктуре.
Результаты обучения. По завершении модуля слушатель сможет:
- объяснять разницу между образом и контейнером Docker;
- писать Dockerfile для ML-сервиса;
- создавать API на FastAPI с эндпоинтами
/predictи/health; - выполнять сериализацию моделей (joblib, safetensors);
- настраивать базовый мониторинг (логирование, health check).
Целевая аудитория. ML-инженеры, Data Scientist'ы, MLOps-специалисты, знакомые с Python и основами машинного обучения, но нуждающиеся в системном понимании процесса деплоя.
Docker: основы для ML-инженеров
Docker решает ключевую проблему ML-развёртывания — невоспроизводимость окружения. Код, работающий на машине разработчика, может падать на сервере из-за различий в версиях Python, NumPy или CUDA. Контейнеризация позволяет упаковать приложение вместе со всеми зависимостями в изолированный образ.
Образ (image) — это неизменяемый шаблон, содержащий операционную систему (обычно легковесный Linux), код приложения, библиотеки и конфигурации. Образ можно сравнить с классом в ООП или чертежом. Контейнер (container) — это запущенный экземпляр образа, подобно объекту, созданному по классу. На основе одного образа можно запустить множество контейнеров.
Базовые команды:
docker build -t my-ml-model:v1 .
docker run --name experiment-1 my-ml-model:v1
docker ps
docker imagesДля ML-проектов особенно важно, что Docker изолирует зависимости: библиотека TensorFlow может требовать конкретную версию CUDA, а PyTorch — конфликтовать с определёнными релизами NumPy. Контейнеры предотвращают эти конфликты на уровне окружения.
Dockerfile — текстовый файл с инструкциями для сборки образа. Типичная структура для ML-сервиса на FastAPI:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
COPY model.pkl .
EXPOSE 8000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]Разбор инструкций:
FROMзадаёт базовый образ.python:3.11-slim— минимальный образ с Python 3.11.WORKDIRустанавливает рабочую директорию внутри контейнера.COPYкопирует файлы с хоста в образ. Сначала копируются толькоrequirements.txt, затем выполняетсяpip install, и только потом — остальной код. Это использует кэширование слоёв: при изменении кода зависимости переустанавливаться не будут.EXPOSEдокументирует порт, который слушает приложение (сам по себе порт не открывает).CMDзадаёт команду запуска: Uvicorn запускает FastAPI-приложение на порту 8000.
После создания Dockerfile образ собирается командой docker build -t my-model-api:v1 . и запускается через docker run -p 8000:8000 my-model-api:v1.
Чем контейнер Docker отличается от образа?
Контейнер — это запущенный экземпляр образа, тогда как образ — неизменяемый шаблон для создания контейнеров.
Образ — это «чертёж» или класс, содержащий файловую систему и инструкции. Контейнер — работающий процесс, созданный на основе образа. Один образ может породить множество контейнеров.
Образ — это запущенный процесс, а контейнер — статичный файл на диске.
Контейнер и образ — это синонимы, разницы нет.
Образ можно изменять после запуска, а контейнер — нет.
Зачем в Dockerfile копировать requirements.txt и выполнять pip install до копирования остального кода?
Чтобы использовать кэширование слоёв Docker: при изменении кода зависимости переустанавливаться не будут.
Docker кэширует каждый слой. Если requirements.txt не изменился, слой с pip install берётся из кэша, что ускоряет пересборку образа.
Это обязательное требование синтаксиса Dockerfile — порядок инструкций строго регламентирован.
Чтобы уменьшить размер итогового образа за счёт удаления лишних файлов.
Чтобы pip install мог скачать пакеты из интернета до отключения сети.
FastAPI: сервинг ML-моделей через REST API
FastAPI — современный асинхронный веб-фреймворк для Python, хорошо подходящий для ML-сервинга. Он обеспечивает автоматическую валидацию входных данных через Pydantic, генерирует документацию Swagger (/docs) и поддерживает высокую производительность за счёт ASGI.
Минимальный сервер для инференса модели включает:
- загрузку модели при старте приложения;
- эндпоинт
/predictдля приёма данных и возврата предсказания; - эндпоинт
/healthдля проверки работоспособности сервиса; - логирование запросов и ошибок.
Пример с joblib для scikit-learn модели:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import joblib
app = FastAPI()
model = joblib.load('model.pkl')
class PredictionRequest(BaseModel):
features: list[float]
@app.get('/health')
def health():
return {'status': 'healthy'}
@app.post('/predict')
def predict(request: PredictionRequest):
try:
features = [request.features]
prediction = model.predict(features)[0]
return {'prediction': prediction}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))Для глубоких моделей вместо joblib используется safetensors — более безопасный формат, предотвращающий выполнение произвольного кода при загрузке.
Сериализация — это сохранение обученной модели в файл, который можно загрузить в другом окружении. Выбор формата зависит от типа модели:
- Scikit-learn, XGBoost, LightGBM —
joblib.dump(model, 'model.pkl')иjoblib.load('model.pkl'). Joblib эффективен для объектов с большими NumPy-массивами. - PyTorch, TensorFlow — предпочтительно
safetensorsвместо pickle, так как pickle уязвим к исполнению вредоносного кода. Пример:save_file(model.state_dict(), 'model.safetensors'). - ONNX — переносимый формат для кросс-фреймворкового инференса, часто используется с
onnxruntime.
При деплое модель загружается один раз при старте приложения и кэшируется в памяти. Это устраняет накладные расходы на чтение с диска при каждом запросе.
Какой формат сериализации предпочтителен для глубоких нейронных сетей (PyTorch) с точки зрения безопасности?
safetensors
safetensors предотвращает выполнение произвольного кода при загрузке, в отличие от pickle, который может исполнить вредоносный код, зашитый в файл модели.
pickle
CSV
JSON
Какой эндпоинт в FastAPI-сервисе обычно используется для проверки готовности контейнера принимать трафик (readiness probe)?
/health или /ready — эндпоинт, возвращающий статус загрузки модели и готовности сервиса.
Оркестраторы (Kubernetes, Docker Swarm) используют такие эндпоинты для проверки: liveness probe проверяет, что процесс жив, readiness probe — что сервис готов обрабатывать запросы (модель загружена).
/predict — потому что он принимает данные и возвращает результат.
/docs — потому что он показывает документацию API.
/model/info — потому что он возвращает метаданные модели.
MLflow и облачное развёртывание (VK Cloud)
MLflow — инструмент для управления жизненным циклом ML-моделей: трекинг экспериментов, регистрация моделей (Model Registry) и развёртывание. В контексте VK Cloud MLflow может работать в двух режимах: в связке с JupyterHub (аутентификация через JupyterHub) или Standalone (отдельный инстанс со встроенной аутентификацией и ролевой моделью).
Для деплоя модели в прод используется MLflow Deploy — отдельный инстанс, который создаётся только в связке с MLflow. Процесс:
- Модель регистрируется в MLflow Model Registry.
- Создаётся инстанс MLflow Deploy (через личный кабинет VK Cloud, Terraform или библиотеку Cloud ML Platform).
- Сервер развёртывания получает модель из MLflow.
- Модель поднимается в Docker-контейнере, прокси Traefik открывает доступ во внешнюю сеть.
После развёртывания модель доступна по REST API. Пример запроса:
data = {"inputs": [0.045341, 0.050680]}Пользователь отправляет данные и получает предсказание. Инфраструктурные задачи (контейнеры, сеть, масштабирование) берёт на себя облачная платформа, что снижает порог входа для Data Scientist'ов без глубоких знаний DevOps.
Для production-развёртывания ML-модели полезно следовать чек-листу:
- Валидация модели на отложенной выборке до деплоя.
- Health check эндпоинт для оркестратора.
- Логирование входных данных, предсказаний, задержек и ошибок.
- Аутентификация — API-ключи, OAuth или базовая аутентификация.
- Версионирование модели — возможность отката к предыдущей версии.
- Мониторинг дрейфа — отслеживание изменения распределения входных данных.
- Ограничения ресурсов — лимиты CPU/GPU и памяти для контейнера.
Игнорирование health check приводит к тому, что балансировщик отправляет трафик на нездоровые контейнеры, вызывая ошибки 503. Игнорирование логирования делает невозможной диагностику деградации качества модели в проде.
Какой режим MLflow в VK Cloud не требует привязки к JupyterHub и использует встроенную аутентификацию?
Standalone
В режиме Standalone MLflow работает как отдельный инстанс с плагином MLflow Authentication, независимо от JupyterHub. Это удобно для доступа через клиентскую библиотеку ML Platform.
JupyterHub-связанный
Kubernetes-native
Serverless
Зачем в production ML-сервисе нужен эндпоинт health check?
Чтобы оркестратор (например, Kubernetes) мог определять, готов ли контейнер принимать трафик, и не отправлять запросы на нездоровые инстансы.
Без health check балансировщик может направлять трафик на контейнер, который ещё не загрузил модель или упал. Это приводит к ошибкам 503 и ухудшению пользовательского опыта.
Чтобы ускорить инференс модели за счёт кэширования ответов.
Чтобы автоматически переобучать модель при изменении данных.
Чтобы уменьшить размер Docker-образа.
Обзорный раздел: навыки деплоя ML-моделей на практике (реальные требования рынка)
Деплой ML-модели — это момент, когда обученная модель перестаёт жить в ноутбуке и становится частью продукта: её можно вызывать из других сервисов и систем, она работает в бизнес-логике.
Анализ рынка вакансий (600+ позиций ML Engineer / Data Scientist на HH, декабрь 2025) показывает четыре типичных сценария требований к навыкам деплоя:
- Навыки деплоя не требуются — деплоем занимается отдельная команда или платформа.
- «Будет плюсом» — в компании есть готовый процесс выкатки, от ML-инженера требуется собрать Docker-образ или поправить конфигурацию.
- Деплой — часть обязанностей — ML-инженер сам отвечает за развёртывание модели и её обновление.
- Полноценный MLOps — чаще в стартапах, где один человек закрывает несколько ролей.
Статистика по вакансиям: навыки деплоя упоминаются примерно в 15–25% позиций. Лишь для 5–10% вакансий деплой критичен — его отсутствие может стать причиной отказа до технического этапа.
Топ технологий, встречающихся в вакансиях: Docker (~36%), Kubernetes (~19%), CI/CD (~18%), FastAPI (~16%), Flask (~6%), Triton (~5%), TensorRT (~4%), Jenkins (~3%), GitLab CI (~2%).
В каком проценте проанализированных вакансий ML Engineer / Data Scientist навыки деплоя критичны — то есть их отсутствие может стать причиной отказа ещё до технического этапа?