Настройка Canary Deployment для ML-моделей
Canary deployment — стратегия постепенного выкатывания новой версии модели: сначала на малую долю трафика (5-10%), затем при отсутствии проблем — на всё большую аудиторию. Это снижает риск деградации для всех пользователей одновременно и даёт возможность быстрого отката.
Когда canary предпочтительнее blue-green
Blue-green переключает весь трафик сразу — подходит для сервисов с высокой уверенностью в новой версии. Canary нужен, когда:
- Модель обучена на новых данных, но реакция пользователей непредсказуема
- Изменилась архитектура модели (другой тип, другие входные признаки)
- Критичный production-сервис с высокой ценой ошибки
- Нет полного набора интеграционных тестов
Реализация на Kubernetes с KServe
KServe (бывший KFServing) поддерживает canary из коробки:
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
name: fraud-detector
spec:
predictor:
canaryTrafficPercent: 10 # 10% на новую версию
model:
modelFormat:
name: sklearn
storageUri: s3://models/fraud-detector-v2/
# Предыдущая версия - canary baseline
Переключение трафика без даунтайма:
# Увеличение с 10% до 50%
kubectl patch inferenceservice fraud-detector \
--type='json' \
-p='[{"op": "replace", "path": "/spec/predictor/canaryTrafficPercent", "value": 50}]'
# Продвижение канарейки в production (100%)
kubectl patch inferenceservice fraud-detector \
--type='json' \
-p='[{"op": "remove", "path": "/spec/predictor/canaryTrafficPercent"}]'
Реализация на Seldon Core
apiVersion: machinelearning.seldon.io/v1
kind: SeldonDeployment
metadata:
name: fraud-detector
spec:
predictors:
- name: main
replicas: 3
traffic: 90
graph:
name: fraud-v1
implementation: SKLEARN_SERVER
modelUri: s3://models/fraud-v1
- name: canary
replicas: 1
traffic: 10
graph:
name: fraud-v2
implementation: SKLEARN_SERVER
modelUri: s3://models/fraud-v2
Автоматическое управление трафиком
Прогрессивное увеличение трафика автоматически на основе метрик:
def progressive_canary_rollout(service_name, metrics_client):
stages = [5, 10, 25, 50, 100]
for target_traffic in stages:
set_canary_traffic(service_name, target_traffic)
time.sleep(300) # 5 минут стабилизации
metrics = metrics_client.get_metrics(window='5m')
# Проверка guardrail метрик
if metrics['canary_error_rate'] > 0.01:
rollback_canary(service_name)
alert(f"Canary rollback: error rate {metrics['canary_error_rate']:.2%}")
return False
if metrics['canary_p99_latency_ms'] > 500:
rollback_canary(service_name)
alert("Canary rollback: latency SLA violated")
return False
if metrics['business_metric_delta'] < -0.02: # -2% деградация
rollback_canary(service_name)
alert("Canary rollback: business metric degraded")
return False
return True # Успешный полный деплой
Метрики для решения о продвижении
| Метрика | Условие продвижения | Условие отката |
|---|---|---|
| Error rate | < 0.5% | > 1% |
| p99 latency | < 200мс | > 500мс |
| Prediction drift | PSI < 0.1 | PSI > 0.2 |
| Business proxy | Нет деградации > 1% | Деградация > 3% |
Интеграция с Argo Rollouts
Argo Rollouts — Kubernetes-контроллер с поддержкой canary и blue-green для любых workload, не только ML:
spec:
strategy:
canary:
steps:
- setWeight: 5
- pause: {duration: 5m}
- setWeight: 25
- pause: {duration: 10m}
- setWeight: 50
- pause: {duration: 10m}
- analysis:
templates:
- templateName: ml-model-metrics
Canary deployment как практика снижает MTTR (mean time to recovery) при деградации модели: вместо полного отката и реплоя достаточно уменьшить canary-трафик до нуля.







