Week 8은 도메인 3(Modeling) 후반부 — "어떤 컴퓨트 위에서, 어떤 데이터 전달 방식으로, 얼마나 싸게 돌릴 것인가"를 다룬다. SageMaker 학습 작업의 흐름은 항상 동일하다.
1. Estimator 정의 (이미지, 인스턴스, 하이퍼파라미터, 출력 경로)2. fit() 호출 → 학습 인스턴스 프로비저닝3. S3에서 학습 데이터를 컨테이너로 전달 (입력 모드)4. /opt/ml/input/data/<channel> 에 데이터, /opt/ml/model 에 산출물 기록5. 학습 종료 → /opt/ml/model 을 S3(output_path)로 자동 업로드(tar.gz)6. 인스턴스 종료 (과금 중단)
인스턴스는 작업 동안만 살아 있다. 학습이 끝나면 사라지므로 중간 상태는 S3로 내보내야 남는다.
모델 산출물은 /opt/ml/model에 쓴 것만 올라간다. 다른 경로는 인스턴스와 함께 사라진다.
/opt/ml/input/data/<channel_name> ← 입력 데이터 채널/opt/ml/input/config/ ← 하이퍼파라미터, 리소스 설정(JSON)/opt/ml/model/ ← 모델 산출물(S3로 자동 업로드)/opt/ml/output/ ← 실패 시 failure 파일/opt/ml/checkpoints/ ← 체크포인트(설정 시 S3와 동기화)
경로
무엇이 놓이나
시험 함정
/opt/ml/input/data/<채널>
fit()에 넘긴 채널별 데이터
채널 이름이 곧 디렉터리 이름이다
/opt/ml/input/config/
하이퍼파라미터·리소스 설정 JSON
코드가 읽는 곳이지 쓰는 곳이 아니다
/opt/ml/model/
최종 모델 아티팩트
여기 아니면 S3로 안 올라간다
/opt/ml/output/
실패 사유(failure 파일)
모델 산출물 경로와 혼동 유발
/opt/ml/checkpoints/
학습 중간 체크포인트
여기 쓴 것은 아티팩트가 아니라 재개용이다
SageMaker 학습은 "관리형 일회성 배치 잡"이다. 인스턴스가 영구히 떠 있는 EC2가 아니라, fit() 시 떴다가 끝나면 사라지는 구조다. 따라서 학습 중간 상태를 보존하려면 반드시 체크포인트를 S3로 내보내야 한다. 이 일회성 특성이 곧 뒤에 나오는 Spot 학습(저렴하지만 중단 가능)이 자연스럽게 어울리는 이유다.
Python SDK의 Estimator(또는 프레임워크별 PyTorch, TensorFlow, XGBoost Estimator)가 학습 작업을 정의한다.
from sagemaker.estimator import Estimatorest = Estimator( image_uri=xgboost_image, # 빌트인/커스텀 컨테이너 이미지 role=role, instance_count=1, instance_type="ml.m5.xlarge", output_path="s3://bucket/output", # 모델 산출물 위치 hyperparameters={"max_depth": 5, "num_round": 100},)est.fit({"train": train_s3, "validation": val_s3})
인자
역할
놓치면 생기는 일
image_uri
학습 컨테이너 이미지
빌트인/커스텀 알고리즘 선택 지점
instance_count
학습 인스턴스 수
2 이상이면 분산 학습으로 들어간다
instance_type
컴퓨트 종류
GPU 필요 여부·비용을 결정
output_path
산출물 S3 위치
/opt/ml/model 내용이 여기로 업로드
hyperparameters
알고리즘 설정
컨테이너 안 config JSON으로 전달
entry_point / source_dir
스크립트 모드 진입점
커스텀 코드를 쓰려면 필수
채널 이름(train, validation)은 컨테이너 안에서 /opt/ml/input/data/<채널> 경로가 된다.
커스텀 코드를 쓰려면 entry_point와 source_dir로 스크립트 모드를 사용한다.
Estimator에 넘긴 hyperparameters는 컨테이너 안 /opt/ml/input/config/에 JSON으로 떨어지고, 학습 스크립트는 그 값을 읽어 동작한다. 즉 "코드 수정 없이 설정만 바꿔 다시 돌리는" 구조라, 내일 다룰 자동 튜닝(AMT)이 같은 Estimator를 하이퍼파라미터만 바꿔가며 반복 실행할 수 있는 것이다.
"데이터가 인스턴스 디스크보다 크다 / 다운로드 대기를 줄이고 싶다" → Pipe 또는 FastFile.
"전체 데이터를 빠르게 다 받아 디스크에서 임의 접근" → File.
Pipe는 순차 스트리밍에 강하고, FastFile은 임의 접근까지 편한 신형 옵션이다.
File 모드는 다운로드가 끝나야 학습이 시작되므로 테라바이트급 데이터에선 시작 지연·EBS 비용이 커진다. Pipe 모드는 protobuf RecordIO 같은 스트리밍 친화 포맷과 결합해 첫 배치를 바로 흘려보낸다. FastFile은 POSIX 파일처럼 마운트되지만 실제 바이트는 접근 시점에 S3에서 당겨오므로, 코드를 거의 바꾸지 않으면서 스트리밍 이점을 얻는다.
[File 모드] S3 → EBS 전체 다운로드 ████████████ → 학습 시작 ▶▶▶▶▶ (다운로드가 끝나야 첫 배치가 돈다. TB급이면 지연·EBS 비용↑)[Pipe/FastFile] 학습 시작 ▶▶▶▶▶ (읽으면서 S3에서 당겨온다) └ 다운로드 대기 없음, 디스크에 전체를 담지 않음
⚠️ 함정: "데이터를 EFS로 복사한 뒤 File 모드", "인스턴스에 수동 복사" 같은 보기는 관리형 학습 흐름을 우회하는 오답 패턴이다. 대용량 지문에서 정답은 거의 항상 Pipe 또는 FastFile이다.
Spot 인스턴스를 학습에 쓰면 온디맨드 대비 최대 ~90% 절감이 가능하다. 단, Spot은 중단될 수 있으므로 체크포인트가 필수다.
est = Estimator( image_uri=img, role=role, instance_count=1, instance_type="ml.m5.xlarge", use_spot_instances=True, max_run=3600, # 총 학습 허용 시간 max_wait=7200, # Spot 대기 포함 최대 시간 (>= max_run) checkpoint_s3_uri="s3://bucket/checkpoints/",)
학습을 SageMaker에서 돌린다├─ 데이터가 인스턴스 디스크에 들어가나?│ ├─ 예 → File 모드 (전체 다운로드 후 임의 접근)│ └─ 아니오 ↓│ ├─ 순차 스트리밍으로 충분 → Pipe│ └─ 임의 접근이 필요·코드 수정 최소화 → FastFile├─ 학습이 느린가 / 모델이 안 들어가나?│ ├─ 느리기만 함(모델은 들어감) → 데이터 병렬(SMDDP), instance_count↑│ └─ 단일 GPU 메모리 초과(OOM) → 모델 병렬(SMP)├─ 비용을 줄여야 하나?│ ├─ 예 → use_spot_instances=True + checkpoint_s3_uri + max_wait >= max_run│ └─ 아니오 → 온디맨드└─ 산출물은? → 반드시 /opt/ml/model 에 기록 → output_path로 자동 업로드