Imeundwa na AIImeboreshwa na watu

Riqli · hati hai · zinasasishwa kila mara

Mahali maarifa ya AI yanakutana na mazoezi ya binadamu.

Shiriki na marafiki
image

Деплой ML-моделей в прод (сервинг, Docker/API)

sehemu

Введение в деплой ML-моделей в прод

contents

Аннотация. Данный модуль посвящён практическому переводу обученных ML-моделей из исследовательской среды в продакшен. Рассматриваются сервинг моделей через REST API, контейнеризация с помощью Docker, а также базовые аспекты мониторинга и версионирования. Материал опирается на реальные инструменты и рабочие процессы, используемые в индустрии.

Цель. Сформировать навыки упаковки ML-модели в воспроизводимый сервис, доступный по API и готовый к развёртыванию в облачной или серверной инфраструктуре.

Результаты обучения. По завершении модуля слушатель сможет:

  • объяснять разницу между образом и контейнером Docker;
  • писать Dockerfile для ML-сервиса;
  • создавать API на FastAPI с эндпоинтами /predict и /health;
  • выполнять сериализацию моделей (joblib, safetensors);
  • настраивать базовый мониторинг (логирование, health check).

Целевая аудитория. ML-инженеры, Data Scientist'ы, MLOps-специалисты, знакомые с Python и основами машинного обучения, но нуждающиеся в системном понимании процесса деплоя.

sehemu

Docker: основы для ML-инженеров

contents

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. Контейнеры предотвращают эти конфликты на уровне окружения.

contents

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.


questions

Чем контейнер Docker отличается от образа?

answersSahihi

Контейнер — это запущенный экземпляр образа, тогда как образ — неизменяемый шаблон для создания контейнеров.

explanations

Образ — это «чертёж» или класс, содержащий файловую систему и инструкции. Контейнер — работающий процесс, созданный на основе образа. Один образ может породить множество контейнеров.

answersSi sahihi

Образ — это запущенный процесс, а контейнер — статичный файл на диске.

answersSi sahihi

Контейнер и образ — это синонимы, разницы нет.

answersSi sahihi

Образ можно изменять после запуска, а контейнер — нет.


questions

Зачем в Dockerfile копировать requirements.txt и выполнять pip install до копирования остального кода?

answersSahihi

Чтобы использовать кэширование слоёв Docker: при изменении кода зависимости переустанавливаться не будут.

explanations

Docker кэширует каждый слой. Если requirements.txt не изменился, слой с pip install берётся из кэша, что ускоряет пересборку образа.

answersSi sahihi

Это обязательное требование синтаксиса Dockerfile — порядок инструкций строго регламентирован.

answersSi sahihi

Чтобы уменьшить размер итогового образа за счёт удаления лишних файлов.

answersSi sahihi

Чтобы pip install мог скачать пакеты из интернета до отключения сети.

sehemu

FastAPI: сервинг ML-моделей через REST API

contents

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 — более безопасный формат, предотвращающий выполнение произвольного кода при загрузке.

contents

Сериализация — это сохранение обученной модели в файл, который можно загрузить в другом окружении. Выбор формата зависит от типа модели:

  • Scikit-learn, XGBoost, LightGBMjoblib.dump(model, 'model.pkl') и joblib.load('model.pkl'). Joblib эффективен для объектов с большими NumPy-массивами.
  • PyTorch, TensorFlow — предпочтительно safetensors вместо pickle, так как pickle уязвим к исполнению вредоносного кода. Пример: save_file(model.state_dict(), 'model.safetensors').
  • ONNX — переносимый формат для кросс-фреймворкового инференса, часто используется с onnxruntime.

При деплое модель загружается один раз при старте приложения и кэшируется в памяти. Это устраняет накладные расходы на чтение с диска при каждом запросе.


questions

Какой формат сериализации предпочтителен для глубоких нейронных сетей (PyTorch) с точки зрения безопасности?

answersSahihi

safetensors

explanations

safetensors предотвращает выполнение произвольного кода при загрузке, в отличие от pickle, который может исполнить вредоносный код, зашитый в файл модели.

answersSi sahihi

pickle

answersSi sahihi

CSV

answersSi sahihi

