이번 주는 "내 코드로 학습하고, 크게 학습하고, 학습을 들여다보고, 결과를 제대로 평가한다"는 모델 개발의 두 번째 절반이었다.
[커스텀 학습] 내 코드를 어디까지 가져오나
스크립트 모드 → requirements 확장 → BYOC
[분산 학습] 무엇을 쪼개나
데이터 병렬(느림) ↔ 모델 병렬(안 들어감)
[디버깅·프로파일링] 학습 안을 들여다본다
Debugger(모델 텐서) ↔ Profiler(자원)
[모델 평가] 결과가 정말 좋은가
지표 선택 + 과적합 진단 + 교차검증
커스텀 학습은 "최소 노력" 쪽(스크립트 모드)을 기본으로 두고 필요한 만큼만 아래로 내려간다.
분산은 증상(느림 vs OOM)으로, 관측은 관심사(모델 vs 자원)로, 평가는 문제 성격(불균형·이상치)으로 갈린다.
┌── 커스텀 학습: 무엇으로 실행할 것인가 (컨테이너·코드) │ S3 데이터 ──► [ SageMaker 학습 작업 ] ──► model.tar.gz ──► (다음 주) 배포 │ │ │ └── 관측: Debugger(텐서) / Profiler(자원) / CloudWatch │ └── 분산 학습: 몇 대에 어떻게 쪼갤 것인가 그리고 끝난 뒤 ──► 평가: 지표 선택 · 과적합 · 교차검증
기억할 규약: 데이터는 SM_CHANNEL_<채널명>, 모델 저장은 SM_MODEL_DIR(/opt/ml/model). BYOC는 /opt/ml/input/data/<채널명>/ 입력, train 실행 규약.
규약
값
어기면 생기는 일
입력 데이터
/opt/ml/input/data/<채널명>/
학습 스크립트에서 파일을 못 찾는다
모델 저장
/opt/ml/model (SM_MODEL_DIR)
학습은 성공하는데 S3에 산출물이 없다
하이퍼파라미터
/opt/ml/input/config/hyperparameters.json
값이 기본값으로만 돌아간다
실행 규약(BYOC)
컨테이너를 train 인자로 실행
작업이 즉시 실패한다
입력 모드도 함께 기억한다 — File(전부 복사 후 시작) / Pipe(스트리밍) / FastFile(필요할 때 지연 로딩). 시작 지연이 문제면 FastFile·Pipe를 검토한다.
💡 관련 이론: 이 계층은 관심사 분리다. 학습 로직과 실행 환경을 분리해, 환경이 표준이면 코드만 갈아끼우고(스크립트 모드) 환경이 특수할 때만 환경을 직접 만든다(BYOC). 시험이 "최소 노력"을 강조하면 위쪽을, "시스템 의존성/미지원 프레임워크"를 말하면 아래쪽을 고른다.
누수 점검: 전처리는 반드시 분할 이후 학습 세트 기준으로. 점수가 비현실적으로 높으면 과적합보다 누수를 먼저 의심한다.
시나리오 문장의 신호
골라야 할 지표
"사기가 1%", "희귀 질병", "놓치면 안 됨"
재현율 · AUC-PR (정확도 금지)
"정상 사용자를 잘못 차단하면 안 됨"
정밀도
"정밀도와 재현율 모두 중요"
F1
"가끔 발생하는 큰 오차가 치명적"
RMSE
"이상치가 많아 영향을 줄이고 싶다"
MAE
"데이터가 적어 평가가 들쭉날쭉"
k-fold 교차검증
한 팀이 "정확도 98%" 사기 탐지 모델을 자랑했지만 실제로는 사기를 거의 못 잡았다(불균형). 재현율을 보니 12%였다. 평가 지표를 F1·재현율로 바꾸고 stratified k-fold로 검증한 뒤, 임계값과 클래스 가중치를 조정해 재현율을 끌어올렸다. 교훈: 숫자 하나(정확도)에 속지 말고 문제 성격에 맞는 지표로 본다.
학습할 때
├─ 내 코드 종류? 표준 프레임워크 → 스크립트 모드
│ +파이썬 패키지 → requirements
│ +시스템 패키지 → BYOC
├─ 규모? 느림 → 데이터 병렬 / OOM → 모델 병렬
└─ 문제 생기면 모델 이상 → Debugger / 자원 비효율 → Profiler
평가할 때
├─ 분류? 불균형 → F1·재현율·AUC / 균형 → 정확도 가능
├─ 회귀? 큰 오차 중요 → RMSE / 이상치 둔감 → MAE
├─ 일반화? 학습-검증 격차 크면 과적합 → 정규화·증강·조기종료
└─ 데이터 적음? k-fold 교차검증 (불균형=stratified, 시계열=time-split)