Index
2026-09-04 — Plan

초심자용 Physical AI 강의 노트북 재설계안

AI899 | 기존 01_sim_and_vla_solution.ipynb (RoboCasa + pi0.5) 분석 → "루프 먼저" 구조 제안

TL;DR

221
기존 cells
~130
새 cells (목표)
19 → 12
빈칸 문제
~70%
재사용
6
신규 그림

1 배경 / 목적

기존 노트북은 SK 2026 비전 강의 시리즈의 하루치 실습이다 ("5일차에 구현한 DDPM" 을 전제). 이번 목표는 로보틱스를 처음 접하는 신입생·연구실 신입에게 다음 넷을 직관적으로 이해시키는 자료다.

  1. Action 이 무엇인가 — 형태 / 어디로 들어가나 / 어떻게 쓰이나
  2. 시뮬레이션이 무엇인가 — 어떻게 동작하나
  3. VLA / action expert 가 무엇인가 — pi0.5 를 building block 으로
  4. 입출력 형태
기존 한계: 순서가 "모델(S1) → 환경(S2) → 데이터(S3)" 라 초심자 인과 순서가 아니고, action 이 env 에 들어간 뒤(컨트롤러·물리 적분)를 설명하지 않으며, S7~S12 는 초심자 목표 대비 무겁다.

2 기존 노트북 해부

Section 구성 (cell 인덱스는 정답본 기준)

Sec제목cell문제초심자용 판정
1pi0.5 의 구성 / 파라미터 분포2-8재사용 Part 4-2
2RoboCasa 시뮬레이터와 관측10-241-3재사용 Part 1, 2-2
3robocasa-H50 데이터셋25-454재사용 Part 2-4, 3 (압축)
4트랜스포머 두 개 / config / state→prompt46-565재사용 Part 2-5, 4-4, 4-6
5forward hook shape 추적57-726-7재사용 Part 4-3
6flow 적분 루프 세 줄73-77재사용 Part 4-5
7flow matching vs DDPM + toy 2D78-1028-11Appendix A DDPM 비교는 삭제
8학습 코드 / 전처리 순서 / 30 스텝103-13112-15삭제 4줄 루프만 Appendix B
9롤아웃 / Wilson CI / 영상132-15316재사용 Part 5 (Wald 유도 삭제)
10ablation: flow steps154-16217Appendix C ci_overlap 만 Part 5-4
11ablation: n_action_steps163-178재사용 Part 6-3 (압축)
12관측 손상 강건성 (19조건)179-22018-19재사용 Part 6-1, 6-2 핵심 2조건 + 요약 그래프

살릴 강점

초심자 목표 대비 갭

목표기존 커버리지빠진 것
Action 형태12-d [-1,1], 채널 std 로 7-d 만 살아 있음 (cell 44)채널의 물리적 의미 (delta? 절대? 좌표계?) 가 데이터 통계에서 역추론됨
Action 이 어떻게 들어가나env.step(action) 호출env.step 내부: 컨트롤러 → 관절 토크 → MuJoCo 적분 → 다음 관측. 20 Hz 제어 vs 물리 substep
Action 이 어떻게 사용되나chunk 50/25 (cell 50-52), Runner 큐는 docstring 에만예측 50 → 실행 25 → 재관측 타임라인 그림, 큐 동작 그림
시뮬레이션이 뭐냐"채점이 가능하다" 한 문단 (cell 10)MuJoCo / robosuite / RoboCasa / gymnasium 4층, reset/step 계약, reward·success·horizon
VLA / action expert"CLIP/GPT/DDPM 자리" 대응표초심자용 "눈(SigLIP) → 읽는 머리(Gemma) → 손(expert)" 서사, "noise 에서 10번 다듬는다" 직관
입출력 형태cell 12, 49-50, 63-64좋음. cell 57 ascii 를 그림으로

3 구조 제안

접근 3안

접근서사장점단점
A. 루프 먼저 (추천)obs→policy→action→env 루프를 5분 안에 보여준 뒤 상자를 하나씩 연다초심자가 좌표계를 가짐. action 이 루프의 한 변으로 자연 정의. 재사용 70%Section 재배열 (변수 의존성 재정리)
B. 바닥부터MuJoCo → robosuite → RoboCasa → gym → 데이터 → 모델엄밀로봇이 움직이는 걸 보기까지 너무 오래. MuJoCo 셀 신규 작성·검증 비용
C. 기존 트리밍12 Section 유지, S7/S8/S10 삭제, 서론 추가작업량 최소"다른 분야 대응표" 프레이밍이 남고 action 이 여전히 S3 뒤에 나옴

