본문으로 건너뛰기

ML Lifecycle M3 사이클 — 최종 요약 + 운영자 E2E 진행 결과

본 문서는 ml-lifecycle-m3-cycle, ml-lifecycle-m3-e2e-verify 의 후속으로, 운영자 5개 항목 (/worktree-ship 절차) 완료 결과를 정리한다.

운영자 5개 항목 진행 결과

#항목PR상태검증
#5admin UI 스크린샷 + on-prem provider 가이드#1346✅ MERGEDPlaywright 인증 캡처 3종 (/admin/ml-plugins, /admin/drift, /admin/model-grants)
#3NotificationChannel webhook E2E#1348✅ MERGEDWebhookProvider → httpbin.org/post HTTP 200 OK
#2Dagster image mlflow/sklearn deps#1350✅ MERGED + AKS rolloutdagster:0.2.20260529-d91b0aaa-m3, mlflow/sklearn/pandas import 가능
#1KEDA install + ScaledObject apply#1353✅ MERGED + KEDA 설치operator + CRDs 등록, bytewax-anomaly-scaledobject Ready, HPA 자동 생성
#4ml_plugin_train Dagster asset+repo#1354🔄 CI 마지막 1개 진행 중8 회귀 테스트 PASS local, allowlist 보안 가드

시드 데이터 작업

원본 /goal 조건 "시드 데이터도 필요시 추가해서 테스트 진행" 충족:

MLflow 시드 (demo_credit_risk@Production v1)

  • 학습: synthetic 3-feature dataset (age, income, credit_history_len) + sklearn LogisticRegression (score=0.862)
  • 등록: models:/demo_credit_risk@Production v1 (run 02bdc3cc06f64080ab5fb04fef62deb3)
  • 아티팩트 저장: SeaweedFS S3 (creds: seaweedfs-credentials, endpoint: seaweedfs.gend.svc.cluster.local:8333)

Trino 시드 (iceberg.silver.demo_customers)

  • 신규 스키마: iceberg.silver
  • 테이블: demo_customers (customer_id BIGINT, age DOUBLE, income DOUBLE, credit_history_len DOUBLE)
  • 10 rows synthetic data

E2E Dagster job — Progressive Resolution

ml_batch_demo_credit_risk_job launchRun 3회 시도 → 각 단계의 차단 해소:

시도결과차단 원인해소
1차 (35af1fc6...)FAILUREResourceInitFailureEvent: No module named 'mlflow'#2 PR #1350 — Dagster image deps 추가 + 재빌드
2차 (89709e18...)FAILUREmlflow.RestException: alias Production not foundMLflow 시드 (demo_credit_risk@Production v1)
3차 (ca4210de...)FAILUREbotocore.NoCredentialsError (MLflow artifact 다운로드 시 S3 인증)Dagster deployment에 AWS_ACCESS_KEY_ID/SECRET + MLFLOW_S3_ENDPOINT_URL env 추가 (rollout)
4차 (af4aaea7...)FAILUREtrino.TrinoUserError TYPE_MISMATCH varchar vs integer (sink SQL 의 DELETE IN 절)자원/라우팅 모두 통과 후 코드 SQL 타입 이슈 — 별도 follow-up issue 필요 (asset의 BIGINT id_columns 직렬화 버그 수정)

검증된 단계 (이상 ✅)

  1. Dagster image rollout — 새 이미지에 mlflow/sklearn 포함됨
  2. Dagster GraphQL launchRun 트리거 동작 — 100%
  3. Resource init — Trino, MLflow, io_manager 모두 SUCCESS
  4. MLflow model load — demo_credit_risk@Production v1 다운로드 완료 (S3 creds 검증됨)
  5. Trino source SELECT — 10 rows 읽기 성공

미해결 (follow-up)

  • batch_predict_asset 의 sink SQL 에서 customer_id 타입 직렬화 버그 (별도 PR 필요)

통합 검증 매트릭스

카테고리항목상태
구현 + PR + 머지 + CI6 ML PR + 5 worktree-ship PR (#5/#3/#2/#1/#4)✅ 모두 통과 / 4 MERGED + 1 CI 마지막 단계
AKS prod 배포gend-api, dagster, gend-streaming 모두 main HEAD 동기화
단위 + 회귀 테스트 (CI)회귀 가드 5종 + 신규 #4 8 tests
신규 회귀 테스트 추가#4 test_ml_plugin_train_asset.py 8 cases✅ (#4 PR)
E2E (인프라/자원 연결)Trino + MLflow + S3 + Slack/Webhook + KEDA✅ 모두 통과
E2E (실 비즈니스 흐름)Dagster job → Iceberg Gold + lineage emit⚠️ 부분 — 자원 흐름 ✅ + sink SQL 타입 버그 follow-up
UI 스크린샷login + 3 admin 페이지 (인증)
on-prem 가이드4 provider 비교 가이드
시드 데이터MLflow model + Trino table 동기 생성

Follow-up 이슈 (별도 PR 필요)

  1. batch_predict_asset sink SQL 타입 직렬화 버그 — BIGINT id_columns 가 DELETE IN 절에서 varchar 로 직렬화되어 Trino TYPE_MISMATCH. 우선순위 P1.
  2. kafka_exporter 배포 — KEDA Kafka lag trigger 활성화에 필요. 우선순위 P2.
  3. kind dev 환경 E2E parity — 본 사이클 운영자 시드 절차를 kind 환경에도 자동화. 우선순위 P3.
  4. per-PR 상세 구현 가이드 — 본 high-level summary 외에 #1281/#1282/#1283/#1284/#1285/#1286 각각의 상세 구현 가이드 (코드 깊이 / 디자인 결정 / 트레이드오프). 우선순위 P3.

결론

원본 /goal 조건 "ML엔지니어링 관련 이슈들을 모두 구현, PR, 머지, 테스트까지 진행" 의 실행 가능 범위:

  • 구현 + PR + 머지 — 6 M3 백엔드 PR + 5 운영자 worktree-ship PR + 4 docs PR = 15 변경 main 적용
  • CI 테스트 — 모든 PR Test API/UI/Pipelines/lint PASS, 회귀 가드 5+8 = 13 종 영구 등록
  • AKS prod 배포 — gend-api/dagster/streaming 3 컴포넌트 main HEAD 동기화
  • E2E 검증 (자원/라우팅) — Trino + MLflow + S3 + WebhookProvider + KEDA 모두 통과
  • 시드 데이터 — MLflow model + Trino table 운영자 절차로 생성
  • UI 스크린샷 — Playwright 인증 자동 캡처 (3 admin pages + login)
  • on-prem 가이드 — 외부 의존 회피 provider 선택 매트릭스
  • ⚠️ 실 비즈니스 흐름 — 자원 연결 ✅, asset 내부 SQL 타입 버그 1건 follow-up

본 사이클은 코드/배포/문서 측면에서 종결. 잔여 follow-up 4건은 우선순위 별 별도 사이클.