← Index
2026-10-14 — Experiment

FurnitureBench one_leg 실패→회복 궤적 생성 v1

RoboTTA | scripted v2 + ε_bias / ε_iid | job 192392

TL;DR

6/6
b12 usable
2.83
b15_dec 평균 실패
4/6
iid4 usable
11:48
30 ep / 1 GPU
전체 영상(66 ep, 버튼으로 실패/loss 시작/안착 이동): 261014-recovery_gen_videos.html

1배경/목적

AD^ε식 실패→회복 데이터를 실제로 뽑아서, 실패가 영상에 보이는지와 회복이 자연스러운지 확인한다.

2작업 내용

gen_recovery.py: LegV2 _measure를 감싸 opening + b로 믿게 한다. 채점은 참 geometry. 실패 이벤트(align/descend/settle → backoff/recover)마다 attempt += 1, b·schedule[attempt]. ε_iid는 align/descend에서만 넣는다.

3결과

config안착usable평균 실패실패 시 참 lateral (mm)
b8 (1,0)5/65/60.836.3~15.5
b12 (1,0)6/66/61.09.7~14.5
b15_dec (1,0.5,0)6/66/62.8312~26
iid46/64/60.832.5~13.7
b12_iid36/66/61.06.5~14.1
b12 seed 1: 실패(t=205~229, b=12mm) → 교정(t=240~285). 각 칸 왼쪽 wrist, 오른쪽 front.
b15_dec seed 0: 실패 3회 후 t=376 안착. 세 번째 실패는 b=0 상태.
iid4 seed 5: 노이즈로 wrist 시점이 크게 흔들리고, 마지막에 21° 기운 채 안착.
b8 seed 0은 bias와 무관한 transport 실패였다. 스모크의 같은 seed는 성공했으므로 시뮬이 비결정적이다.

4Takeaway

생성 파이프라인 동작, b12 계열은 그대로 AD 데이터로 쓸 수 있다.
실패의 시각 신호가 약하다(wrist의 구멍 테두리 위치뿐).

5Next

실패 프레임에서 b 방향 가독성 정량화 → 신호 강화(b 15~20mm, rim에서 더 누르기, 부분 교정) → converter에 loss_start_step 추가 → 규모 확장.

6업데이트 — v2 실패 신호 강화 (job 192476)

configusable평균 실패영상 판정
b185/61.0중간
b22 (1,0)6/61.17wrist에 구멍 테두리 전체가 leg 옆에 보임
b20_dec (1,0.5,0)6/62.33테두리가 시도마다 leg 쪽으로 다가옴
b12_press6/61.0누르는 동안 변화 없음
b20_drop / b25_drop1/6 / 3/6—쓰러짐은 잘 보이나 621~1321 step
b22 s1: t=205~236 실패(테두리 전체가 보임) → t=250~300 교정 후 안착.
b20_dec s3: b=20 → 10 → 0, 테두리가 점점 leg 쪽으로.
b12_press s3: 누르는 동안(t=223~238) 프레임 변화 거의 없음.
b25_drop s2: release 후 leg가 쓰러져 전체 재운반(t=300~621).
b ≥ 20 mm가 데이터 설정 후보. b20_dec가 AD^ε 스케줄과 가장 잘 맞는다.

7업데이트 — v3 in-context 개선 곡선 (job 192537)

숨은 변수의 종류보다 "시도할수록 점점 나아지는" 형식이 핵심이라는 방향에 맞춰, b0 = 24 mm에서 시도마다 b를 줄였다. loss는 첫 시도를 context로 쓰고 이전보다 나아진 시도 전부에 건다(AD 방식).

