어제 Glue와 EMR으로 데이터를 변환하는 법을 배웠다. 그런데 변환은 한 번 돌리고 끝나지 않는다. 새 데이터가 들어올 때마다, 혹은 매일 정해진 시각에 추출 → 변환 → 검증 → 학습 → 평가를 자동으로 반복해야 한다. 이 반복을 사람이 손으로 돌리면 실수가 나고 재현성이 깨진다.
ML 워크플로는 여러 단계가 순서·조건·의존성을 갖고 엮여 있다.
[데이터 추출] → [전처리] → [데이터 품질 검증]
│
품질 통과 ──────┤──── 품질 실패 → 경보 후 중단
│
▼
[모델 학습] → [모델 평가] → 정확도 기준 충족?
│
충족 → [모델 등록·배포] │ 미충족 → 재학습 or 알림
이런 분기·재시도·병렬 처리를 코드 한 덩어리로 관리하면 깨지기 쉽다.
오케스트레이터는 각 단계를 노드로 만들고, 상태 전이·에러 처리·재시도를 선언적으로 정의하게 해 준다.
좋은 파이프라인의 핵심 가치는 재현성(reproducibility)과 추적성(lineage)이다. 같은 입력이면 언제 돌려도 같은 결과가 나와야 하고, 특정 모델이 "어떤 데이터·어떤 코드·어떤 파라미터"로 만들어졌는지 거슬러 추적할 수 있어야 한다. 자동화 파이프라인은 이 두 가지를 구조적으로 보장한다.
SageMaker Pipelines는 ML 워크플로 전용으로 설계된 CI/CD 오케스트레이터다. Python SDK로 단계를 정의하면 SageMaker가 실행·추적·버저닝을 담당한다.
주요 단계(step) 타입:
단계
역할
ProcessingStep
전처리·후처리·평가(SageMaker Processing)
TrainingStep
모델 학습
TuningStep
하이퍼파라미터 튜닝
RegisterModel / ModelStep
모델 레지스트리 등록
ConditionStep
평가 지표 기준 분기(예: 정확도 ≥ 0.85일 때만 등록)
TransformStep
배치 변환(대량 스코어링)
from sagemaker.workflow.steps import ProcessingStep, TrainingStepfrom sagemaker.workflow.condition_step import ConditionStepfrom sagemaker.workflow.conditions import ConditionGreaterThanOrEqualTofrom sagemaker.workflow.pipeline import Pipeline# 전처리 → 학습 → 평가 → (조건부) 모델 등록step_process = ProcessingStep(name="Preprocess", processor=sklearn_processor, ...)step_train = TrainingStep(name="Train", estimator=xgb_estimator, ...)cond_accuracy = ConditionGreaterThanOrEqualTo( left=eval_metric_accuracy, right=0.85)step_cond = ConditionStep( name="AccuracyGate", conditions=[cond_accuracy], if_steps=[step_register_model], # 기준 충족 시 모델 등록 else_steps=[] # 미충족 시 등록하지 않음)pipeline = Pipeline( name="ml-train-pipeline", steps=[step_process, step_train, step_cond],)pipeline.upsert(role_arn=role)pipeline.start()
SageMaker Pipelines는 실행마다 lineage(계보)를 자동 기록한다. 어떤 데이터셋·코드·하이퍼파라미터로 어떤 모델이 만들어졌는지가 SageMaker Model Registry와 연결되어 추적된다. 규제 환경(설명 가능성·감사)에서 매우 중요한 기능이다.
핵심 판단: 워크플로가 순수하게 ML 학습/평가/등록 중심이면 SageMaker Pipelines, ML 단계와 데이터 파이프라인·외부 시스템·승인 단계가 뒤섞이면 Step Functions가 자연스럽다. 둘을 함께 쓰는 패턴(Step Functions가 상위에서 전체를 오케스트레이션하고, 그 안에서 SageMaker 작업 호출)도 흔하다.
[혼합 구성]
Step Functions (상위 오케스트레이션)
├─ Glue ETL 잡
├─ 데이터 품질 검증 Lambda
├─ 사람 승인 대기
└─ SageMaker Pipeline 실행 ─┬─ Processing
├─ Training
├─ Evaluation
└─ ConditionStep → RegisterModel
⚠️ 함정: "ML 작업이니까 무조건 SageMaker Pipelines"는 단순화된 오답이다. 워크플로에 승인 대기, 여러 비-ML 시스템 연동, 복잡한 조건 분기가 많다면 범용성이 높은 Step Functions가 더 적합하다. 문제의 요구사항(비-ML 단계 비중, 추적성 요구)을 읽어 판단해야 한다.
🎯 시나리오: "매일 새벽 2시에 전날 로그를 전처리하고 모델을 재학습하되, 평가 정확도가 0.9 미만이면 배포하지 말고 데이터 팀에 알림을 보내라." → EventBridge cron으로 SageMaker Pipeline을 트리거하고, 파이프라인 내부에 ConditionStep(정확도 게이트)과 실패 시 SNS 알림을 두면 된다.
⚠️ 함정: 트리거를 "사람이 콘솔에서 시작"으로 두는 보기는 자동화 문제에서 오답이다. 자동화의 목적 자체와 어긋난다.