Skip to page content
SAVRN
Search Plan a project

Open-weight model · Robotics

spiral-so101-rlt12-stage1-beta-teleop57-dagger44-rm1fix12-fresh-1500

by Nadeem Shoukath Nadeem-Shoukath115113/spiral-so101-rlt12-stage1-beta-teleop57-dagger44-rm1fix12-fresh-1500

spiral-so101-rlt12-stage1-beta-teleop57-dagger44-rm1fix12-fresh-1500 is an open-weight model for robotics from Nadeem Shoukath, released under Apache License 2.0. Its published files total 731.7 MB.

SPIRAL round 1 as Algorithm 1 stage 2b defines it (π₁'s own fine-tuning data, labelled by RM1), repeated at four values of betabc, one run per beta, everything else fixed.

Parameters—
Context—
Weights731.7 MB
Licenseapache-2.0
AccessOpen weights
Monthly Downloads—

Model Card

By Nadeem Shoukath, published under apache-2.0, revision 6841c21d608e.

SPIRAL round 1 as Algorithm 1 stage 2b defines it (π₁'s own fine-tuning data, labelled by RM1), repeated at four values of betabc, one run per beta, everything else fixed. A residual actor and a 5-critic ensemble on top of a FROZEN π₀.₅ + RLT policy; actor and critics both start fresh. Not robot-evaluated; the offline critic probes have not been run. All four are identical except betabc (checked in each rlconfig.json). Caveat for beta 70 and 100: with a fresh actor the residual starts large (random init) and has to shrink to the value set by the critic. At beta 5 and 15 it settles (residual × beta ≈ 0.035, the critic's slope on this data), but at beta 70 and 100 it was still falling at step…

Read Nadeem Shoukath's full model card

SPIRAL on rlt12 stage 3: stage-1 (round 1) beta sweep 5 / 15 / 70 / 100 on π₁'s own data (57 teleop + 44 DAgger RLT_1, RM1 fix12), 1,500 steps

SPIRAL round 1 as Algorithm 1 stage 2b defines it (π₁'s own fine-tuning data, labelled by RM1), repeated at four values of beta_bc, one run per beta, everything else fixed. A residual actor and a 5-critic ensemble on top of a FROZEN π₀.₅ + RLT policy; actor and critics both start fresh.

repo / step
base policy (required, not included) Nadeem-Shoukath115113/pi05-so101-rlt12-lehome-s3-daggerrlt1-15fps-b32-10k, step 9999 (vla_params + rlt_params)
this repo beta5/, beta15/, beta70/, beta100/, each holding step_00001499 (final); action_cholesky.npy (shared)
related r1b (same data, beta 30, 5,000 steps, MC 0.5, target smoothing on): Nadeem-Shoukath115113/spiral-so101-rlt12-lehome-r1b-teleop57-daggerrlt1-rm1fix12-b30-mc05-bs32-5k

Not robot-evaluated; the offline critic probes have not been run.

The four checkpoints

All four are identical except beta_bc (checked in each rl_config.json).

folder beta_bc W&B (spiral-rlt12-stage1-beta) residual size at step 100 → 300 → 1400 residual × beta at 1400 Q(actor) − Q(base) at 1400
beta5/step_00001499 5 up4f3x0r 0.0213 → 0.0086 → 0.0069 0.034 0.00048
beta15/step_00001499 15 ndwoxn6x 0.0113 → 0.0038 → 0.0024 0.036 0.00015
beta70/step_00001499 70 vx76htg2 0.0074 → 0.0021 → 0.00088 0.062 0.00003
beta100/step_00001499 100 wjsxqfh2 0.0070 → 0.0020 → 0.00077 0.077 0.00002

Caveat for beta 70 and 100: with a fresh actor the residual starts large (random init) and has to shrink to the value set by the critic. At beta 5 and 15 it settles (residual × beta ≈ 0.035, the critic's slope on this data), but at beta 70 and 100 it was still falling at step 1,499: the critic-set value would be about 0.0005 and 0.00035. Part of their residual is therefore left over from initialisation, not the critic's direction. Both are still tiny corrections.

The critics of the four runs are the same to 3 decimals (at step 1400: critic loss 0.0017, Q min / mean / max ≈ 0.48 / 0.851 / 0.979, best-of-4 selection gain 0.0005).

Data

local/r1b_teleop57_daggerrlt1_rm1fix12: 101 episodes / 37,813 frames, 15 fps; the same data r1b used and π₁ (the base) was fine-tuned on:

episodes source driven by
0–56 57 teleop demos (so101_tshirt_clean57) human, all successes
57–100 dagger_session_RLT_1 (44 eps, 85 takeovers, 4 with no takeover) stage-2 policy + human takeovers, all end in success

Same episodes and states as π₁'s training set local/teleop57_daggerrlt1_v21 (checked frame by frame), minus the last frame of each episode, which the labeller drops.

Labels: RM1 (sarm2_gripper58), fix12: opensarm/tools/label_for_spiral.py --stride 15 --smoother-mode none --write-progress --task "Fold the long sleeved T-shirt on the table" --rm-instruction "Fold the T-shirt on the table". Final progress 0.90–0.97 in every episode; MC target 0.871 ± 0.056; 4.2% of per-step rewards are negative. There are no failed endings in this data, so the critic's target is nearly constant.

Training

code branch lehome-noise-norm @ f79f191, plus uncommitted additions: preset residual_rl_pi05_so101_rlt12_r1b_rm1fix12; logged metric actor/q_gain_select_best_of_k
init actor fresh, 5 critics + targets fresh
features RLT z_rl (2048) + state (12)
action dim / horizon 12 (all deltas, grippers included) / 20
beta (BC regulariser) 5 / 15 / 70 / 100, one separate run each
critic target 0.45 MC + 0.55 TD, gamma 0.9995
MC return progress[last frame] × 0.9995^steps_remaining
target smoothing off (sigma 0)
kappa / critics / tau / n_step 4 / 5 / 0.005 / 3
actor / critic 3×1024 / 3×1024, residual output scale 0.1
lr actor / critic 1e-4 / 1e-4, AdamW weight decay 1e-4
batch / steps / seed 32 / 1,500 / 42 (≈ 1.27 passes over the data)
correlated noise ON: action_cholesky.npy (pre-shrunk, 240×240, identical to rounds 1–4)
W&B spiral-rlt12-stage1-beta: up4f3x0r (5), ndwoxn6x (15), vx76htg2 (70), wjsxqfh2 (100)

Training numbers, beta 15 run (from the log)

step critic loss Q min / mean / max MC / TD target mean Q(actor) − Q(base) best-of-4 selection gain residual size
100 0.155 −0.23 / 0.19 / 0.66 0.871 / −0.362 0.0009 0.0014 0.0113
300 0.0020 0.44 / 0.58 / 0.74 0.871 / 0.342 0.0002 0.0006 0.0038
1000 0.0014 0.46 / 0.82 / 0.96 0.872 / 0.786 0.0001 0.0005 0.0024
1400 0.0017 0.48 / 0.85 / 0.98 0.872 / 0.834 0.0002 0.0005 0.0024

Suggested robot order (the openspiral author's procedure): base (dry_run=True) → beta 100 → 70 → (r1b, beta 30) → 15 → 5; stop once a beta is clearly worse than the base.

Serving

Identical to rounds 1b, 2 and 4; only the checkpoint path changes.

1. Get everything

hf download Nadeem-Shoukath115113/pi05-so101-rlt12-lehome-s3-daggerrlt1-15fps-b32-10k --local-dir ckpt/base
hf download Nadeem-Shoukath115113/spiral-so101-rlt12-stage1-beta-teleop57-dagger44-rm1fix12-fresh-1500 --local-dir ckpt/spiral_s1beta

You need code from branch lehome-noise-norm (commit f79f191 or later): the lehome normalisation and the 12-dim model. A code-only copy is in the HF bucket Nadeem-Shoukath115113/test, folder spiral_rlt12_serve/ (hf sync hf://buckets/Nadeem-Shoukath115113/test/spiral_rlt12_serve ./spiral_rlt12_serve). Run from the code root. The loader falls back to assets/rlt12_s3_dagger_rlt1/local/teleop57_daggerrlt1_v21/norm_stats.json relative to that root. That file is included in the bucket copy and is byte-identical to the base checkpoint's 9999/assets/local/teleop57_daggerrlt1_v21/norm_stats.json.

2. Load

scripts/serve_policy.py has no entry point for this policy. Build it with the loader and wrap it in the websocket server:

import os
from openpi.policies.residual_rl_rlt_policy import load_residual_rl_rlt_policy
A = os.path.abspath   # ALL paths must be absolute -- orbax rejects relative ones
policy = load_residual_rl_rlt_policy(
    pi0_config_name="residual_rl_pi05_so101_rlt12_demos57",   # same model/transforms; see note
    rl_checkpoint_dir=A("ckpt/spiral_s1beta/beta15/step_00001499"),   # or beta5 / beta70 / beta100
    rlt_checkpoint_dir=A("ckpt/base"),                       # latest step inside must be 9999
    pi0_checkpoint=A("ckpt/base/9999/vla_params"),
    best_of_k=1,                                             # or 4, see below
    noise_cholesky_path=A("ckpt/spiral_s1beta/action_cholesky.npy"),
    dry_run=False,                                           # True = base actions only (no residual)
)

On the config name: the round-1 preset residual_rl_pi05_so101_rlt12_demos57 is in the committed code, and its model, normalisation and assets are identical to this run's preset. The two differ only in the training repo_id, which serving does not use. With the uncommitted preset available, residual_rl_pi05_so101_rlt12_r1b_rm1fix12 works too.

3. Choose K and the noise

setting what it does
best_of_k=1 + Cholesky one sample, no critic: what the official openspiral repo serves. Needs the K=1 fix below.
best_of_k=4 + Cholesky best-of-4 ranked by the critic, as described in the paper. Works as committed. Expect almost no effect: in rounds 2–4 the critic's scores for the 4 candidates differed by ~1% of its spread across states (these checkpoints: best-of-4 selection gain 0.0005 in training, against a Q spread of about 0.5 across states).
noise_cholesky_path=None plain N(0, I) noise. Mismatched for this checkpoint; use only as an ablation.
dry_run=True outputs base actions only and logs the residual it would have added. Use with K=1 for a clean "no residual" baseline. At K>1 the critic still picks the candidate.

K=1 fix. At commit f79f191, _FusedRLTInferenceModule.infer_actions (src/openpi/policies/residual_rl_rlt_policy.py, about line 122) draws plain noise and ignores the Cholesky. Only the best-of-K path uses eps = L @ z. For K=1: - give infer_actions a noise_cholesky=None argument and draw eps = einsum("ij,...j->...i", L, z).reshape(B, 20, 12) when it is set; - pass noise_cholesky= at warmup and in infer() for both K paths.

The same eps must go to pi0_model.sample_actions(..., noise=eps) and, flattened to 240, to the actor.

4. Observation sent by the robot

The input transforms skip the repack step, so send the post-repack keys:

images.right_front   <- overhead camera  (observation.images.left_top)
images.left_wrist    <- observation.images.left_left_wrist
images.right_wrist   <- observation.images.right_right_wrist
state                <- 12 joint values, robot units
prompt               <- "Fold the long sleeved T-shirt on the table"   (exactly)

5. What must match training (it does, if you use the loader above)

  • Actions: all 12 dims are deltas from the state, then z-scored per chunk step with per_timestamp_mean/std (20 × 12). The residual is added in that normalised delta space, then: Unnormalize (per step) → AbsoluteActions → BiSO101Outputs. A plain global mean/std normaliser gives wrong actions with no error.
  • State: min/max mapped to [-1, 1]. π₀.₅ and the actor see the same normalised state.
  • z_rl: RLT encoder 2048 → 2048, 768 image tokens only, 2 layers, 8 heads, mlp ratio 4.0. π₀.₅ runs in bfloat16.
  • Noise: eps = L @ z, z ~ N(0, I_240), L = this repo's action_cholesky.npy. Never use the raw Cholesky stored in norm_stats.json. π₀.₅ uses 10 flow steps.
  • Residual scale: the actor already multiplies its output by 0.1. Add it as is.

Identity and Version

Repository
Nadeem-Shoukath115113/spiral-so101-rlt12-stage1-beta-teleop57-dagger44-rm1fix12-fresh-1500
Publisher
Nadeem Shoukath
Task
Robotics
Modality
Control
Library
Not stated by the source
Parameters
Not stated by the source
Languages
rlt
Revision
6841c21d608ecfd67d8d0525087cca47d2585b10
First published
2026-10-15
Last updated
2026-10-15

Files and Weights

54 files, 731.7 MB in total.

Configuration4 files · 2.5 KB
Documentation1 file · 10.3 KB
Other48 files · 731.7 MB
Repository1 file · 2.5 KB
Every file
FileTypeSizeSHA-256
beta100/step_00001499/rl_config.jsonConfiguration637 B —
beta15/step_00001499/rl_config.jsonConfiguration636 B —
beta5/step_00001499/rl_config.jsonConfiguration635 B —
beta70/step_00001499/rl_config.jsonConfiguration636 B —
README.mdDocumentation10.3 KB —
action_cholesky.npyOther230.5 KB 63e2c4300015
beta100/step_00001499/rl_state/_CHECKPOINT_METADATAOther258 B —
beta100/step_00001499/rl_state/_METADATAOther63.9 KB —
beta100/step_00001499/rl_state/_shardingOther33.0 KB —
beta100/step_00001499/rl_state/array_metadatas/process_0Other24.0 KB —
beta100/step_00001499/rl_state/d/d50843f4f455094e676866e206f29c15Other2.9 KB —
beta100/step_00001499/rl_state/manifest.ocdbtOther117 B —
beta100/step_00001499/rl_state/ocdbt.process_0/d/3681c3d33add6c8328ce5176b7f50f1dOther71.8 MB bab44ebc27ea
beta100/step_00001499/rl_state/ocdbt.process_0/d/45d4ad13a9638c7420b27e5bf5805a04Other8.3 KB —
beta100/step_00001499/rl_state/ocdbt.process_0/d/b05f5158a86abcd3408179c4a35bb0b0Other111.0 MB 3678d8cff0e1
beta100/step_00001499/rl_state/ocdbt.process_0/d/c5bb0f18eaedb7866a2d7400b26f33b1Other195 B —
beta100/step_00001499/rl_state/ocdbt.process_0/d/f848d60edd61c312b29f9ac0285d737dOther586 B —
beta100/step_00001499/rl_state/ocdbt.process_0/manifest.ocdbtOther311 B —
beta15/step_00001499/rl_state/_CHECKPOINT_METADATAOther258 B —
beta15/step_00001499/rl_state/_METADATAOther63.9 KB —
beta15/step_00001499/rl_state/_shardingOther33.0 KB —
beta15/step_00001499/rl_state/array_metadatas/process_0Other24.0 KB —
beta15/step_00001499/rl_state/d/56aaec4afc123b31b52e2e6194044fa9Other2.9 KB —
beta15/step_00001499/rl_state/manifest.ocdbtOther117 B —
beta15/step_00001499/rl_state/ocdbt.process_0/d/50ce7895d03c05e78d0fb03b3414e1f5Other586 B —
beta15/step_00001499/rl_state/ocdbt.process_0/d/91c77f00e7ca8b70ea834e2870781cd7Other149.6 MB 3c393acd1526
beta15/step_00001499/rl_state/ocdbt.process_0/d/c720dbf03f4bc15099285ee8d28f7ea7Other195 B —
beta15/step_00001499/rl_state/ocdbt.process_0/d/f3f67cddb02730954a5cd99c41698d24Other33.2 MB e00fb8987580
beta15/step_00001499/rl_state/ocdbt.process_0/manifest.ocdbtOther258 B —
beta5/step_00001499/rl_state/_CHECKPOINT_METADATAOther258 B —
beta5/step_00001499/rl_state/_METADATAOther63.9 KB —
beta5/step_00001499/rl_state/_shardingOther33.0 KB —
beta5/step_00001499/rl_state/array_metadatas/process_0Other24.0 KB —
beta5/step_00001499/rl_state/d/158c6758e05da6d39aba1548da6c44d9Other2.8 KB —
beta5/step_00001499/rl_state/manifest.ocdbtOther117 B —
beta5/step_00001499/rl_state/ocdbt.process_0/d/1fda09de927345e74182eaf556bac374Other4.5 KB —
beta5/step_00001499/rl_state/ocdbt.process_0/d/327ad85243e42ebeb5470e127f098f0dOther195 B —
beta5/step_00001499/rl_state/ocdbt.process_0/d/813b0a0fafd33f6c672783e8863ad077Other111.0 MB ffce39a7cc98
beta5/step_00001499/rl_state/ocdbt.process_0/d/9e4668b70d358823dfde773763c7bd89Other586 B —
beta5/step_00001499/rl_state/ocdbt.process_0/d/f89e171f6bbdc7099186d3f7f927cbd7Other71.8 MB 7d74cf5b9506
beta5/step_00001499/rl_state/ocdbt.process_0/manifest.ocdbtOther310 B —
beta70/step_00001499/rl_state/_CHECKPOINT_METADATAOther258 B —
beta70/step_00001499/rl_state/_METADATAOther63.9 KB —
beta70/step_00001499/rl_state/_shardingOther33.0 KB —
beta70/step_00001499/rl_state/array_metadatas/process_0Other24.0 KB —
beta70/step_00001499/rl_state/d/73260ed5f3e4c9032cb1ac0a002e2614Other2.9 KB —
beta70/step_00001499/rl_state/manifest.ocdbtOther117 B —
beta70/step_00001499/rl_state/ocdbt.process_0/d/1b176d8a750a411c6ff922799e2fefe2Other51.4 MB f532a98024f2
beta70/step_00001499/rl_state/ocdbt.process_0/d/4a77d95b8b2a3a6032dd6a90d2ff84b4Other4.5 KB —
beta70/step_00001499/rl_state/ocdbt.process_0/d/9dda0047a230f29903ba88a1334cd0b4Other586 B —
beta70/step_00001499/rl_state/ocdbt.process_0/d/9f7eb9561adb3266c4edfa4a4646f086Other195 B —
beta70/step_00001499/rl_state/ocdbt.process_0/d/f5e17f4e988fb3a0141ee84820153d29Other131.4 MB c09160f76813
beta70/step_00001499/rl_state/ocdbt.process_0/manifest.ocdbtOther313 B —
.gitattributesRepository2.5 KB —

License and Download

License
apache-2.0
Access
Open weights, no gate
Download from Nadeem Shoukath

Released by Nadeem Shoukath through its official repository on Hugging Face. Read the license.

Questions About spiral-so101-rlt12-stage1-beta-teleop57-dagger44-rm1fix12-fresh-1500

Can I use spiral-so101-rlt12-stage1-beta-teleop57-dagger44-rm1fix12-fresh-1500 commercially?

Yes. spiral-so101-rlt12-stage1-beta-teleop57-dagger44-rm1fix12-fresh-1500 is released under Apache License 2.0. The Apache License 2.0 is a permissive open-source license. It permits commercial use, modification and redistribution. It requires keeping the license and copyright notices and any NOTICE file, stating significant changes, and it includes an express patent grant from contributors.

Similar Models

LIBERO 4in1(liberospatial / liberoobject / liberogoal / libero10)共 53.19 GB 的 Wan2.2-VAE 编码 latent 缓存: 训练 LIBERO policy(action head / VLA)时直接读取 latent 缓存,避免重复 VAE 编码。 - 窗口模式: windowed(--windowed) - 输出:.pt 文件,每 episode 一个 - dataset(推荐): https://huggingface.co/datasets/MangoGoes/libero4in1wan2.2vaelatentdataset - model(本仓库): https://huggingface.co/MangoGoes/libero4in1wan2.2vaelatentcosmosstyle

Open weights other cosmos

Model · Robotics

wam_ctxpool_bmethod

Hyeonmo Kang

Wan2.2-TI2V-5B video DiT + 48-joint action head, trainingmode=joint. The base is suhyeok's finalized B-method recipe: a teacher-forced (sigma=0.25) self-EMA teacher plus an iBOT prototype loss at L18 L18, gamma=0.01, two-view. On top of it the 3 PAST cond latent frames are pooled into one motion frame before a chosen block. These are NOT the surrogate ctxpool runs. The surrogate line (older base, pd8 x GA1) lives in hmkang/wamctxpoolxattn and hmkang/wamctxpoolavg. Do not compare across the two sets. Geometry: 4-latin (numframesin=25, numframesout=41, fdf 2) = 4 cond + 2 future latent slots, 96 tokens per latent frame, 576 tokens per row. Effective batch 16 clips x GA 2 x 2 views = 64 rows…

Open weights apache-2.0 wan2.2

weighted/imatrix quants of https://huggingface.co/DeepCybo/PhysBrain1.5-8B For a convenient overview and download list, visit our model page for this model. static quants are available at https://huggingface.co/mradermacher/PhysBrain1.5-8B-GGUF This is a vision model - mmproj files (if any) will be in the static repository. If you are unsure how to use GGUF files, refer to one of TheBloke's READMEs for more details, including on how to concatenate multi-part files. (sorted by size, not necessarily quality. IQ-quants are often preferable over similar sized non-IQ quants) Here is a handy graph by ikawrakow comparing some lower-quality quant And here are Artefact2's thoughts on the matter…

Open weights transformers

static quants of https://huggingface.co/MirilAI/Miril-DroneVLM-2B-2 For a convenient overview and download list, visit our model page for this model. weighted/imatrix quants seem not to be available (by me) at this time. If they do not show up a week or so after the static ones, I have probably not planned for them. Feel free to request them by opening a Community Discussion. If you are unsure how to use GGUF files, refer to one of TheBloke's READMEs for more details, including on how to concatenate multi-part files. (sorted by size, not necessarily quality. IQ-quants are often preferable over similar sized non-IQ quants) Here is a handy graph by ikawrakow comparing some lower-quality quant…

Open weights apache-2.0 transformers

Model · Robotics

microduck-bubu-sprint

Dadudu

Own lineage: PPO from scratch (nb1, commit 46c48b1) continued as nb2 and nb4 (commit fac88cc), checkpoint 850 (1.328 s); evolution strategies on the weights against the Arena sprint scorer (0.952 s); then the network frozen and wrapped in a step counter carried in the headroll action that adds joint-target and forward-command offsets from about 0.5 m to the line, found by CMA-ES on the event's official seeds: 0.940 s. No other entry's weights used. Simulation only. A perpetual policy for the microduck (61-D observation, 14 actions, 50 Hz). Runs until told otherwise — a gait, loaded into a policy slot. The observation normalizer is baked into policy.onnx; feed raw observations. manifest.json…

Open weights microduck

Model · Robotics

EgoSteer-3B-RealMan

EgoSteer

EgoSteer-3B-RealMan is the generalist policy from EgoSteer: A Full-Stack System Towards Steerable Dexterous Manipulation from Egocentric Videos. It is a world-model-enhanced Vision-Language-Action (VLA) policy built on a Qwen3-VL backbone with a flow-matching action expert, post-trained from EgoSteer-3B-Base on real-world demonstrations collected on the RealMan robot. This is a robot-ready dual-camera (head + chest) checkpoint, corresponding to EgoSteer-9.6K-DG in the paper. For the base model to fine-tune on your own data, see EgoSteer-3B-Base. Our full-stack system integrates EgoSmith (data pipeline), Robot Stack (deployment), and EgoSteer (policy) to learn from 9.6k hours of large-scale…

Open weights apache-2.0