lerobot/smolvla_base를 SO-101 단일팔 픽앤플레이스 데이터셋 Masterji/dataset으로
파인튜닝한 SmolVLA 정책입니다. 이 저장소는 eval loss 최저 체크포인트(step 3500)입니다.
- 태스크 문장:
Pick up the eclipse and place it on the box
- 데이터: 30 에피소드 중 0~26번(27개)으로 학습, 27~29번(3개)은 held-out 평가용
- 관측:
observation.state(6), 카메라 top·wrist(640×480) → 정책 입력 camera1·camera2로 매핑
- 액션: 6관절 위치(shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll, gripper)
학습 조건
| 항목 |
값 |
| 기반 모델 |
lerobot/smolvla_base (전체 450M, 학습 100M — 비전 인코더 고정, action expert 학습) |
| 스텝 / 배치 |
10000 / 8 |
| 학습률 |
0.0001 (warmup 333, cosine decay 10000 — lerobot 자동 스케일) |
| chunk_size / n_action_steps |
50 / 50 |
| eval·저장 주기 |
500 스텝 |
| seed |
1000 |
| 장비 |
RTX 5050 Laptop 8GB, lerobot 0.6.1 |
held-out eval loss
flow matching 손실이라 노이즈·시간 표본에 따라 값이 흔들립니다. 다른 모델의 손실과 직접 비교할 수 없습니다.
| step |
eval_loss |
| 500 |
0.3220 |
| 1000 |
0.2762 |
| 1500 |
0.2240 |
| 2000 |
0.2592 |
| 2500 |
0.2700 |
| 3000 |
0.2380 |
| 3500 |
0.2174 ← 최저 |
| 4000 |
0.2222 |
| 4500 |
0.2254 |
| 5000 |
0.2552 |
| 5500 |
0.2637 |
| 6000 |
0.2790 |
| 6500 |
0.2836 |
| 7000 |
0.2703 |
| 7500 |
0.2836 |
| 8000 |
0.2829 |
| 8500 |
0.3073 |
| 9000 |
0.3040 |
| 9500 |
0.3018 |
| 10000 |
0.3014 |
체크포인트 비교
eval loss가 가장 낮은 체크포인트와 최종 체크포인트를 같은 held-out 표본·같은 시드로 비교했습니다. 값은 액션 청크의 평균 절대 오차(관절 도, 그리퍼는 0~100 범위)입니다. flow matching의 eval loss와 실제로 샘플링한 액션의 오차는 순위가 다를 수 있어 둘을 함께 적습니다.
| 체크포인트 |
eval_loss |
h1 (seed 0) |
h1 (seed 1) |
h50 (seed 0) |
h50 (seed 1) |
| step 3500 |
0.2174 |
3.20 |
3.04 |
6.73 |
6.80 |
| step 10000 |
0.3014 |
2.35 |
2.22 |
6.54 |
6.62 |
| 귀무모형(현재 자세 유지) |
— |
3.36 |
3.36 |
15.76 |
15.76 |
이 체크포인트의 오프라인 평가 (seed 0, held-out 에피소드 [27, 28, 29], 표본 80개)
50스텝 액션 청크의 평균 절대 오차입니다. 단위는 관절 도(그리퍼는 0~100 범위). 귀무모형은 현재 관절 상태를 그대로 유지한다고 가정한 값입니다.
| 지평 |
이 체크포인트 |
귀무모형(현재 자세 유지) |
| 1 |
3.20 |
3.36 |
| 10 |
4.05 |
6.06 |
| 30 |
5.71 |
11.50 |
| 50 |
6.73 |
15.76 |
관절별 50스텝 평균 오차: shoulder_pan.pos 4.70, shoulder_lift.pos 9.08, elbow_flex.pos 9.71, wrist_flex.pos 6.92, wrist_roll.pos 5.13, gripper.pos 4.85
오프라인 오차는 실로봇 성공률이 아닙니다. 실제 성능은 로봇에서 반복 시도로 확인해야 합니다.
추론
녹화 때와 같은 카메라 이름(top, wrist)과 같은 태스크 문장을 써야 합니다. 카메라 이름 매핑과 정규화는 체크포인트의
전처리기에 저장되어 있어 따로 처리하지 않습니다.
lerobot-rollout \
--strategy.type=base \
--policy.path=mmporong/smolvla_masterji_27E_3500S \
--robot.type=so101_follower --robot.port=<팔로워 포트> --robot.id=<보정 id> \
--robot.cameras="{ top: {type: opencv, index_or_path: <top 카메라>, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: <wrist 카메라>, width: 640, height: 480, fps: 30} }" \
--task="Pick up the eclipse and place it on the box" --duration=60