Развертывание ML-моделей
1) Роль и цели
Развертывание = надежная доставка инференса в продукт и операции при соблюдении RG/AML/Legal и бюджетов.
Цели: низкая латентность, высокая доступность, воспроизводимость, безопасность и быстрая обратимость (rollback).
2) Архитектуры сервинга
2.1 Паттерны
Online (real-time): REST/gRPC, p95 50–150 мс для персонализации; ≤2–5 с для RG/AML-алертов.
Near-real-time: микробатчи 1–5 мин (OLAP-витрины).
Batch/offline: ночные витрины Gold, WORM-экспорты для регулятора.
In-process scoring: встраивание лайт-модели в сервис (низкая задержка).
Serverless: функции с холодным стартом для редких задач.
2.2 Топологии
Single Model Service → просто и быстро.
Ensemble/Graph (router → preprocess → model → postprocess) → сложные пайплайны.
Sidecar Feature Fetcher → вытягивает online-фичи из кэшей (Redis/Scylla).
3) Модельный реестр и версии
Registry: `model_id`, `version`, `stage={Staging,Production,Archived}`, артефакты (веса, препроцессор, калибровка), требования (CPU/GPU/память), карточка модели (данные, метрики, риски, fairness).
Иммутабельные артефакты: content-hash; WORM-копии релизов.
Политика вывода: только через реестр и декларативные манифесты.
4) Контейнеризация и упаковка
Dockerfile (эскиз):dockerfile
FROM python:3. 11-slim
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements. txt.
RUN pip install -r requirements. txt --no-cache-dir
COPY artifacts/./artifacts/
COPY src/./src/
CMD ["python", "src/serve. py"]
Сервер (FastAPI + gRPC, идея):
python serve. py from fastapi import FastAPI import joblib, time app = FastAPI()
model = joblib. load("artifacts/model. joblib")
scaler = joblib. load("artifacts/scaler. joblib")
@app. post("/score")
def score(payload: dict):
t0 = time. time()
x = preprocess(payload, scaler)
y = float(model. predict_proba([x])[0,1])
return {"score": y, "latency_ms": int((time. time()-t0)1000), "model_version": "1. 8. 3"}
5) Kubernetes/Helm и автоскейлинг
Deployment (фрагмент):yaml apiVersion: apps/v1 kind: Deployment metadata: {name: ml-score, labels: {app: ml-score}}
spec:
replicas: 3 selector: {matchLabels: {app: ml-score}}
template:
metadata: {labels: {app: ml-score}}
spec:
containers:
- name: api image: registry/ml-score:1. 8. 3@sha256:...
ports: [{containerPort: 8080}]
resources:
requests: {cpu: "500m", memory: "512Mi"}
limits: {cpu: "2", memory: "2Gi"}
envFrom: [{secretRef: {name: ml-secrets}}]
readinessProbe: {httpGet: {path: /healthz, port: 8080}, periodSeconds: 5}
livenessProbe: {httpGet: {path: /livez, port: 8080}, periodSeconds: 10}
HPA (по RPS/CPU):
yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: {name: ml-score-hpa}
spec:
scaleTargetRef: {apiVersion: apps/v1, kind: Deployment, name: ml-score}
minReplicas: 3 maxReplicas: 50 metrics:
- type: Pods pods:
metric: {name: requests_per_second}
target: {type: AverageValue, averageValue: "15"}
- type: Resource resource: {name: cpu, target: {type: Utilization, averageUtilization: 70}}
6) Стратегии выката
Shadow (темный запуск): новая модель обрабатывает копии запросов, ответы игнорируются; сравнение метрик/латентности/стоимости.
Canary: 1–10% трафика → 25% → 50% → 100% при зеленых SLO; автоматическое откатывание при деградации.
Blue-Green: параллельные стеки; мгновенный свитч маршрутизации.
Gradual Feature Flag: маршрутизация по рынкам/тенантам/устройствам.
A/B/n: онлайновые эксперименты с sequential testing.
yaml routes:
- match: {tenant: "EEA"} # feature-flags/rules to: {model: "1. 8. 3", weight: 20}
- match: {tenant: "EEA"}
to: {model: "1. 7. 9", weight: 80}
7) Фичи online/offline: эквивалентность
Единая библиотека трансформаций и Feature Store (online + offline).
Тест эквивалентности: MAE/MAPE между онлайн-фичами и офлайн-эталоном на эталонной выборке.
Кэш фич: Redis/Scylla, TTL для оконных признаков; таймауты и fallbacks.
8) Наблюдаемость, SLO и алертинг
8.1 SLI/SLO ориентиры
Латентность: p95 ≤ 150 мс (персонализация), p99 ≤ 300 мс; RG/AML алерты ≤ 5 с end-to-end.
Доступность: ≥ 99.9%.
Ошибка инференса: ≤ 0.5% 5xx; coverage ≥ 99%.
Дрейф: PSI фич/скора < порога, ECE (калибровка) стабильна.
Бизнес: uplift Net Revenue, fraud saved, time-to-intervene.
8.2 Метрики (Prometheus)
yaml
- http_request_duration_seconds{quantile="0. 95"}
- http_requests_total{code=~"5.."}
- model_inference_latency_ms_bucket
- feature_fetch_latency_ms_bucket
- model_score_distribution_bucket
- psi_feature_{name}
- expected_cost_live
Алерты (фрагмент):
yaml
- alert: HighP95Latency expr: histogram_quantile(0. 95, sum(rate(model_inference_latency_ms_bucket[5m])) by (le)) > 0. 15 for: 10m
- alert: DriftDetected expr: psi_feature_amount_base > 0. 25 for: 15m
Трейсинг: OpenTelemetry — span’ы `feature_fetch`, `score`, `postprocess`, `guardrail`.
9) RG/AML guardrails и политика безопасности
Pre-/Post-filter: маски запрещенных действий (частоты показов, cooldown, запрет агрессивных офферов).
Policy Shielding: скор выше порога RG → мягкая интервенция/пауза.
Аудит: логирование `policy_id`, `propensity`, `mask`, `decision`, `reason`.
PII и резидентность: токены вместо ID, отдельные ключи шифрования и кластера на EEA/UK/BR; запрет кросс-регионных join’ов без основания.
Секреты: KMS/CMK, Secret Manager; никакого PII в логах/трейсах.
10) Калибровка, пороги и политика решений
Калибровка (Platt/Isotonic) как артефакт.
Порог по expected cost; конфигурируемый в реестре/фича-флаге.
Safety caps: верхние/нижние границы действий, ручной override для комплаенса.
11) Откаты, деградации и DR
One-click rollback: переключение маршрута на предыдущую `model_version`.
Runbook: сценарии «латентность↑», «ошибки 5xx↑», «дрейф/калибровка сломалась», «внешний фич-провайдер недоступен».
Изоляция сбоев: circuit breaker, retry/backoff, кэш последнего валидного решения.
DR: бэкапы артефактов/реестра, репликация в «теплый» регион, учения.
python try:
features = fetch_features(timeout=30)
except TimeoutError:
features = last_known_good(user_id) # fallback
12) Cost-инжиниринг и производительность
Профилирование пути: фичи (30–60%), модель (20–40%), сеть/IO (10–30%).
Снижение стоимости: кэширование горячих фич, квоты на реплеи, lightweight-модели, INT8/FP16 (если уместно), lazy-postprocess.
HPA на RPS/CPU/latency, ограничение state-size у стрим-фич.
Chargeback: cost/request, cost/feature; бюджеты на рынки/команды.
13) Безопасные релизы и соответствие
Критерии прод-готовности: SLO зеленые на shadow, нет дрейфа/утечки, карточка модели заполнена, fairness-слайсы в норме.
Регуляторка: WORM-архив релиза (веса, калибровка, пороги, метрики, логи тестов), неизменяемые экспортные отчеты.
DSAR/RTBF: процедуры удаления следов конкретного пользователя из кешей/логов/фич.
14) QA перед выкатыванием
Интеграционные тесты: контракт API, схемы фич, «пустые/крайние» кейсы.
Нагрузочные: p99, хвосты распределений, burst-трафик.
Тест эквивалентности online/offline.
Chaos-тесты: выключение фич-кэша/базы, таймауты внешних сервисов.
15) Примеры конфигураций
Ingress с канареечной маршрутизацией (идея):yaml
- match: [headers: {x-exp: "canary"}]
route:
- destination: {host: ml-score-v1-8-3, weight: 20}
- destination: {host: ml-score-v1-7-9, weight: 80}
Здоровье модели (эндпоинт):
python
@app. get("/healthz")
def health():
return {"ok": True, "model_version": "1. 8. 3", "registry_sig_ok": verify_signature()}
16) Процессы и RACI
R (Responsible): MLOps (сервинг/оркестрация/наблюдаемость), Data Eng (фичи/кэши/контракты), Data Science (карточки моделей/калибровка/пороги).
A (Accountable): Head of Data / CDO.
C (Consulted): Compliance/DPO (PII/RG/AML/DSAR), Security (KMS/секреты/аудит), SRE (SLO/инциденты), Finance (ROI/бюджеты).
I (Informed): Продукт/Маркетинг/Операции/Поддержка.
17) Дорожная карта внедрения
MVP (3–6 недель):1. Модельный реестр и иммутабельные артефакты; FastAPI/gRPC-сервис + K8s/Helm.
2. Shadow-запуск с мониторингом p95/5xx/дрейфа, тест эквивалентности фич.
3. Canary 10% → 50% → 100% с автоскриптом отката и алертами.
4. Карточка модели, калибровка, expected-cost порог и Guardrails v1.
Фаза 2 (6–12 недель):- Фича-кэш, circuit breakers, runbooks/DR-учения.
- Автоскейлинг на RPS/latency, cost-дашборд и chargeback.
- Слайс-мониторинг fairness, WORM-архив релизов.
- Граф сервинга (кандидаты → re-rank), slate-логирование пропенсити.
- Мульти-регион, резидентность (EEA/UK/BR) с отдельными ключами.
- Авто-перекат/перетрен по дрейфу, автоген отчетов качества/калибровки.
18) Чек-лист прод-готовности
- Карточка модели заполнена; данные/фичи/калибровка/пороги версионированы.
- Контракты фич и тест эквивалентности online/offline — зеленые.
- SLO: p95, 5xx, coverage — зеленые на shadow и 10% canary ≥ 24 ч.
- Алерты и дашборды (латентность/ошибки/дрейф/expected-cost) включены.
- Guardrails RG/AML и аудиты решений активны; PII/резидентность соблюдены.
- One-click rollback и runbook инцидентов протестированы.
- Стоимость вписывается в бюджет; HPA и кэш настроены.
19) Анти-паттерны и риски
Ручные выкаты без реестра и иммутабельных артефактов.
Несогласованные online/offline фичи → расхождения в проде.
Отсутствие shadow/canary → скрытые регрессии.
Порог не по expected cost, нет калибровки.
Синхронные внешние lookups без таймаутов/кэша.
Нет DR/rollback, нет WORM-архива релиза.
20) Итог
Продакшен ML — это не «вызов модели», а инженерная платформа: реестр и версии, безопасные выкаты (shadow/canary/blue-green), дисциплина фич и калибровки, наблюдаемость и SLO, guardrails для RG/AML и четкий план отката. Следуя этому плейбуку, вы получите быстрый, надежный и комплаентный инференс, который стабильно приносит бизнес-ценность при контролируемой стоимости.