💡 관련 이론: 무조건 자주 재학습하는 것이 정답은 아니다. 재학습에는 컴퓨팅 비용, 검증 시간, 새 모델이 오히려 더 나쁠 위험이 따른다. 그래서 "드리프트 감지 시 재학습"처럼 이벤트 기반(event-driven) 트리거가 비용 효율적이다. 일정 기반은 단순하지만, 변화가 없는 기간에도 재학습해 자원을 낭비할 수 있다. 시험에서 "불필요한 재학습 비용을 줄이려면"이라고 하면 일정 기반보다 드리프트 기반 트리거를 고른다.
AWS에서 재학습 자동화의 중심은 SageMaker Pipelines다. 데이터 처리 → 학습 → 평가 → (조건부) 모델 등록의 단계를 정의하고, 외부 이벤트로 트리거한다.
전형적인 이벤트 기반 흐름:
Model Monitor가 드리프트 위반을 CloudWatch 지표로 보낸다.
CloudWatch Alarm이 ALARM 상태가 되어 EventBridge 규칙(또는 SNS→Lambda)을 발동한다.
Lambda(또는 EventBridge 타겟)가 SageMaker Pipeline 실행을 시작한다.
파이프라인이 최신 데이터로 재학습하고, 평가 단계에서 성능이 기준을 통과하면 Model Registry에 새 버전을 등록한다.
from sagemaker.workflow.pipeline import Pipelinefrom sagemaker.workflow.condition_step import ConditionStepfrom sagemaker.workflow.conditions import ConditionGreaterThanOrEqualTo# 평가 정확도가 기준 이상일 때만 모델을 등록하는 조건 단계cond = ConditionGreaterThanOrEqualTo( left=eval_accuracy, right=0.85, # 정확도 0.85 미만이면 등록하지 않음)condition_step = ConditionStep( name="CheckAccuracy", conditions=[cond], if_steps=[register_model_step], # 통과 시 Model Registry 등록 else_steps=[], # 미달 시 아무것도 하지 않음(기존 모델 유지))pipeline = Pipeline(name="retrain-pipeline", steps=[process_step, train_step, eval_step, condition_step])
조건부 등록은 중요하다. 재학습한 모델이 기준 미달이면 자동 배포하지 않고 기존 모델을 유지해 회귀(regression)를 막는다.
Model Registry는 모델 버전을 카탈로그로 관리하며 각 버전에 승인 상태(Approved/Rejected)를 둔다. 재학습 파이프라인이 새 버전을 "PendingManualApproval"로 등록하면, 사람이 검토 후 승인할 때 비로소 배포 파이프라인(예: CodePipeline)이 트리거되게 할 수 있다. 완전 자동(조건 통과 즉시 배포)과 사람 승인(human-in-the-loop) 사이에서 위험도에 맞춰 선택한다.
새 모델이 평가 데이터에서 좋았다 해도, 실제 트래픽에서 더 나으리란 보장은 없다. 그래서 배포 전략은 "얼마만큼의 위험을 감수할 것인가"로 고른다.
전략
사용자에게 응답이 가나
무엇을 비교할 수 있나
비용
롤백
섀도(Shadow)
아니오 (기록만)
지연·오류·예측 분포 등 기술 지표
두 벌 추론 비용
섀도 중단만 하면 끝
A/B (프로덕션 배리언트)
예 (가중치만큼)
기술 지표 + 클릭·전환 등 비즈니스 성과
배리언트 인스턴스 합
가중치를 0으로 되돌림
카나리 / 선형
예 (소수 → 점증)
전환 중 이상 징후
전환 기간 동안 이중 용량
알람 기반 자동 롤백
Blue/Green
예 (전환 후 전부)
전환 후 전체 지표
전환 기간 이중 용량
알람 기반 자동 롤백
섀도와 A/B는 목적이 다르다. 섀도는 "새 모델이 운영 트래픽에서 터지지 않는가"를 보는 기술 검증이고, A/B는 "새 모델이 실제로 더 좋은 결과를 만드는가"를 보는 성과 검증이다. 섀도는 사용자 응답이 없으니 클릭률·전환율 같은 비즈니스 지표를 애초에 잴 수 없다. 그래서 실무 순서는 섀도 → A/B다.
A/B 테스트는 새 모델이 일부 실사용자에게 실제로 응답한다. 그 응답이 나쁘면 그 사용자는 영향을 받는다. 섀도 테스트(shadow testing)는 이 위험을 없앤다. 운영 트래픽의 사본을 새(섀도) 모델에도 보내지만, 섀도 모델의 응답은 사용자에게 반환하지 않고 기록만 한다. 사용자는 항상 기존 모델의 응답을 받는다.
┌──▶ 프로덕션 모델 v1 ──▶ 응답 ──▶ [사용자] 요청 ──────┤ └──▶ 섀도 모델 v2 ─────▶ 로그·지표만 저장 (사용자에게 안 감)
# SageMaker Shadow Test: 프로덕션 배리언트와 섀도 배리언트를 함께 배포# 섀도 모델은 동일 입력을 받아 추론하지만 결과는 로깅만 되고 사용자에게 가지 않는다shadow_config = { "ShadowModelVariants": [ {"ShadowModelVariantName": "model-v2-shadow", "SamplingPercentage": 100}, ],}
섀도 테스트는 "새 모델이 실제 운영 트래픽에서 어떻게 동작하는지 위험 없이 검증"하고 싶을 때의 정답이다. 지연·오류·예측 분포를 사용자 영향 없이 비교한 뒤, 만족하면 A/B나 전면 교체로 넘어간다. SamplingPercentage를 낮추면 섀도 추론 비용을 줄일 수 있다.
⚠️ 함정: A/B 테스트와 섀도 테스트를 혼동하기 쉽다. A/B는 실사용자에게 새 모델 응답이 실제로 나간다(위험 일부 존재, 성과를 비즈니스 지표로 비교 가능). 섀도는 새 모델 응답이 사용자에게 안 나가고 기록만 된다(사용자 영향 0, 순수 기술 검증). "사용자에게 전혀 영향을 주지 않고 새 모델을 운영 데이터로 검증"이면 섀도, "트래픽을 나눠 점진적으로 전환"이면 A/B다.