A 안 Part 구성

Part 0 오늘의 지도 (5분) NEW: 루프 그림, 용어 사전 | cell 5 Part 1 시뮬레이션 (15분) NEW: 4층 스택 그림, state 16-d 표, step=1/20초 셀, reward/success 설명 | cell 10-18 Part 2 Action (20분) ★핵심 NEW: 12-d 컨트롤러 의미 표, 손조종 셀(문제 4), chunk 타임라인 | cell 19-23, 35-45, 50-52 Part 3 학습 데이터 (10분) cell 25-34 압축 Part 4 VLA = pi0.5 (30분) NEW: 눈/머리/손 서사, shape 그림 | cell 2-8, 48-56, 57-69, 73-77 Part 5 루프 닫기 (15분) NEW: Runner queue 그림, rollout 의사코드 | cell 134-153 (Wald 삭제) Part 6 손잡이 돌리기 (20분) cell 179-191, 202-209, 163-172, 194-195, 220 Appendix A~D toy 2D flow (85-101), 학습 4줄 (115-119), flow steps (154-162), 화질 손상 (210-216)

문제 재배치 (19 → 12)

새기존내용Part
1-21-2image 키 / CHW→HWC1-3
33무작위 action2-2
4NEWaction[2]=+0.3 20 스텝 → eef z 기록 (action = delta 임을 체험)2-3
5-64-5dataset image / VLM 재실행 주기2-4, 2-5
7-86-7forward hook / prefix 9684-3
9-1016-17rollout / ci_overlap5
11-1218-19blackout / set_instruction6
삭제12-15전처리기 insert, policy.forward, demo_pre, x_t/u_t (S8 계열)—

신규 산출물 15개

4 Takeaway

의미

기존 노트북은 "측정 방법론까지 갖춘 VLA 해부" 로 완성도가 높지만 서사의 출발점이 "다른 AI 분야에서 온 사람" 이다. 초심자용은 루프 그림 하나를 좌표계로 삼고 action 을 루프의 한 변으로 먼저 정의한 뒤 상자를 여는 순서가 맞다. 코드 자산은 거의 전부 재사용 가능하고, 진짜 새로 필요한 것은 "action 이 env 안에서 어떻게 쓰이는가" 를 보여주는 셀 2개와 그림 6장이다.

제약: 사전계산 자산 전제(PnPCounterToCab, apple_0, layout/style 0, N_ENVS=10, seed 0/40/80, max_steps 500, steps 10 / chunk 25)를 바꾸면 대조가 깨진다. 새 셀은 별도 n_envs=2 env 에서 돌린다.
검증 필요: action 채널의 컨트롤러 의미 (OSC delta / IK / 좌표계). robocasa_env.py:270 이 ik_input_ref_frame="world" 를 설정하므로 실행으로 확인해야 한다. 이 클러스터에는 /opt/vla venv 가 없어 nb1-setup.txt 로 빌드(40~70분) 또는 Elice 런타임이 필요.

5 Next Steps

사용자 승인 대기

접근 A + 가정 5개 (PyTorch 기초는 알고 diffusion 은 모름 / 단일 노트북 2~3시간 / 빈칸 12개 / 스택 유지 / 한국어). 승인 후 Part 0~2 정답본부터 작성.

선행 작업

(1) venv 빌드 또는 Elice 런타임 확보 → 컨트롤러 의미 검증 (≤100 스텝, 로그인 GPU 1장). (2) 빈칸본 생성 스크립트. (3) 그림 6장 SVG 로 assets/ 에.

6 업데이트 — 1시간 수업 기준 v2

사용자 피드백: 이 클러스터에 venv 빌드 / diffusion 은 한 문단 / 수업 1시간 / "루프" 정의 요청 / action 형태·chunk 는 시뮬·VLA 마다 다르니 한 인스턴스만 가르치면 안 됨.

루프 = 정책과 세계가 주고받는 반복

obs = env.reset() for t in range(500): action = policy(obs) # 정책: 관측 → 행동 obs, reward, done, info = env.step(action) # 세계: 행동 → 다음 관측

rollout.py:rollout() 이 정확히 이 루프. action = 매 틱 정책→세계로 건너가는 벡터, 관측 = 세계→정책, 시뮬 = env 구현체, VLA = policy 구현체, chunk = 정책이 여러 틱분을 내고 루프가 소비하는 방식.

action 형태는 (로봇, 컨트롤러, 데이터셋) 이 정하는 계약 — 변이 축

