Views
No views yet
| Trunk | DINOv2 ViT-S/14, frozen (22,056,576 params, 0 trainable) |
| Head | SmolVLA action expert, 16 layers, width 216 |
| Objective | flow matching |
| Action attention | bidirectional |
| Trainable params | 11,765,190 |
| Final train loss | 0.010001 |
| Final held-out loss | 0.052711 |
phi_so101_cubes_cylinder_recovery_v1: 143 episodes (120 teleop + 23 learning-from-failure recovery),
81,943 frames, 30 fps, 3 cameras (wrist, front, top). 113 train / 30 held-out episodes.input 3 cameras x 2 timesteps, 240x320 RGB
-> crop 210x280 -> DINOv2 patch 14 -> 15x20 = 300 tokens x 384 per camera
-> 900 patch tokens + 1 state token = 901 per frame
-> memory (B, 1802, 384)
output action chunk (B, 24, 6) 24 steps x 6 joints, degreesnn.Module, so the model classes must be importable. Code and a
runnable infer.py are in the companion repo.1import torch, einops
2model = torch.load("model_final.pt", map_location="cpu", weights_only=False).eval()
3# obs: (B, 2, 3, 3, 210, 280) float in [0,1], cameras in wrist/front/top order
4tokens = encoder(obs) # (B,2,3,300,384)
5flat = einops.rearrange(tokens, "N T V P E -> N T (V P) E")
6state = torch.zeros(B, 2, 1, 6) # normalized joint positions
7action, _, _ = model(flat, state, None) # (B, 24, 6) in degrees| pair | causal | bidirectional |
|---|---|---|
| ppformer + DDPM | 0.037980 | 0.016703 |
| ppformer + flow | 0.067604 | 0.042783 |
| expert8w288 + flow | 0.079359 | 0.051919 |
| expert16w216 + flow | 0.081903 | 0.052711 |