Index
2026-09-04 ~ 09-06 — Progress

LingBot-VA FurnitureBench 학습 config 통합

lingbot-va | wan_va/configs — RoboCasa 조사(260812) 이후 실제 학습 대상이 FurnitureBench로 전환

TL;DR

7
신규 config 파일
3
학습 규모 단계
8
최대 GPU (e128)

1 배경 / 목적

260812 조사(claude/context.md)에서는 RoboCasa 데이터로 LingBot-VA를 post-training하는 것이 목표였고, VAE latent 추출 스크립트 부재·lingbot-va-base 미다운로드 등 blocker 2개가 남아 있었다. 이번 3일 사이 실제 코드 변경은 RoboCasa가 아니라 FurnitureBench 시뮬레이터 데이터(~/repos/Robotics/FurnitureBench)를 대상으로 진행됐다 — RoboCasa 경로의 blocker를 풀지 않고, 이미 LeRobot latent 추출 파이프라인이 갖춰진 FurnitureBench 쪽으로 실질적인 첫 학습 대상을 옮긴 것으로 보인다.

기존 한계: 베이스 config인 va_libero_cfg는 LIBERO 전용 카메라 키·action 채널 가정이 박혀 있어, 다른 데이터셋(FurnitureBench)에 그대로 재사용할 수 없었다.

2 작업 내용

va_libero_cfg를 베이스로 FurnitureSim(Franka 단일 팔, front+wrist 2캠, 10Hz) 규격에 맞춘 config 체인을 만들고, 규모를 단일 가구 → 4종 가구 합본 → 대형 배치 순으로 단계적으로 확장했다.

Step 1 — 베이스: va_furniture_cfg.py (128×128, one_leg)

action_dim=30, used_action_channel_ids=range(0,7) # [dpos3, axis-angle3, gripper] action_per_frame=4 (10fps 기준 stride 1) obs_cam_keys=['image','wrist_image'] norm_stat: q01/q99는 furniture_sim/one_leg_low 7-D action 실측값 q01=[-0.114,-0.112,-0.076,-0.166,-0.595,-1.591,-1.0]+[0.]*23 q99=[ 0.116, 0.114, 0.076, 0.500, 1.152, 1.652, 1.0]+[0.]*23

Step 2 — 학습/스모크 분리: va_furniture_train_cfg.py / va_furniture_smoke_cfg.py

batch_size=1 고정 (데이터로더가 에피소드 전체를 가변 길이 latent로 반환하므로 default_collate로 stack 불가 — LIBERO 레시피와 동일한 제약을 그대로 승계). 학습은 batch 1 × grad-accum 10 × 2GPU, smoke는 wandb 끄고 6 step만 실행하는 로그인 노드 디버깅용.

Step 3 — 4종 가구 합본: va_furniture_all_cfg.py / _train_cfg / _smoke_cfg

one_leg/lamp/round_table/cabinet 4종을 합친 all_low 데이터셋(1,304 episodes, one_leg의 3.8배)용 norm_stat을 prepare_lingbot_dataset.py가 만든 norm_stat.json에서 동적으로 읽어오도록 변경 (파일 없으면 one_leg 값으로 fallback + 경고 출력). 4-GPU × batch1 × accum10 = effective batch 40, 10K step로 one_leg 학습(5K×20=100K clips)과 동일한 총 노출량(10K×40=400K)을 맞춤.

Step 4 — Effective batch 128 레시피: va_furniture_all_e128_train_cfg.py

같은 프로젝트의 X-WAM/pi0.5 실험에서 effective batch ~128 + lr 3e-5가 성능에 결정적이었다는 관찰(코드 주석에 명시)을 반영해 8-GPU × batch1 × accum16 = 128로 확장, lr 1e-5→3e-5, warmup 10→200 step. 3K step × 128 = 384K episode-samples로 all_low 학습(10K×40=400K)과 총 노출량을 맞춤.

wan_va/configs/__init__.py — VA_CONFIGS에 7개 키 등록: 'furniture', 'furniture_train', 'furniture_smoke', 'furniture_all', 'furniture_all_train', 'furniture_all_smoke', 'furniture_all_e128'

3 결과

Config데이터셋GPUEffective batchStepslr
furniture_trainone_leg_low (344 eps)2205,0001e-5
furniture_all_trainall_low (1,304 eps)44010,0001e-5
furniture_all_e128all_low (1,304 eps)81283,0003e-5
실사용 확인: 세 config 모두 실제 SLURM 학습 잡(train_lingbot.sh 2/4/8 <config>)으로 구동됐고, furniture_all_e128 기준 현재 step ~1,232/3,000, latent_loss 0.077, action_loss 0.016까지 진행(로컬 wandb/ 로그 run-20260906_224058-qazsnw7i 기준).
미검증: furniture_all_e128은 preemption이 잦아(아래 관련 카드 참고) 3,000 step 완주 전이라, e128 레시피 자체가 batch40 레시피보다 나은지는 아직 판단 불가.

4 Takeaway

의미

프로젝트의 실질적 학습 대상이 claude/context.md에 기록된 RoboCasa 계획과 별개로 FurnitureBench로 이동했다. RoboCasa 경로는 VAE latent 추출 스크립트 부재가 blocker였는데, FurnitureBench 쪽은 scripts/lingbot/extract_latents.sh·prepare_lingbot_dataset.py가 이미 존재해 그 blocker를 우회한 것으로 보인다. config 체인이 3단계로 깔끔하게 확장 가능한 구조(공유 베이스 → override)로 짜여 있어, 추가 가구 종류나 배치 크기 스윕을 붙이기 쉬운 상태다.

5 Next Steps

미해결 한계

claude/context.md가 RoboCasa 조사 시점(260812)에 멈춰 있어 FurnitureBench 전환이 문서에 반영되지 않음. 다음 작업 로그 작성 시 Goal/Approach/Active Experiments 갱신 필요.

다음 실험

furniture_all_e128 3,000 step 완주 후 furniture_all_train(batch40, 1e-5)과 4종 가구별 success rate 비교 — effective batch 128 가설이 X-WAM/pi0.5와 동일하게 여기서도 성립하는지 확인.