gpumode · 강의 아카이브
《GPU Mode》 L090 2025 · 후반 Mid priority transcript · failed · YouTube 직접 시청 권장

Building resilient ML Engineering skills

대규모 LLM 학습은 모델 코드보다 운영 환경이 더 자주 망가진다. Stas Bekman 이 BLOOM-176B / IDEFICS-80B 학습을 굴리며 정리한 Machine Learning Engineering Open Book 의 정신 — 어떻게 “고장 나는 시스템을 전제로” ML 엔지니어링을 설계할 것인가 — 을 GPU Mode 청중에게 옮긴 강의. transcript 가 실패해서 본 노트는 그의 책과 공개 자료를 기반으로 재구성한 학습 정리.

resilient training checkpointing SLURM debugging NCCL hangs NaN detection cluster ops cost
S
Speaker
Stas Bekman
Contextual.AI · 前 HuggingFace · BLOOM-176B / IDEFICS-80B 학습 운영 · 《Machine Learning Engineering Open Book》 저자
강의 번호
L090
스피커
Stas Bekman
학습 우선순위
Mid · 운영 직군 정독
자막 상태
failed · 책으로 보강
§ 01왜 “resilient” 가 ML 엔지니어링의 키워드인가· why this lecture exists

10,000 GPU 위에서 모델 코드는 가장 안정적인 부품이다

강의의 출발점은 ML 엔지니어가 마주치는 비대칭성이다. 회의실에서 자랑하는 건 모델 아키텍처지만, 학습이 실제로 멈추는 자리는 거의 항상 그 바깥 — HBM ECC 에러, NCCL hang, NFS 한도, SLURM job preemption, 스토리지 inode 고갈. Stas 가 BLOOM-176B 를 굴릴 때 잡은 통계가 강의의 frame 을 잡는다.

강의의 frame 한 문장

“대규모 학습은 고장 나는 시스템을 전제로 설계해야 한다. 고장이 안 난다는 가정은 며칠 단위 실험에서나 통한다 — 몇 주 단위 학습에선 통하지 않는다.”

강의는 실패의 면적 자체를 ML 엔지니어링의 1차 대상으로 본다. 모델은 부품 하나일 뿐이고, resilience 는 그 모든 부품 사이의 인터페이스에서 나온다.

FIG · BLOOM-176B 84일 학습 중 시간이 어디로 갔나Stas 의 사후 회고에서 재구성
실제 학습
62% · 유효 학습 시간
62%
하드웨어 실패
18% · GPU/network 교체 대기
18%
NaN/divergence
8%
8%
소프트웨어 버그
6%
6%
스토리지/IO
4%
4%
사람/조정
2%
2%
실제 model arithmetic 위에 GPU 가 머문 시간은 채 2/3 가 안 된다. 나머지를 줄이는 게 곧 “resilient ML eng” 다. 이 비율은 클러스터마다 다르지만, 학습이 길어질수록 비학습 비중이 늘어난다는 경향은 변하지 않는다. (확인 필요 — Stas 의 강연/책에서 인용한 대략의 비율을 시각화한 값)

그래서 이 강의의 끝에 손에 잡혀 있어야 하는 건 5개의 운영 패턴1개의 진단 사다리다 — checkpoint cadence, spare-node provisioning, NaN guard, divide-and-conquer 디버깅, kill/save switch. 그리고 “이 증상이 보이면 어디부터 의심하는가” 의 순서표.

“모델은 30 줄로 적을 수 있지만, 모델을 살아 있게 유지하는 코드는 3000 줄이다.”Stas Bekman · 학습 노트 인용
§ 02ML 엔지니어링의 일반화된 어려움· the failure surface

분산 학습 스택은 7층이다 — 그리고 모든 층이 독립적으로 망가진다

강의의 첫 큰 시각화는 스택 단면이다. 사용자 레벨의 model 코드 한 줄이 GPU 위에서 실제로 도는 데까지, 거쳐야 하는 층들이 무엇이고 각각이 어떤 모드로 망가지는지를 한 화면에 깔아둔다.