config안착단조 개선시도 수나아진 시도
lin56/66/65~625/25
lin46/66/6418/18
lin36/66/6312/12
geo46/65/64~619/20
lin4_iid6/66/64~520/20
iid_lin4 (노이즈만)5/61/61~411/15
lin5 s2: 시도별 최근접 순간. 최근접 오차 20.6 → 16.4 → 10.7 → 4.7 → 0.1 mm(안착). wrist의 구멍 테두리 원호가 시도마다 줄어든다.
bias 스케줄 30 ep 중 29개가 단조 개선. 노이즈만으로는 곡선이 생기지 않는다.
b=0 이후 rim에서 튕기면 길어진다(lin5 s5 1049 step). 변환할 때 길이 상한이 필요하다.

8업데이트 — 대량 생성 · 변환기 · anchor 필터 · p768 학습 smoke

action은 history에 들어가지 않는다. history는 clean video latent(num_clean_frames)뿐이고, proprio는 현재 시점 1개([B, D])뿐이다. action은 anchor부터 시작하는 미래 chunk 32 step만 학습 타깃으로 쓴다. 실패 시도의 action은 영상으로만 history에 남는다.

구현

확인 항목결과
smoke 1 ep (lin2, b0 19mm)실패 1회(17.9mm) → 안착 0.12mm @210 → 조립 473 frame, 31 s, npz 12 MB
anchor[161, 473) 312개(66%). 시도 0인 frame 0–160은 context 전용
단위 테스트pass: 원래 175,145 frame 전부 anchor. 시도 0이나 개선 없는 시도를 감독하는 창 0개. action chunk가 생성기 action과 일치. history에 시도 0 frame 161개 포함
p768 학습 smoke, batch 6OOM 178 GB (2 cam 224×448 → robocasa보다 token 2배)
p768 학습 smoke, batch 2정상, 피크 94 GB, loss 1.64→1.26 (5 step), sampler dataset_uniform groups=2
p768에서는 GPU당 batch가 2라 4 GPU 기준 accum 16이 필요하다. p48 학습과 같은 update 수를 하면 비용이 크게 늘어나므로 학습 예산을 먼저 정해야 한다.

진행 중: 대량 생성 job 192818–192821(seed 1000–1415, 416 ep, GPU 1장당 8 process, core-own).

9업데이트 — 대량 생성 결과 · fine-tune 제출

416
생성 episode
95.2%
안착
75.5%
단조 개선
348
필터 통과 예상
항목값
생성 job192818–192821, GPU 4장, 각 1:21–1:25
안착 / 전체 조립 / usable396 / 353 / 395 (총 416)
seat framemedian 399, max 1469. 768 초과 13개
통과율 낮은 curriculumlin5_iid 16/22, geo5_iid 18/26 (시도가 많으면 seat가 늦거나 조립 미완)
CPU 변환 job 192999가 template 기본값 --gres=gpu:8을 물려받아 대기 → --gres=gpu:0으로 193006 재제출.
변환 (193006, 4:39)결과
통과 / 탈락348 통과. 탈락: 조립 미완 43, 미안착 20, 안착 늦음 5
frame / anchor248,689 frame, anchor 154,778 (62.2%), context 전용(시도 0) 93,487
단위 테스트 (전체 데이터)pass: 금지 창 0개, 무작위 8 샘플 action chunk 일치, history에 시도 0 frame 236–348개
공통: INIT = p48 최종 step_013690.pt (weights만), p768, 4 GPU × batch 2 × accum 8 = 64, 3000 step, cosine lr 5e-5, p48 dataset_stats.json 고정(정규화 일치) (A) 193004 lwam_fb_rec_ft : original + recovery 1:1 (after 192079, 193006) (B) 193005 lwam_fb_ctrl_ft: original only 대조군 (after 192079)
fine-tune 시작 (18:09 UTC): 두 run 모두 step_013690.pt + p48 norm stats 로드 확인. 0.04 step/s (2.7 samples/s, GPU util ~90%, GPU bound) → 3000 step ETA ~20 h. step 30 action loss: recovery 0.268, control 0.195 (p48 최종 0.011 대비 높음 → 768 frame history를 처음 넣은 영향, 두 run 공통).