축선택지예
제어 공간관절 vs 작업공간(EEF)ACT/ALOHA 14-d 관절 · RoboCasa/LIBERO/OpenVLA EEF
표현absolute / delta / velocityACT absolute · OpenVLA delta · RoboCasa OSC delta (검증 필요)
좌표계world / base / EEF / cameraRoboCasa 어댑터 ik_input_ref_frame="world"
gripper이진 / 연속 폭RoboCasa {-1,+1} · ALOHA 연속
스케일[-1,1] 정규화 / 물리 단위정규화 통계가 체크포인트에 baked
시간Hz / chunk / 실행 길이20 Hz 50/25 (pi0.5) · ACT 100 · DP 16/8 · OpenVLA chunk 없음
출력 방식연속 회귀 / 이산 토큰pi0.5 flow · OpenVLA 256-bin 토큰
패딩실제 차원 / 다로봇 최대 차원pi0.5 12-d → 내부 32-d

1시간 구조 (본문 ~55 cells, 빈칸 6개)

Part분내용
0 루프5루프 4줄 + 그림. policy+env 로드 셀을 여기서 실행 (3분, 설명 중 돈다)
1 env 와 관측104층 스택, obs dict (카메라·state 16-d 의미·지시문), step=1/20초, success/horizon
2 Action15변이 축 표 + 시뮬 비교표 → 우리 12-d → 무작위 action 영상 → 손조종 셀(delta 체험) → 시연 궤적 → chunk 타임라인
3 pi0.515눈/머리/손 + 파라미터 표 → hook shape 경로 (3/1/10) → "noise 를 10번 다듬는다" 1문단 → state 가 프롬프트 속 → config
4 루프 닫기10Runner 큐 그림 → 사전계산 롤아웃 + 영상 → 눈 가리기 0.000 → 지시문 바꾸기 0.000 (다른 일을 함)
정리5루프 그림에 되붙이기 + 숙제 (Appendix A~F)
남은 결정: 빈칸 6개 유지 vs 전부 읽기용. 시뮬 비교표 수치는 공개 문서 기준 "참고 표" 로 표기 (노트북에서 실측하지 않음).

7 셀 단위 맵 · venv 빌드 · 검증 결과 (v5)

v3~v5 로 흐름을 "루프 → 세계·관측 → action → 데이터셋 → pi0.5 에 들어가는 길 → fine-tuning 왜·어떻게 → 결과" 로 확정하고, 75 cells 셀 맵(claude/260904/plan-notebook_cell_map.md)을 작성했다. 기존 cell 재사용 55 (그대로 14 · 수정 24 · 합침 17), 신규 20, 빈칸 6개(전부 실행됨).

로그인 노드 venv 빌드 (~/vla)

sudo 가 없어 apt 단계를 conda-forge(libglvnd, ffmpeg 7)로 대체, nb1-setup.txt 의 CRLF 와 sudo mkdir 를 사본에서 제거. 3번째 시도 성공. 로그인용 activate_login.sh + 커널 env 패치.

검증 (B200 1장씩, 각 ≤100 스텝)

#결과
V1 action 채널팔 = OSC delta, base 좌표계, ±1 → ±5 cm/스텝(위치) · ±0.5 rad(회전). ch0/1/2 = +x/+y/+z 실측(+0.3×15스텝 → +5.1 cm). gripper ch6 +1 닫기 / −1 열기. 분할: 팔 0-5 · 그리퍼 6 · base 속도 7-9 · torso 10 · 모드 11
V2 0-actiondrift 0, 단일 env 25 ms/스텝
V3/V4 전처리·dataloader6 스텝 이름 동일. dataloader action (2,50,12); 32-d 패딩은 모델 안 (prepare_action)
V7 학습 범위lerobot/pi05_base 에서 3.62B 전체 풀 파인튜닝, 60k 스텝, batch 16, lr 1e-4
V5 30 스텝 (배포 ckpt)loss 0.002~0.17 (이미 파인튜닝돼 낮음), peak 34.5 GB
V5c 30 스텝 (base, bf16)loss 1.35 → 0.07, grad norm 15 → 0.9, 0.80 s/step, peak 34.5 GB. train_bc.py 에 --features-from-dataset, --dtype 추가 (base config 는 openpi 카메라 이름이라 feature 검사에서 죽음)
V6 base zero-shotSR 0.000 (0/10), 전부 500 스텝 타임아웃. 영상: 팔이 크게 휘둘렀다가 아래로 처져 사과 근처에도 안 감. base_zeroshot_seed0 를 notebook_rollouts 에 추가 (mp4 env 0~3)
0.000
base zero-shot SR
0.625
fine-tuned SR (120 ep)
1.35→0.07
30 스텝 loss (base)
34.5 GB
학습 peak

산출물