FIG · 분산 학습 스택의 실패 면적top → bottom
L7 · modelPyTorch nn.Module · loss 정의 · optimizer 설정. 가장 안정적인 층 — 코드는 한번 짜면 잘 안 깨진다.실패 빈도 ★
L6 · trainerHF Trainer / Nanotron / torchtitan. 이 층의 버그는 학습 metric 으로 드러난다 — loss 가 안 줄어든다, gradient norm 이 폭발한다.실패 빈도 ★★
L5 · 분산 통신DeepSpeed · FSDP · Megatron · NCCL. hang 의 가장 흔한 출처. 한 rank 에서 OOM 이 나면 다른 rank 가 무한대기. py-spy 가 필수.실패 빈도 ★★★★
L4 · GPU 드라이버 / CUDAECC 에러, Xid event, fabric manager 죽음. dmesg 가 1차 진단. 이 층 실패는 보통 해당 노드 격리 후 재시작.실패 빈도 ★★★
L3 · 네트워크 (IB / RoCE)IB link flap, congestion, switch reboot. ibstat · nccl-tests 로 베이스라인. all-reduce throughput 이 갑자기 떨어지면 여기.실패 빈도 ★★
L2 · 스토리지 / FSNFS · Lustre · GPFS. inode 고갈이 가장 흔하고 가장 멍청한 죽음. checkpoint 로 디스크가 차서 다음 step 이 죽는다.실패 빈도 ★★★
L1 · 스케줄러 (SLURM/K8s)job preemption, time limit, spare 노드 할당. 시스템 정책이 바뀌면 학습이 한 밤에 갑자기 죽는다.실패 빈도 ★★
★ 의 빈도는 Stas 가 책에서 묘사한 BLOOM/IDEFICS 운영 경험을 정성적으로 옮긴 것. L5(NCCL)와 L2(스토리지)가 가장 자주 그리고 가장 비싼 시간을 가져간다. L7(model) 은 거의 마지막에야 의심한다.

이 그림이 강의 전반의 정신적 지도다. 어떤 증상이 보였을 때 “모델 버그” 부터 의심하는 건 거의 항상 시간을 낭비한다. 가장 흔한 실패 층부터 거꾸로 훑는 게 효율적이다.

진단의 1차 명령

학습이 멈췄다 — 가장 먼저 칠 명령 5개. nvidia-smi (GPU 상태), dmesg | tail (Xid · ECC), df -h && df -i (디스크/inode), squeue / kubectl get pods (스케줄러), py-spy dump --pid <PID> (어디서 멈췄나). 이 다섯 줄이 BLOOM 운영 1년의 압축.

특히 py-spy 의 가치는 분산 학습에서 빛난다. NCCL all-reduce 안에서 한 rank 가 멈추면 다른 모든 rank 가 같은 collective 위에서 영원히 대기한다. py-spy dump 를 모든 rank 에 한꺼번에 던져 stack trace 를 비교하면 — 다수와 다른 stack 에 있는 rank 가 곧 범인이다.

§ 03reproducibility 에 드는 진짜 비용· determinism vs throughput

“완전 재현 가능한 학습” 은 비싸고 — 대부분의 경우 필요하지 않다

초보 ML 엔지니어가 가장 자주 빠지는 함정 중 하나. 모든 step 이 비트 단위로 동일하게 재현되어야 한다는 가정. 강의는 이 가정의 비용을 정면으로 다룬다 — 결정론을 강제하면 throughput 이 얼마나 떨어지고, 그 비용이 회수되는 자리는 어디인지.

결정론을 강제하는 layer 별 비용을 정리하면.

  • cuBLAS / cuDNN deterministic mode — 같은 입력에 같은 출력 보장. 대신 알고리즘 선택권을 잃는다. matmul/conv 가 보통 1.2–1.8× 느려진다.
  • NCCL deterministic reduce — tree reduce 가 아닌 ring 만 허용. all-reduce throughput 1.1–1.3× 손해.
  • data loader seeding — 모든 worker 가 결정론적이려면 num_workerspersistent_workers 의 상호작용까지 신경 써야 한다.
  • mixed precision의 비결정성 — bf16/fp16 reduce 는 본질적으로 비결정적이다. fp32 master copy 를 강제하면 메모리가 더 든다.

그래서 강의의 결론은 명확하다 — 결정론은 “디버깅 모드” 다. 평소엔 비결정적으로 빠르게 돌리고, 회귀 테스트와 NaN 재현이 필요한 순간에만 켠다.

# 결정론을 “디버깅 모드” 로 토글하는 패턴
import os, torch

