YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
- encrypted checkpoints
- Code, and how to run any folder here
- Normalization: two eras in this repo. Read the table, not the folder name.
- The two I2V + MIM folders β read this before comparing them to
allex_mimonly - β The two bugs, and what they mean for the older folders
- Inference: current code runs the older checkpoints correctly
- A naming trap:
q01/q99do not always mean 1 % / 99 % - Decrypt a folder
encrypted checkpoints
Code, and how to run any folder here
Branch (train + publish + fetch + serve + in-process inference, one place): https://github.com/ismty0805/Isaac-GR00T-AlinVLA/tree/hyeonmo/allex-frontier
Everything below is driven from run_scripts/deploy/allex_wan22/ on that branch β registry.yaml records every
folder in this repo (lineage, training yaml, run name, rungs on HF, the normalization/geometry contract the
checkpoint carries), and the scripts read it:
cd run_scripts/deploy/allex_wan22 && source env.sh # REPO / CKPT_ROOT / HF_KEY_FILE ...
./fetch.sh <folder|alias> <step> # download one rung from here + decrypt
./serve.sh <folder|alias> <step> # robot: ZMQ policy server for RRC (gate -> run_gr00t_server, EMA weights)
./infer.sh <folder|alias> <step> --dataset-path <lerobot> # no robot: open-loop on dataset episodes -> MSE/MAE (+ --save-npz)
./registry.py list # folders, codebase, rungs
Aliases: ours, i2vmimonly, i2vmim, baseline, bmethod, joint, fastwam. contract_gate.py refuses to
serve a rung whose config.json / processor_config.json / experiment_name disagree with the registry.
FastWAM is served by the same serve.sh (it dispatches to serve_fastwam.sh, same ZMQ wire, FastWAM venv).
The arms (rows32 cohort = 32 model rows x 100k steps, allex v1..v6, shared stats)
| folder | what it is | training yaml (run_scripts/train/wam_dit4dit/k8s/) |
|---|---|---|
allex_mimonly_eefrel_h24_rows32_100k_4gpu/ |
ours β V2V history (hist5s3: 5 past frames, 13/37) + iBOT MIM-only representation loss (L18<->L18, Ξ³ 0.01, two-view), local cosine OFF | allex_mimonly/hyeonmo_allex_mimonly_eefrel_h24_100k_4gpu_bs32.yaml |
allex_i2vmimonly_eefrel_h24_rows32_100k_4gpu/ |
ours minus history β I2V (1 condition frame, 1/25) + the same iBOT MIM-only loss, WAM_V2V_ALIGN_LOSS=none |
allex_i2vmim/hyeonmo_allex_i2vmimonly_eefrel_h24_100k_4gpu_bs32.yaml |
allex_baseline_i2v_h24_rows32_100k_4gpu/ |
baseline β I2V, no representation loss at all (Ξ³ 0) | allex_baseline/hyeonmo_allex_baseline_i2v_h24_100k_4gpu_bs32.yaml |
allex_i2vmim_localcos_eefrel_h24_rows32_100k_4gpu/ |
β the first "ours minus history" launch: I2V + MIM plus the old L3->L18 local cosine (Ξ³ 0.01) because the knob was never exported. Two deltas from ours, not one. Kept for the record | allex_i2vmim/hyeonmo_allex_i2vmim_eefrel_h24_100k_4gpu_bs32.yaml (SUPERSEDED, refuses to launch) |
allex_fastwam_rows32_100k_4gpu/ |
FastWAM (Wan2.2-5B + ActionDiT, fastwam trainer) on the same data, stats and plate β the cohort's external comparator | fastwam repo configs/task/allex_fastwam_rows32_100k.yaml (model.pt per rung) |
Pre-cohort folders (earlier generations, 64 rows, trained before the 2026-09-19 normalization fixes β see the table and the "two bugs" section further down):
| folder | what it is | training yaml |
|---|---|---|
bmethod_armrel_h48_stride6_v1v6/ |
B-method: iBOT + arms RELATIVE, h48 stride 6 | run_scripts/deploy/allex_wan22/legacy_launch/hyeonmo_frontier_allex_v1v6_bmethod_armrel_s6h48_4gpu.yaml (lineage hyeonmo/wan-22-frontier) |
joint_h48_stride6_v1v6/, joint_h24_stride3_v1v6/ |
V2V joint baseline, absolute actions, allex v1..v6 | legacy_launch/hyeonmo-frontier-allex-v1-{s6h48-,}g4.yaml (+ in-pod v1->v1..v6 switch, see legacy_launch/README.md) |
joint_h48_stride6/, joint_h24_stride3/ |
same yamls, allex v1 only (80 ep), rungs saved before the switch | same |
Comparators that live in other repos: GR00T N1.7 β hmkang/frontier_demo_gr00t_n17_allex_v1v6_enc
(branch hyeonmo/frontier-gr00t); AGRA / DreamZero β branches hyeonmo/dreamzero-frontier, agra-frontier (not published here).
Files in this repository are AES-256-CBC encrypted (openssl enc -aes-256-cbc -pbkdf2 -iter 200000 -salt),
one .enc per original file, no compression. They are not usable without the key.
Normalization: two eras in this repo. Read the table, not the folder name.
Folders here were produced before and after two normalization bugs were fixed on 2026-09-19. Every checkpoint records which era it belongs to, so you never have to guess:
# after decrypting
python -c "import json;c=json.load(open('checkpoint-XXXXX/processor_config.json'));\
print(c.get('use_percentiles'), c.get('use_relative_action'))"
| folder | data | clip | action rep | era |
|---|---|---|---|---|
joint_h24_stride3/ |
allex v1 (80 ep) | fdf3 nin13/nout37, h24 | absolute | pre-fix |
joint_h48_stride6/ |
allex v1 (80 ep) | fdf6 nin25/nout73, h48 | absolute | pre-fix |
joint_h24_stride3_v1v6/ |
allex v1..v6 (480 ep) | fdf3 nin13/nout37, h24 | absolute | pre-fix |
joint_h48_stride6_v1v6/ |
allex v1..v6 (480 ep) | fdf6 nin25/nout73, h48 | absolute | pre-fix |
bmethod_armrel_h48_stride6_v1v6/ |
allex v1..v6 (480 ep) | fdf6 nin25/nout73, h48 | arms RELATIVE | pre-fix β β see below |
allex_mimonly_eefrel_h24_rows32_100k_4gpu/ |
allex v1..v6 | fdf3 nin13/nout37, h24 | arms RELATIVE (EEF, XYZ_ROT6D) | post-fix: use_percentiles=True, use_relative_action=True |
allex_baseline_i2v_h24_rows32_100k_4gpu/ |
allex v1..v6 | fdf3 nin13/nout37, h24 | arms RELATIVE (EEF, XYZ_ROT6D) | post-fix: use_percentiles=True, use_relative_action=True |
β allex_i2vmim_localcos_eefrel_h24_rows32_100k_4gpu/ |
allex v1..v6 | fdf3 nin13/nout37, h24 | arms RELATIVE (EEF, XYZ_ROT6D) | post-fix β I2V + MIM + L3βL18 local cosine (Ξ³ 0.01), see note |
allex_i2vmimonly_eefrel_h24_rows32_100k_4gpu/ |
allex v1..v6 | fdf3 nin13/nout37, h24 | arms RELATIVE (EEF, XYZ_ROT6D) | post-fix β I2V + MIM only = ours minus history (WAM_V2V_ALIGN_LOSS=none) |
The two rows32 rows are read from the checkpoints themselves (processor_config.json, 2026-09-22).
The pre-fix rows are dated by when they were uploaded and by the action rep recorded in the previous
revision of this README; their source directories are no longer on the training filesystem, so the flag
values were not re-verified here. For anything in a pre-fix row, read processor_config.json out of
the checkpoint (command above) rather than trusting this table.
The rows32 folders are the current frontier-demo cohort: 32 model rows, 100k steps, warmup 5000,
q0.1/q99.9 arm normalization. They are not affected by anything below.
The two I2V + MIM folders β read this before comparing them to allex_mimonly
allex_mimonly (ours) = V2V history (hist5s3) + iBOT MIM-only, WAM_V2V_ALIGN_LOSS=none.
The ablation "ours minus history" was launched twice:
allex_i2vmim_β¦(uploaded 2026-09-2x) never exportedWAM_V2V_ALIGN_LOSS, so the extractor defaulted tocos: besides MIM it also trained the old L3βL18 per-token cosine at Ξ³ 0.01. Evidence: launch log[WAN_FADISTILL] ENGAGED β¦ gamma=0.01 β¦ L_align=1.00; wandbtrain/selfflow_rep_lossfell 1.0 β 0.096 over training (it is exactly 0 forallex_mimonly); the checkpoints shipbackbone.extractor._sf_projector.*, which=nonenever builds. It is therefore two knobs away from ours (no history and an extra alignment term). Kept as published for the record; do not read it as the clean ablation.allex_i2vmimonly_β¦(uploaded 2026-10-02) is the relaunch withexport WAM_V2V_ALIGN_LOSS=noneand nothing else changed. Launch log on all four ranks:[WAM_V2V_ALIGN_LOSS] none β _sf_projector NOT builtandβ¦ align=NONE(local cos off, global branch only). This is the clean "ours minus history". Rungs: 20k / 40k / 50k / 60k / 80k / 100k.
Both decode with the same code and the same processor_config.json contract as allex_mimonly.
β The two bugs, and what they mean for the older folders
Both were fixed on 2026-09-19. This section is history for the pre-fix folders, not a live warning. An earlier revision of this README said "Status 2026-09-12: not yet fixed" β that line is obsolete and was removed, because left in place it reads as a warning about the newer folders too.
Bug 1 β the RELATIVE override discarded the percentile choice.
state_action_processor.py picks q01/q99 instead of min/max in one place (:124). For RELATIVE
arm keys it then replaced the entire norm-params entry with the raw relative_action stats (:168), and
that copy carries raw min/max β so the percentile choice was undone for exactly the arm keys.
A run could pass --use-percentiles and still min-max-normalize its arms, while hands / neck / waist used
q01-q99: two scale conventions inside one model. Measured on allex_v1v6_armrel, (max-min)/(q99-q01) was
median 2.4x right / 2.2x left, worst cell 4.6x β the arms occupied ~40-45 % of the [-1, 1] range the
hands and neck used in full.
Fixed by re-applying the percentiles after the override, and raising rather than continuing if the
relative stats carry no q01/q99.
Bug 2 β RELATIVE conversion was never switched on at all.
The flag reached a field nothing read, so the processor kept its False default. With it off, the arm
target silently stayed the absolute wrist pose, inference was absolute too (consistently wrong rather
than visibly broken), and the relative stats were never consulted β which also made Bug 1's fix
unreachable dead code. Fixed the same day.
Which folders are affected: only those trained before 2026-09-19 that declare RELATIVE arms β
bmethod_armrel_h48_stride6_v1v6/. The joint_* folders are ABSOLUTE-action runs and were never affected
by either bug. Check processor_config.json as shown above rather than trusting the name.
Inference: current code runs the older checkpoints correctly
You do NOT need to check out an older commit. Both flags are written into processor_config.json by
save_pretrained and restored by from_pretrained (use_percentiles, use_relative_action, both
defaulting to False). A checkpoint therefore carries its own normalization contract, and the 2026-09-19
fixes are guarded by those same flags β the new branches simply do not execute for a False checkpoint.
Verified on disk: pre-fix checkpoints saved 2026-09-18 read False/False, post-fix ones saved 2026-09-22
read True/True.
One caveat: this holds for the from_pretrained path. An eval harness that rebuilds the processor from a
training config or from WAM_USE_RELATIVE_ACTION in the environment instead of loading the saved
processor_config.json can override the checkpoint's own setting β check what your harness does before
trusting a number.
A naming trap: q01/q99 do not always mean 1 % / 99 %
gr00t/data/stats.py writes percentile values into fields named q01/q99. When the stats were built
with --use_eef_relative_percentile_999, those fields hold 0.1 % / 99.9 %, and the file records this in
_percentiles. For the AllEx v1..v6 dataset the arms' relative_stats.json carries
_percentiles = [0.001, 0.999], while stats.json for the ABSOLUTE keys has no marker and holds the 1/99
default. So "percentiles on" means 0.1/99.9 for the arms and 1/99 for hands + neck, in both the WAM and
the GR00T arms of this cohort. Read _percentiles, not the field name.
Decrypt a folder
for f in checkpoint-XXXXX/*.enc checkpoint-XXXXX/experiment_cfg/*.enc; do
openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 -pass file:/path/to/key.txt -in "$f" -out "${f%.enc}"
done