Part 5 서사 확정: before(base zero-shot 0/10, 휘두르다 처짐) → 30 스텝만에 loss 1.35→0.07 → 60k 스텝 결과 0.625. "시뮬 분포를 본 적 없다 → 그 환경 데이터로 fine-tune" 이 숫자와 영상으로 닫힌다.

8 노트북 정답본·빈칸본 완성 (V8)

scripts/build_notebook.py 가 정답본 01_robot_loop_and_vla_solution.ipynb 를 생성한다 (74 cells = md 41 / code 33, 빈칸 6). 기존 정답본 코드 셀 13개를 인덱스로 재사용하고 마크다운은 초심자용으로 새로 썼다. 빈칸본은 make_student_nb.py 로 생성 (6 블록, 불일치 0).

Part 0 루프 (로드 셀 1개: policy 93 s + env 2개) Part 1 세계·관측 — 4층 스택, obs, state 16-d 표, step = 1/20초 (0-action drift 1.5e-4, 31 ms/스텝) Part 2 Action — 변이 축 표, 12-d 실측 표, 손조종 셀 (z +7.0 cm/1 s, 그리퍼 0.020→0.001→0.033), 무작위 100 스텝, chunk 50/25 Part 3 데이터셋 — 1,293 ep, 에피소드 영상, 12채널 궤적, 우리 지시는 242 개에 없음 Part 4 pi0.5 — 눈/머리/손 + 0.06%, 학습 30 스텝 백그라운드 launch, 전처리 6 스텝, state→프롬프트, dataloader (2,50,12), hook 3/1/10, prefix 968, expert 3줄 Part 5 Fine-tuning — 왜(1문단) + base zero-shot 0/10 영상, 루프 두 개, update_policy 4줄, 30 스텝 로그 loss 1.35→0.07 Part 6 결과 — 7/10 (120 ep 0.625), 성공/실패 영상, blackout 셀(빈칸) + 0/10, "close the drawer" 0/10 정리 — 루프 그림 되붙이기, 심화판 대응표, 숙제 3개
검증결과
nbconvert --execute 전체0 에러, 529 s (로그인 GPU 2). 1차 시도는 커널 spec 의 MUJOCO_EGL_DEVICE_ID=0 vs CUDA_VISIBLE_DEVICES=2 불일치로 import 실패 → 로그인 전용 커널 spec 으로 재실행 (Elice 단일 GPU 는 해당 없음)
빈칸본6 블록 재현 검증 통과. 정답본 2.0 MB (영상 base64) / 빈칸본 98 KB
빌더 ↔ 실행본 소스 일치True (빌더가 단일 진실 소스)
배포 전 확인: Elice setup 에 lerobot/pi05_base(14.5 GB) 추가 — 없으면 Part 5 의 30 스텝 셀이 미리 잰 로그로 자동 폴백. GPU 예산 7.5 + 34.5 GB. 1시간 리허설로 Part 별 시간 확인. README 갱신 미완.

9 수강생 자체 설치 · verify 버그 · 영어판

배포 방식이 "각자 연구실 GPU 머신에 설치" 로 확정되어 setup/install.sh(sudo 없으면 micromamba 로 libEGL/libGL/ffmpeg 를 개인 디렉터리에)를 만들고, 이 클러스터의 새 경로 ~/vla_test 에서 처음부터 설치해 6단계 통과, verify_runtime.sh 5항목 통과를 확인했다.

발견한 버그: 원본 verify_runtime.sh 는 검사 코드를 python - <<EOF(stdin)로 실행한다. spawn 된 MuJoCo 서브프로세스가 __main__ 을 '<stdin>' 경로에서 재import 하려다 FileNotFoundError → 모든 학생이 겪었을 실패. 임시 파일 + __main__ 가드로 수정, KO/EN 재테스트 통과.

영어판 nb1-code-en/: 노트북(74 cells, 6 problems, nbconvert 0 에러 375 s, 실행 출력에 한글 0줄), 그림 6장, README, install/verify/kernel 스크립트, 헬퍼 사용자 노출 문자열, vision_stress.json 조건 이름까지 영어. 자연스러운 강사 문체로 작성. 남은 한국어는 vla_lecture/ 내부 주석뿐.

6/6
install.sh 단계 (no-sudo)
5/5
verify_runtime 검사
0
EN 노트북 에러 / 한글 줄
3.2 MB
zip (KO / EN 각각)
남은 것: sudo+apt 경로 미테스트(학생 1명 리허설 권장) · 1시간 리허설 · 마크다운을 원문 유지 쪽으로 되돌릴지 결정 · vla_lecture/ 주석 영어화 여부.