def set_determinism(strict: bool):
    if not strict:
        # 평상시 — 빠른 모드
        torch.backends.cudnn.benchmark = True
        return

    # 회귀 디버깅 모드
    os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8"
    os.environ["NCCL_ALGO"]  = "Ring"
    torch.use_deterministic_algorithms(True)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark     = False
    # seed 는 rank 마다 동일하게 (data loader 는 rank 별 offset)
    torch.manual_seed(42)
    torch.cuda.manual_seed_all(42)
결정론이 회수되는 자리

NaN 이 떴을 때, 그 NaN 이 항상 같은 step 같은 rank 같은 op 에서 뜨는 환경을 만드는 게 핵심. 한 번의 디버깅 사이클을 며칠 → 몇 시간으로 줄인다. 그래서 결정론은 “느려서 안 쓰는” 게 아니라 “쓸 자리에 정확히 쓰는” 도구.

강의의 또 다른 강조점 — checksum based reproducibility. 비트 단위 동일이 아니라, “학습이 끝났을 때 eval metric 이 같은 분포에 들어오는가” 를 reproducibility 로 본다. 이 정의가 실용적이다. seed 만 다르고 코드는 동일한 두 run 이 final loss 0.001 이내로 들어오면 — 그 시스템은 reproducible 한 것이다.

§ 04디버깅 워크플로 — 좁히는 기술· divide and conquer

“어디서 죽었는가” 를 알기 전엔 “왜” 를 묻지 마라

분산 학습 디버깅의 첫 단계는 항상 scope 를 좁히는 것. 강의에서 Stas 가 거듭 강조하는 패턴 — 한 번에 한 변수만 움직이고, 항상 더 작은 reproducer 로 줄여간다.

FIG · divide and conquer 디버깅 사이클5단계 루프
STEP 01 관찰 로그/metric/dump 에서 무엇이 다른지 정확한 단어로 적는다
STEP 02 isolate 한 노드 → 한 GPU → 한 step → 한 op 까지 좁힌다
STEP 03 가설 이 증상을 설명하는 가장 단순한 이론 한 개
STEP 04 실험 가설을 거짓으로 만들 수 있는 가장 작은 실험
STEP 05 기록 로그/wiki 에 결과 적기 — 다음 사람이 같은 실수 안 하게
STEP 02 가 80% 를 좌우한다. 1 노드/1 GPU/1 step 에서 재현되면, 그때부터는 일반 디버거의 영역. 여러 노드에서만 보이면 — NCCL/IB 의 영역.

강의 안에서 등장하는 isolate 도구들의 우선순위.

  1. single-node single-GPU 재현 — 분산 코드의 99% 는 1 GPU 에서도 돈다. torchrun --nproc_per_node=1 로 떨어뜨린 뒤 같은 데이터 같은 seed 로 돌려본다. 여기서 재현되면 distributed 가 아닌 모델/데이터 버그.
  2. data 일정화 — random data 는 디버깅의 적. 같은 batch 를 반복해서 먹인다 (repeat_dataloader 패턴). 결과가 달라지면 model 안에 비결정성이 숨어 있다.
  3. step 별 차이 dump — 두 run 의 weight/grad/loss 를 step 마다 dump 하고 diff. 처음 차이가 나는 step 의 처음 차이가 나는 layer — 그게 범인.
  4. py-spy + bt all — 모든 rank 에 py-spy 를 던져 stack trace 를 비교. 다수와 다른 stack 의 rank 가 답.
  5. NCCL_DEBUG=INFO + NCCL_DEBUG_SUBSYS=ALL — 통신 hang 일 때 어떤 ring 에서 멈췄는지가 로그로 떨어진다.
자주 빼먹는 도구 — git bisect

“어제까지 됐는데 오늘 안 된다” 의 정답은 거의 항상 git bisect. 학습 코드에 한해서는 학습 metric 자체를 bisect 의 판정 기준으로 쓸 수 있다. 100step 짧게 돌려서 loss 가 발산하느냐 아니냐로 판정.

“가장 빠른 디버깅 도구는 디버거가 아니라 scope 를 줄이는 의지다.”학습 노트
§ 05cluster 운영· SLURM · 스페어 노드 · 스토리지

학습 코드 짜기 전에 — 클러스터를 “복원 가능한 상태” 로 세팅한다

강의의 큰 비중이 운영 인프라 에 할애된다. ML 엔지니어가 자주 “인프라 팀의 일” 로 미루는 영역이지만, Stas 의 입장은 분명하다 — 학습이 며칠 단위로 죽는 환경에서, 모델 엔지니어가 이 운영 패턴을 모르면 학습은 절대 끝나지 않는다.

