4.4.2 · блок 4
Типовые поломки MLOps-контура
Типовые поломки MLOps-контура
Зачем это нужно
E2E-контур длинный — больше звеньев, больше способов сломаться. Не все поломки — «pod crashed». Часть — silent: модель отвечает 200 OK, но predictions nonsense из-за skew или wrong artifact. Этот урок — каталог типовых сбоев и где их ловить gates и observability.
Умение быстро локализовать звено (train vs registry vs deploy vs traffic) сокращает MTTR и учит проектировать pipeline устойчивым с самого начала.
Основные идеи
Классы поломок.
| Класс | Пример | Симптом |
|-------|--------|---------|
| **Data** | Schema change upstream | NaN scores, default branch в model |
| **Train** | OOM GPU, failed job | Нет нового candidate в ClearML |
| **Artifact** | Corrupt pickle, wrong sklearn | CrashLoop on start, import error |
| **Registry/MMS** | Promoted wrong task id | Version mismatch in `/health` |
| **CI/CD** | Broken Jenkinsfile, failed push | Старый image в prod |
| **Deploy** | Helm typo, insufficient memory | Pending pods, OOMKilled |
| **Traffic** | Istio weight 0 on new subset | Canary «не работает» |
| **Skew** | Train features ≠ serving | Metrics OK infra, business KPI down |
Поломка: «модель не грузится».
- Логи pod:
ModuleNotFoundError: sklearn→ образ собран с другим requirements, чем train. - Gate: CI test
load model + predictв том же Dockerfile, что prod. - Fix: pin versions; rebuild image from MMS artifact URI.
Поломка: «ClearML task успешен, но в MMS пусто».
- Webhook Jenkins не сработал; API key expired.
- Detect: alert на «candidate tag without MMS record > 24h».
- Fix: replay promote job с task_id.
Поломка: «Argo CD OutOfSync бесконечно».
- Manual kubectl edit (drift); invalid Helm template.
- Fix: enforce GitOps only;
helm templatein CI; revert drift.
Поломка: «Canary 5%, но ошибок не видно».
- Istio metrics смотрят только 5% traffic; sample too small.
- Business dashboard still on old version aggregate.
- Fix: compare canary subset explicitly; SLO on canary route.
Поломка: «Train pipeline писал в prod bucket».
- Wrong env var
S3_BUCKET=prodin Workflow template. - Gate: namespace isolation; policy OPA; separate credentials staging/prod.
Поломка: «Rollback не помог».
- Откатили image, но feature schema upstream уже новая — старая модель incompatible.
- Fix: rollback plan includes data contract version; MMS champion + feature flag.
Поломка: «Два champion в MMS».
- Race двух promote jobs.
- Gate: MMS transactional promote; optimistic locking on version.
Runbook structure. Для каждого сервиса: symptoms → checks (MMS version, Argo app status, ClearML task) → mitigation → escalation.
Как это выглядит на практике
Инцидент INC-4421: «Churn scores все 0.5 после релиза».
Timeline:
1. T+0 — Alert: business «conversion model flat» (не infra alert!).
2. T+15m — On-call: pods healthy, latency OK. /health shows model v1.3.0.
3. T+30m — Compare MMS champion ClearML task abc118 vs artifact in pod hash — mismatch.
4. Root cause: Jenkins promote used wrong TASK_ID parameter (typo in manual job).
5. Mitigation: MMS revert champion v1.2.2; Argo rollback MR merged; Istio 100% old.
6. Follow-up: promote job only from MMS UI button that passes task_id; delete manual parameter default.
Table «где могли поймать»:
| Stage | Control |
|-------|---------|
| Promote | Require task_id from MMS API only |
| Build | Embed task_id in image label; admission check |
| Deploy | Init container verify artifact hash vs MMS |
| Runtime | Log input feature stats; alert on constant output |
Связь с блоком 5: infra metrics green ≠ model quality OK — нужен drift dashboard.
Что сделать после занятия
- [ ] Выберите 3 поломки из урока и напишите «symptom → first check → fix» для вашего контура.
- [ ] Добавьте один quality gate в Jenkins promote, который предотвращает конкретный сценарий.
- [ ] Проведите tabletop exercise: «ClearML OK, prod bad» — ваши шаги расследования.