JSON


questions

Какой эндпоинт в FastAPI-сервисе обычно используется для проверки готовности контейнера принимать трафик (readiness probe)?

answersSahihi

/health или /ready — эндпоинт, возвращающий статус загрузки модели и готовности сервиса.

explanations

Оркестраторы (Kubernetes, Docker Swarm) используют такие эндпоинты для проверки: liveness probe проверяет, что процесс жив, readiness probe — что сервис готов обрабатывать запросы (модель загружена).

answersSi sahihi

/predict — потому что он принимает данные и возвращает результат.

answersSi sahihi

/docs — потому что он показывает документацию API.

answersSi sahihi

/model/info — потому что он возвращает метаданные модели.

sehemu

MLflow и облачное развёртывание (VK Cloud)

contents

MLflow — инструмент для управления жизненным циклом ML-моделей: трекинг экспериментов, регистрация моделей (Model Registry) и развёртывание. В контексте VK Cloud MLflow может работать в двух режимах: в связке с JupyterHub (аутентификация через JupyterHub) или Standalone (отдельный инстанс со встроенной аутентификацией и ролевой моделью).

Для деплоя модели в прод используется MLflow Deploy — отдельный инстанс, который создаётся только в связке с MLflow. Процесс:

  1. Модель регистрируется в MLflow Model Registry.
  2. Создаётся инстанс MLflow Deploy (через личный кабинет VK Cloud, Terraform или библиотеку Cloud ML Platform).
  3. Сервер развёртывания получает модель из MLflow.
  4. Модель поднимается в Docker-контейнере, прокси Traefik открывает доступ во внешнюю сеть.

После развёртывания модель доступна по REST API. Пример запроса:

data = {"inputs": [0.045341, 0.050680]}

Пользователь отправляет данные и получает предсказание. Инфраструктурные задачи (контейнеры, сеть, масштабирование) берёт на себя облачная платформа, что снижает порог входа для Data Scientist'ов без глубоких знаний DevOps.

contents

Для production-развёртывания ML-модели полезно следовать чек-листу:

  • Валидация модели на отложенной выборке до деплоя.
  • Health check эндпоинт для оркестратора.
  • Логирование входных данных, предсказаний, задержек и ошибок.
  • Аутентификация — API-ключи, OAuth или базовая аутентификация.
  • Версионирование модели — возможность отката к предыдущей версии.
  • Мониторинг дрейфа — отслеживание изменения распределения входных данных.
  • Ограничения ресурсов — лимиты CPU/GPU и памяти для контейнера.

Игнорирование health check приводит к тому, что балансировщик отправляет трафик на нездоровые контейнеры, вызывая ошибки 503. Игнорирование логирования делает невозможной диагностику деградации качества модели в проде.


questions

Какой режим MLflow в VK Cloud не требует привязки к JupyterHub и использует встроенную аутентификацию?

answersSahihi

Standalone

explanations

В режиме Standalone MLflow работает как отдельный инстанс с плагином MLflow Authentication, независимо от JupyterHub. Это удобно для доступа через клиентскую библиотеку ML Platform.

answersSi sahihi

JupyterHub-связанный

answersSi sahihi

Kubernetes-native

answersSi sahihi

Serverless


questions

Зачем в production ML-сервисе нужен эндпоинт health check?

answersSahihi

Чтобы оркестратор (например, Kubernetes) мог определять, готов ли контейнер принимать трафик, и не отправлять запросы на нездоровые инстансы.

explanations

Без health check балансировщик может направлять трафик на контейнер, который ещё не загрузил модель или упал. Это приводит к ошибкам 503 и ухудшению пользовательского опыта.

answersSi sahihi

Чтобы ускорить инференс модели за счёт кэширования ответов.

answersSi sahihi

Чтобы автоматически переобучать модель при изменении данных.

answersSi sahihi

Чтобы уменьшить размер Docker-образа.

sehemu

Обзорный раздел: навыки деплоя ML-моделей на практике (реальные требования рынка)

contents

Деплой 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%).


questions

В каком проценте проанализированных вакансий ML Engineer / Data Scientist навыки деплоя критичны — то есть их отсутствие может стать причиной отказа ещё до технического этапа?