SLURM job array
  • sbatch --array=1-100%1 — 한 번에 1개씩 도는 100개 슬롯. 죽으면 다음 슬롯이 자동으로 같은 코드 재실행.
  • 시작 스크립트 안에서 “가장 최근 checkpoint 자동 찾아 resume”. 사람 손 안 들어가도 며칠 회복 가능.
  • SIGUSR1 핸들러로 time limit 5분 전 에 checkpoint 저장 후 자발적 종료.
spare 노드 5–10%
  • 예: 100 GPU 학습이면 105 GPU 잡아두기. 죽은 노드 즉시 교체 가능.
  • 새 클러스터는 첫 한 달 GPU failure rate 10%. 시간이 지나며 “bad apples” 가 걸러지면서 1–2% 로 수렴.
  • fixed allocation 을 쓰자 — dynamic allocation 은 매번 재시작 시 노드 분포가 바뀌어 NCCL 토폴로지가 달라진다.
스토리지 — 가장 멍청한 죽음
  • inode 고갈: BLOOM checkpoint 가 1000+ shard 로 떨어지면서 NFS inode 가 차 학습이 죽음.
  • checkpoint 디렉토리 rotation: 최근 N 개만 유지, 나머지는 cold storage 로.
  • watchdog: df -i 90% 넘으면 alert + auto-cleanup.
  • 로그 파일 staleness 도 모니터: 어떤 rank 의 로그가 5분간 갱신 없으면 hang.
kill / save switch
  • 운영자가 sudo 없이도 학습을 깨끗하게 멈출 수 있는 메커니즘.
  • 패턴: 특정 파일이 존재하면 다음 step 종료 후 checkpoint 저장 후 exit.
  • touch /shared/STOP_NOW — 사람 손 5초로 학습 정지 + 안전 저장.
checkpoint cadence — 황금 비율

너무 자주: 저장 자체가 throughput 의 무시할 수 없는 비중. 너무 가끔: 한번 죽으면 잃는 시간이 너무 큼. BLOOM 의 비율 — 2.3 TB checkpoint 를 매 3시간. 저장 자체에 드는 시간은 0.37%. resume 시 평균 손실 1.5시간. 이 비율이 큰 학습의 표준 baseline.

FIG · checkpoint cadence 의 trade-off저장 빈도 vs 손실 시간
5분너무 잦음throughput 5–10% 손해, 디스크 폭주
30분개발 모드실험 실패 시 빠른 회복
3시간대규모 학습BLOOM/IDEFICS 의 baseline
12시간fine-tuning대부분의 SFT 가 이 cadence
24시간+위험하루치 손실은 큰 학습에서는 받아들이기 어렵다

그리고 강의에서 자주 빠뜨리는 디테일 하나 — checkpoint 저장 자체도 실패할 수 있다. NFS write 중 네트워크 잠시 끊김, 부분적으로 쓰여진 file 이 다음 resume 때 corrupt 로 발견. 패턴은 항상 atomic rename: tmp/ 에 저장 후 fsync 후 final path 로 rename. 그리고 마지막 N 개의 checkpoint 를 keep 해 한두 개가 부서져도 회복 가능하게.

§ 06학습 실패 진단· NaN · hang · diverge

증상별 진단 사다리 — 어디부터 의심하는가

강의의 가장 실무적인 섹션. 학습이 망가지는 세 모드 — NaN, hang, divergence — 각각이 보일 때 의심해야 할 layer 의 순서표.

증상 A · NaN / Inf
  • 1차: gradient norm 폭발. clip 이 안 들어가는 layer 가 있나?
  • 2차: bf16/fp16 underflow / overflow. layer norm 의 변동, RMSNorm 의 epsilon, softmax 의 max-subtract.
  • 3차: 데이터 자체에 NaN. dataloader 출력에 NaN guard.
  • 4차: ECC 메모리 에러로 한 GPU 가 잘못된 weight 갖고 있음. nvidia-smi -q -d ECC.
  • 도구: torch.autograd.set_detect_anomaly(True) — 첫 NaN 의 backward stack trace.
증상 B · hang (학습이 멈춤)
  • 1차: 한 rank 의 OOM. NCCL collective 안에서 다른 rank 들이 영원히 대기.
  • 2차: IB link flap. ibstat · nvidia-smi nvlink -s.
  • 3차: dataloader 가 NFS 위에서 IO bound. iostat 으로 disk wait time.
  • 도구: 모든 rank 에 py-spy dump 동시 실행 후 stack trace diff.
  • 예방: NCCL_TIMEOUT 을 적당히 짧게 (예: 30분) 설정해 영원히 대기하지 않게.
