01_sim_and_vla_solution.ipynb (RoboCasa + pi0.5) 분석 → "루프 먼저" 구조 제안env.step 내부(컨트롤러→물리), 시뮬 4층 구조, reward/success 계약, action queue 동작, 초심자용 프레이밍.기존 노트북은 SK 2026 비전 강의 시리즈의 하루치 실습이다 ("5일차에 구현한 DDPM" 을 전제). 이번 목표는 로보틱스를 처음 접하는 신입생·연구실 신입에게 다음 넷을 직관적으로 이해시키는 자료다.
| Sec | 제목 | cell | 문제 | 초심자용 판정 |
|---|---|---|---|---|
| 1 | pi0.5 의 구성 / 파라미터 분포 | 2-8 | 재사용 Part 4-2 | |
| 2 | RoboCasa 시뮬레이터와 관측 | 10-24 | 1-3 | 재사용 Part 1, 2-2 |
| 3 | robocasa-H50 데이터셋 | 25-45 | 4 | 재사용 Part 2-4, 3 (압축) |
| 4 | 트랜스포머 두 개 / config / state→prompt | 46-56 | 5 | 재사용 Part 2-5, 4-4, 4-6 |
| 5 | forward hook shape 추적 | 57-72 | 6-7 | 재사용 Part 4-3 |
| 6 | flow 적분 루프 세 줄 | 73-77 | 재사용 Part 4-5 | |
| 7 | flow matching vs DDPM + toy 2D | 78-102 | 8-11 | Appendix A DDPM 비교는 삭제 |
| 8 | 학습 코드 / 전처리 순서 / 30 스텝 | 103-131 | 12-15 | 삭제 4줄 루프만 Appendix B |
| 9 | 롤아웃 / Wilson CI / 영상 | 132-153 | 16 | 재사용 Part 5 (Wald 유도 삭제) |
| 10 | ablation: flow steps | 154-162 | 17 | Appendix C ci_overlap 만 Part 5-4 |
| 11 | ablation: n_action_steps | 163-178 | 재사용 Part 6-3 (압축) | |
| 12 | 관측 손상 강건성 (19조건) | 179-220 | 18-19 | 재사용 Part 6-1, 6-2 핵심 2조건 + 요약 그래프 |
_image 중복, CHW/HWC, float32 vs uint8)sample_actions 세 줄, state 가 프롬프트 문자열에 들어간다는 실측 (cell 53-56)RUN_* 플래그 + 사전계산 폴백 패턴| 목표 | 기존 커버리지 | 빠진 것 |
|---|---|---|
| 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 를 그림으로 |
| 접근 | 서사 | 장점 | 단점 |
|---|---|---|---|
| A. 루프 먼저 (추천) | obs→policy→action→env 루프를 5분 안에 보여준 뒤 상자를 하나씩 연다 | 초심자가 좌표계를 가짐. action 이 루프의 한 변으로 자연 정의. 재사용 70% | Section 재배열 (변수 의존성 재정리) |
| B. 바닥부터 | MuJoCo → robosuite → RoboCasa → gym → 데이터 → 모델 | 엄밀 | 로봇이 움직이는 걸 보기까지 너무 오래. MuJoCo 셀 신규 작성·검증 비용 |
| C. 기존 트리밍 | 12 Section 유지, S7/S8/S10 삭제, 서론 추가 | 작업량 최소 | "다른 분야 대응표" 프레이밍이 남고 action 이 여전히 S3 뒤에 나옴 |
| 새 | 기존 | 내용 | Part |
|---|---|---|---|
| 1-2 | 1-2 | image 키 / CHW→HWC | 1-3 |
| 3 | 3 | 무작위 action | 2-2 |
| 4 | NEW | action[2]=+0.3 20 스텝 → eef z 기록 (action = delta 임을 체험) | 2-3 |
| 5-6 | 4-5 | dataset image / VLM 재실행 주기 | 2-4, 2-5 |
| 7-8 | 6-7 | forward hook / prefix 968 | 4-3 |
| 9-10 | 16-17 | rollout / ci_overlap | 5 |
| 11-12 | 18-19 | blackout / set_instruction | 6 |
| 삭제 | 12-15 | 전처리기 insert, policy.forward, demo_pre, x_t/u_t (S8 계열) | — |
_build_proprioceptive_state 근거), action 12-d 컨트롤러 의미 (실행 검증 필요)기존 노트북은 "측정 방법론까지 갖춘 VLA 해부" 로 완성도가 높지만 서사의 출발점이 "다른 AI 분야에서 온 사람" 이다. 초심자용은 루프 그림 하나를 좌표계로 삼고 action 을 루프의 한 변으로 먼저 정의한 뒤 상자를 여는 순서가 맞다. 코드 자산은 거의 전부 재사용 가능하고, 진짜 새로 필요한 것은 "action 이 env 안에서 어떻게 쓰이는가" 를 보여주는 셀 2개와 그림 6장이다.
n_envs=2 env 에서 돌린다.robocasa_env.py:270 이 ik_input_ref_frame="world" 를 설정하므로 실행으로 확인해야 한다. 이 클러스터에는 /opt/vla venv 가 없어 nb1-setup.txt 로 빌드(40~70분) 또는 Elice 런타임이 필요.접근 A + 가정 5개 (PyTorch 기초는 알고 diffusion 은 모름 / 단일 노트북 2~3시간 / 빈칸 12개 / 스택 유지 / 한국어). 승인 후 Part 0~2 정답본부터 작성.
(1) venv 빌드 또는 Elice 런타임 확보 → 컨트롤러 의미 검증 (≤100 스텝, 로그인 GPU 1장). (2) 빈칸본 생성 스크립트. (3) 그림 6장 SVG 로 assets/ 에.
사용자 피드백: 이 클러스터에 venv 빌드 / diffusion 은 한 문단 / 수업 1시간 / "루프" 정의 요청 / action 형태·chunk 는 시뮬·VLA 마다 다르니 한 인스턴스만 가르치면 안 됨.
rollout.py:rollout() 이 정확히 이 루프. action = 매 틱 정책→세계로 건너가는 벡터, 관측 = 세계→정책, 시뮬 = env 구현체, VLA = policy 구현체, chunk = 정책이 여러 틱분을 내고 루프가 소비하는 방식.
| 축 | 선택지 | 예 |
|---|---|---|
| 제어 공간 | 관절 vs 작업공간(EEF) | ACT/ALOHA 14-d 관절 · RoboCasa/LIBERO/OpenVLA EEF |
| 표현 | absolute / delta / velocity | ACT absolute · OpenVLA delta · RoboCasa OSC delta (검증 필요) |
| 좌표계 | world / base / EEF / camera | RoboCasa 어댑터 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 |
| Part | 분 | 내용 |
|---|---|---|
| 0 루프 | 5 | 루프 4줄 + 그림. policy+env 로드 셀을 여기서 실행 (3분, 설명 중 돈다) |
| 1 env 와 관측 | 10 | 4층 스택, obs dict (카메라·state 16-d 의미·지시문), step=1/20초, success/horizon |
| 2 Action | 15 | 변이 축 표 + 시뮬 비교표 → 우리 12-d → 무작위 action 영상 → 손조종 셀(delta 체험) → 시연 궤적 → chunk 타임라인 |
| 3 pi0.5 | 15 | 눈/머리/손 + 파라미터 표 → hook shape 경로 (3/1/10) → "noise 를 10번 다듬는다" 1문단 → state 가 프롬프트 속 → config |
| 4 루프 닫기 | 10 | Runner 큐 그림 → 사전계산 롤아웃 + 영상 → 눈 가리기 0.000 → 지시문 바꾸기 0.000 (다른 일을 함) |
| 정리 | 5 | 루프 그림에 되붙이기 + 숙제 (Appendix A~F) |
v3~v5 로 흐름을 "루프 → 세계·관측 → action → 데이터셋 → pi0.5 에 들어가는 길 → fine-tuning 왜·어떻게 → 결과" 로 확정하고, 75 cells 셀 맵(claude/260904/plan-notebook_cell_map.md)을 작성했다. 기존 cell 재사용 55 (그대로 14 · 수정 24 · 합침 17), 신규 20, 빈칸 6개(전부 실행됨).
~/vla)sudo 가 없어 apt 단계를 conda-forge(libglvnd, ffmpeg 7)로 대체, nb1-setup.txt 의 CRLF 와 sudo mkdir 를 사본에서 제거. 3번째 시도 성공. 로그인용 activate_login.sh + 커널 env 패치.
| # | 결과 |
|---|---|
| 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-action | drift 0, 단일 env 25 ms/스텝 |
| V3/V4 전처리·dataloader | 6 스텝 이름 동일. 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-shot | SR 0.000 (0/10), 전부 500 스텝 타임아웃. 영상: 팔이 크게 휘둘렀다가 아래로 처져 사과 근처에도 안 감. base_zeroshot_seed0 를 notebook_rollouts 에 추가 (mp4 env 0~3) |
scripts/make_student_nb.py — 정답본→빈칸본, 기존 쌍으로 19블록 재현 검증scripts/precompute_base_zeroshot.py — before 영상 사전계산assets/fig_{loop,sim_stack,chunk_timeline,preprocess,pi05_shapes,action12}.svg — 6장, Noto CJK 렌더로 겹침 확인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).
| 검증 | 결과 |
|---|---|
| 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 (빌더가 단일 진실 소스) |
lerobot/pi05_base(14.5 GB) 추가 — 없으면 Part 5 의 30 스텝 셀이 미리 잰 로그로 자동 폴백. GPU 예산 7.5 + 34.5 GB. 1시간 리허설로 Part 별 시간 확인. README 갱신 미완.배포 방식이 "각자 연구실 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/ 내부 주석뿐.
vla_lecture/ 주석 영어화 여부.