Розгортання 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: сценарії «latentnost↑», «помилки 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-запуск з моніторингом р95/5хх/дрейфу, тест еквівалентності фіч.
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 і чіткий план відкату. Дотримуючись цього плейбуку, ви отримаєте швидкий, надійний і комплаєнтний інференс, який стабільно приносить бізнес-цінність при контрольованій вартості.