증상 C · divergence (loss 발산)
  • 1차: learning rate 가 너무 높음. WSD 가 stable 단계로 들어갔는데도 발산하면 LR 절반.
  • 2차: gradient accumulation 횟수 변경 후 effective batch size 가 바뀌었나?
  • 3차: 데이터 mixture 변경 후 이상. 새 데이터 셋의 token 분포가 기존과 너무 다른가?
  • 4차: numerical 정밀도. fp16 → bf16 전환의 잔여 효과.
  • 5차: weight init / scale. 큰 모델에서 layer count 가 늘면 init scale 도 따라 줄여야.
증상 D · throughput drop
  • 1차: 어떤 노드 한 개가 느려져 전체 ring 이 느려짐. nccl-tests baseline 비교.
  • 2차: 데이터 mixture 변경으로 평균 sequence length 가 늘었나?
  • 3차: thermal throttling. nvidia-smi --query-gpu=temperature.gpu.
  • 4차: PCIe / NVLink 다운그레이드. nvidia-smi nvlink -s 로 link width 확인.

이 사다리들의 공통점 — cheap 한 진단부터 expensive 한 진단으로. nvidia-smi · dmesg · df 같은 명령은 1초가 안 걸린다. 한 줄로 무엇이 보이고 안 보이는지가 결정된다. 코드 안 디버거를 띄우는 건 한참 뒤의 일이다.

NaN guard 의 표준 배치

학습 루프 안에 항상 박혀 있는 두 줄. 첫째 — if not torch.isfinite(loss): emergency_save(); exit(1). 둘째 — grad_norm = clip_grad_norm_(...) 의 반환값을 logger 로 내보내, NaN 이 뜨기 직전의 grad norm 추세를 사후에 볼 수 있게. NaN 은 갑자기 안 온다 — 항상 grad norm 의 비정상 추세 뒤에 온다.

§ 07cost 관리· budget vs reality

예산 산정의 가장 큰 거짓말 — “GPU-hour 만 곱하면 된다”

예산을 GPU 시간 × 단가로만 잡으면 30–40% 가 사라진다. 실제 학습 비용의 분포는 그보다 복잡하다.

FIG · 큰 학습의 실제 비용 분포BLOOM-176B 회고 기반 추정
유효 학습 시간
GPU × hour × utilization
~55%
실패/재시작
하드웨어 교체 + 재시작
~18%
checkpoint IO
매 cadence 저장
~5%
디버깅 사이클
실험 재실행
~8%
스토리지/네트워크
월정액
~6%
사람 시간
엔지니어 + 인프라
~8%
naive 한 “GPU-hour × $” 견적은 위 전체의 약 55% 만 잡는다. 나머지를 미리 예산에 넣지 않으면 프로젝트 막판에 “돈이 더 필요하다” 가 나온다. (확인 필요 — 정확한 비율은 사례마다 다름)
“GPU 가 비싼 게 아니라, GPU 가 비어 있는 시간이 비싸다.”학습 노트
cost 의 두 번째 차원 — 의사결정 비용

모델 ablation 을 충분히 안 한 채 큰 학습에 들어가면, 잘못된 hyperparameter 가 며칠을 잡아먹는다. “작은 ablation 에 들이는 GPU-hour 가 큰 학습 cost 의 보험”. SmolLM3 의 모든 architecture 선택은 3B × 100B token 의 작은 ablation 위에서 검증됐다 — 본 학습 시작 전에.

§ 08팀 합의 영향· team dynamics

코드는 git 으로 관리되는데, 결정은 어디로 흘러가는가

강의 후반부의 부드러운 섹션. 그러나 Stas 가 책에서 가장 자주 인용하는 운영 실패의 원인 — 같은 정보가 여러 사람에게 다른 형태로 전달돼 두 명이 다른 가정으로 디버깅하는 것.

의사소통의 표준 단위 — “3 lines, 3 numbers, 3 links”

모든 incident 보고는 같은 형식. 3 줄로 무엇이 일어났는지, 3 개의 숫자(언제, 얼마나 영향, 비용), 3 개의 링크(grafana, log, runbook). 이 단위를 지키면 같은 incident 를 두 사람이 다르게 기억할 가능성이 줄어든다.

그리고 강의에서 가볍게 — 그러나 중요하게 — 등장하는 한 마디. “ML 엔지니어로 오래 살아남는 사람은 모델 코드를 잘 짜는 사람이 아니라, 자기 결정의 자취를 다른 사람이 읽을 수 있게 적어두는 사람.”

§ 09추천 자료와 실습 시퀀스· resources

책 한 권 + repo 두 개 + 실습 5개

강의가 끝난 뒤 실제로 손을 움직이게 만드는 자료들.

Book stas00/ml-engineering — Machine Learning Engineering Open Book · 강의의 모든 디테일이 이 책에 있다. 7개 part — Insights · Hardware · Orchestration · Training · Inference · Development · Misc.
Companion the-art-of-debugging · 디버깅 방법론 별책
YouTube L090 강의 영상 · transcript 실패, 직접 시청 필요
Reference run bigscience-workshop/bigscience · BLOOM 학습의 모든 incident log · runbook · checkpoint 정책

실습 시퀀스

  1. SLURM job array + auto-resume — 작은 학습 코드 (1 GPU 도 OK) 로 sbatch array 짜기. SIGUSR1 핸들러로 5분 전 checkpoint. 일부러 죽여보고 다음 슬롯이 자동으로 이어 받는지 확인.
  2. kill switch 구현 — 학습 루프 안에 “특정 파일이 있으면 다음 step 후 안전 종료” 패턴. touch STOP 으로 5초만에 멈추는 경험.
  3. NaN guard + grad norm 추세 로깅 — 일부러 LR 을 너무 높게 설정해 NaN 을 발생시켜본다. NaN 직전의 grad norm 그래프를 wandb 에 올려놓고 패턴을 본다.
  4. py-spy dump 비교 워크플로 — 작은 multi-rank 학습을 띄우고 한 rank 에 일부러 sleep 을 박아 hang 을 만든다. py-spy dump --pid <PID> 를 모든 rank 에 실행 후 어떤 stack 이 다른지 비교.
  5. checkpoint atomic writetmp/ 에 저장 → fsync → rename 패턴 구현. 학습 중간에 노드를 강제 reboot 했을 때 corrupt checkpoint 가 안 생기는지 검증.
§ 10기억할 메모와 핵심 패턴· key takeaways

다시 열었을 때 5분 안에 손에 잡혀야 할 것

실패 면적의 비대칭
L7(model) 보다 L5(NCCL) · L2(스토리지) · L4(GPU 드라이버) 가 자주 깨진다. 진단은 항상 아래 층부터.
진단의 1차 명령 5개
nvidia-smi · dmesg · df -h && df -i · squeue · py-spy dump. 이 다섯 줄이 운영 1년의 압축.
checkpoint cadence
큰 학습은 매 3시간. atomic rename + 마지막 N 개 keep + 자동 rotation. 저장 자체도 실패할 수 있다.
spare 노드 5–10%
새 클러스터 첫 한 달 GPU failure 10%. fixed allocation 으로 NCCL 토폴로지 안정.
결정론은 디버깅 모드
평소엔 비결정적으로 빠르게. NaN 재현 / 회귀 시에만 켠다. throughput 1.2–1.8× 손해를 알고 쓴다.
divide and conquer
single-node single-GPU 까지 좁힌다. 여기서 재현 안 되면 distributed 영역.
cost = GPU-hour × 1.3–1.5
실패 buffer + storage + 네트워크 + 사람 시간을 미리 예산에 넣는다.
3 lines / 3 numbers / 3 links
incident 보고의 표준 단위. 같은 incident 가 두 명에게 다르게 기억되지 않게.
§ 11다른 강의로 이어지는 길· connections

이 강의의 운영 패턴이 어디서 다시 등장하는지

L090 의 운영 마인드는 시리즈 안에서 데이터/통신/체크포인팅 강의들과 짝을 이룬다.

§ 12열린 질문· open questions

다음에 다시 들었을 때 직접 검증해야 할 것들

검증 메모

본 노트의 모든 비율(GPU utilization 62% 등)은 강의 영상이 아닌 Stas 의 책과 공개 회고를 기반으로 한 추정이다. transcript 가 복원되거나 영상 직접 시청 후 정확한 수치/일화로 갱신해야 한다.

← Lecture 089 이전 강의 Lecture 091 → Mega Lecture: Reinforcement Learning, Agents & OpenEnv