albus2024 commited on
Commit
3828ef7
·
verified ·
1 Parent(s): e222ad7

Add binary/continuous gripper modes with DITA runtime 2.0.0

Browse files

Update policy/processor configs, runtime wheel, documentation and real-data validation. Preserve model weights and LIBERO statistic tensors.

.gitattributes CHANGED
@@ -34,3 +34,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  lerobot_policy_dita-1.0.5-py3-none-any.whl filter=lfs diff=lfs merge=lfs -text
 
 
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  lerobot_policy_dita-1.0.5-py3-none-any.whl filter=lfs diff=lfs merge=lfs -text
37
+ lerobot_policy_dita-2.0.0-py3-none-any.whl filter=lfs diff=lfs merge=lfs -text
GRIPPER_MODES.md ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # DITA gripper modes
2
+
3
+ Runtime **2.0.0** supports `policy.gripper_mode=binary` and `continuous`. The mode is
4
+ saved in `config.json` and both processor JSON files. The public LeRobot processor
5
+ factory applies the active policy mode when loading pretrained templates, including
6
+ CLI overrides. Conflicting explicit processor modes fail. New fine-tuning binds the
7
+ target dataset statistics; resume keeps the saved statistics.
8
+
9
+ The config schema replaces the serialized `action_normalization_mask` and
10
+ `gripper_sign_flip` fields with `gripper_mode`. Old policy and processor configs are
11
+ not supported. Use the updated Hub revisions and their 2.0.0 wheel together.
12
+
13
+ | Contract | `binary` | `continuous` |
14
+ | --- | --- | --- |
15
+ | Target dataset | LIBERO signed commands | SO101 EEF gripper positions |
16
+ | Training gripper | `-1=open, +1=closed` becomes `1=open, 0=closed` | Dataset `action.min/max` maps position to `[-1, 1]` |
17
+ | Model output | Continuous diffusion prediction | Continuous diffusion prediction |
18
+ | Policy output | `prediction > 0.5` becomes `+1`, otherwise `-1` | No threshold |
19
+ | Postprocessor output | Sign flip restores `-1=open, +1=closed` | Inverse min/max mapping restores recorded position units |
20
+ | Hub defaults | Spatial, Object, Goal, Long | DROID fine-tuning initialization |
21
+
22
+ Both modes use target-dataset `action.q01/q99` for the first six pose dimensions.
23
+ Continuous gripper additionally requires seven-element finite `action.min/max`.
24
+ Gripper outputs are bounded to the recorded min/max; a constant gripper range maps
25
+ to zero during training and restores the constant position during inference.
26
+
27
+ The SO101 merged dataset has gripper min/max approximately `0.377/47.472` while its
28
+ q01/q99 are approximately `1.227/28.432`. Using the full gripper min/max retains
29
+ rare fully open positions that would exceed the diffusion sampler's normalized
30
+ range with quantile scaling. Dataset extrema describe recorded commands, not new
31
+ hardware calibration limits. Use the same robot calibration for recording and rollout.
32
+
33
+ Binary mode accepts raw LIBERO signed labels. Already transformed RLDS `0/1`
34
+ labels must first be converted to LIBERO commands (`1 - 2 * openness`) before using
35
+ this processor. This restores the original DITA learning convention while keeping
36
+ all converted LIBERO inference outputs unchanged.
37
+
38
+ ## Fine-tune
39
+
40
+ Install the runtime bundled with the updated initialization:
41
+
42
+ ```bash
43
+ pip install 'lerobot_policy_dita[training] @ https://huggingface.co/albus2024/dita_droid_pretrain/resolve/main/lerobot_policy_dita-2.0.0-py3-none-any.whl'
44
+ ```
45
+
46
+ LIBERO:
47
+
48
+ ```bash
49
+ lerobot-train \
50
+ --policy.path=albus2024/dita_droid_pretrain \
51
+ --policy.gripper_mode=binary \
52
+ --policy.device=cuda --policy.dtype=bfloat16 \
53
+ --policy.input_features=null --policy.output_features=null \
54
+ --policy.push_to_hub=false \
55
+ --dataset.repo_id=HuggingFaceVLA/libero \
56
+ --output_dir=outputs/train/dita_libero_binary
57
+ ```
58
+
59
+ SO101 EEF, using the local merged dataset and front camera:
60
+
61
+ ```bash
62
+ lerobot-train \
63
+ --policy.path=albus2024/dita_droid_pretrain \
64
+ --policy.gripper_mode=continuous \
65
+ --policy.device=cuda --policy.dtype=bfloat16 \
66
+ --policy.input_features='{"observation.images.image":{"type":"VISUAL","shape":[3,480,640]}}' \
67
+ --policy.output_features=null \
68
+ --rename_map='{"observation.images.front":"observation.images.image"}' \
69
+ --policy.push_to_hub=false \
70
+ --dataset.repo_id=albus2024/so101_merged \
71
+ --dataset.root=/home/lyanam/project/lerobot_real_robot/datasets/so101_merged \
72
+ --dataset.video_backend=pyav \
73
+ --output_dir=outputs/train/dita_so101_continuous
74
+ ```
75
+
76
+ Keep `traj_length=11`, `chunk_size=10`, `n_action_steps=1`, and the existing camera
77
+ and temporal contract. The DROID artifact is initialization without target-dataset
78
+ statistics. Fine-tune with the chosen mode; changing modes after training does not
79
+ convert learned gripper targets or align EEF coordinate frames.
80
+
81
+ ## EEF deployment
82
+
83
+ Load the fine-tuned policy **and its saved processors** in `lerobot-rollout-eef`.
84
+ After the policy postprocessor, the seven action channels must be ordered as:
85
+
86
+ ```text
87
+ ee.x, ee.y, ee.z, ee.wx, ee.wy, ee.wz, ee.gripper_pos
88
+ ```
89
+
90
+ `ee.gripper_pos` is already a continuous value in the recorded servo units. The
91
+ EEF IK processor forwards it to `gripper.pos`; no additional threshold, sign flip,
92
+ or multiplication by 100 is needed. SO101 data uses absolute position and rotvec
93
+ orientation; preserve that action interpretation, robot calibration, and camera mapping.
94
+
95
+ ## Reproduce the real-data mechanics checks
96
+
97
+ From the repository root, with an updated local DROID artifact:
98
+
99
+ ```bash
100
+ CUDA_VISIBLE_DEVICES=0 python scripts/validate_gripper_modes.py \
101
+ --checkpoint /path/to/updated/dita_droid_pretrain \
102
+ --dataset-root /path/to/libero \
103
+ --dataset-repo-id HuggingFaceVLA/libero \
104
+ --mode binary --output workspace/validation/gripper_libero
105
+
106
+ CUDA_VISIBLE_DEVICES=1 python scripts/validate_gripper_modes.py \
107
+ --checkpoint /path/to/updated/dita_droid_pretrain \
108
+ --dataset-root /home/lyanam/project/lerobot_real_robot/datasets/so101_merged \
109
+ --dataset-repo-id albus2024/so101_merged \
110
+ --camera-key observation.images.front \
111
+ --mode continuous --output workspace/validation/gripper_so101
112
+ ```
113
+
114
+ The script invokes native `lerobot.scripts.lerobot_train` for ten optimizer steps,
115
+ resumes for one more step, and checks finite weights/optimizer state, changed weights,
116
+ saved statistics, real action encode/decode, `[4, 10, 7]` chunk inference, and
117
+ `[4, 7]` online single-frame inference. It records exact commands, logs, and
118
+ `verification.json`. `--verify-only` rechecks existing checkpoints without training.
119
+
120
+ The 2026-09-14 checks passed on three episodes of each real dataset with BF16 and
121
+ batch size four. They validate training and inference mechanics, not convergence,
122
+ LIBERO task success, or a physical SO101 rollout.
README.md CHANGED
@@ -38,7 +38,7 @@ This repository is a strict LeRobot conversion of `libero_long.pth` from the ori
38
  ## Install
39
 
40
  ```bash
41
- pip install "lerobot_policy_dita[libero] @ https://huggingface.co/albus2024/dita_long/resolve/main/lerobot_policy_dita-1.0.5-py3-none-any.whl"
42
  ```
43
 
44
  ## Evaluate
@@ -46,6 +46,7 @@ pip install "lerobot_policy_dita[libero] @ https://huggingface.co/albus2024/dita
46
  ```bash
47
  lerobot-eval \
48
  --policy.path=albus2024/dita_long \
 
49
  --policy.device=cuda \
50
  --env.type=libero \
51
  --env.task=libero_10 \
@@ -64,14 +65,20 @@ The converter checks all parameter names and shapes, loads with `strict=True`, a
64
  saved artifact files. Run the project's parity and converted-checkpoint verification scripts
65
  separately before using the policy; conversion alone does not establish rollout parity.
66
 
67
- ## Runtime 1.0.5 refresh
68
 
69
- Use the bundled 1.0.5 wheel for this revision. The configuration now records
70
- `dtype=float16` to preserve the original CUDA AMP default; BF16 can be selected
71
- with `--policy.dtype=bfloat16`. The original model weights and processor files
72
- are unchanged. Older runtimes can use the previous revision recorded in
73
- `runtime_metadata.json`. Original conversion metadata and earlier reports are
74
- historical; `runtime_validation_report.json` records the checks run with this wheel.
75
 
76
- This refresh checks loading, processing and numerical execution. It does not
77
- repeat a full LIBERO benchmark or establish DROID task success.
 
 
 
 
 
 
 
 
 
 
38
  ## Install
39
 
40
  ```bash
41
+ pip install "lerobot_policy_dita[libero] @ https://huggingface.co/albus2024/dita_long/resolve/main/lerobot_policy_dita-2.0.0-py3-none-any.whl"
42
  ```
43
 
44
  ## Evaluate
 
46
  ```bash
47
  lerobot-eval \
48
  --policy.path=albus2024/dita_long \
49
+ --policy.gripper_mode=binary \
50
  --policy.device=cuda \
51
  --env.type=libero \
52
  --env.task=libero_10 \
 
65
  saved artifact files. Run the project's parity and converted-checkpoint verification scripts
66
  separately before using the policy; conversion alone does not establish rollout parity.
67
 
68
+ ## Runtime 2.0.0 gripper contract
69
 
70
+ `gripper_mode` replaces the serialized action mask and gripper sign fields. Old
71
+ policy/processor configs are not supported. Install the 2.0.0 wheel with this
72
+ revision. See [gripper modes](GRIPPER_MODES.md) for training and SO101 EEF use.
 
 
 
73
 
74
+ The four LIBERO models default to `binary`; the DROID initialization defaults to
75
+ `continuous` and has no target-dataset statistics. For LIBERO fine-tuning from
76
+ DROID, pass `--policy.gripper_mode=binary`. Both saved processors follow that
77
+ override. Binary labels are -1=open/+1=closed; continuous gripper uses dataset
78
+ min/max while pose uses quantiles.
79
+
80
+ The runtime validation report covers real LIBERO and SO101 training (10 steps plus
81
+ one resumed update), offline inference, wheel verification, four LIBERO checkpoint
82
+ action parity, and three LIBERO Spatial simulator steps. These checks do not
83
+ establish convergence, task success, or a physical SO101 rollout. Model weights
84
+ and existing LIBERO statistics are unchanged in this update.
artifact_sha256.json CHANGED
@@ -1,15 +1,15 @@
1
  {
2
- "README.md": "29252d10abe939bfa7492b43ab54feaa2403c8115242ceda72db08a78331d29c",
3
- "config.json": "752c8faff2deec9a8248d6c6ff49670a3ab77b667a581bf5396d4e6628b88441",
4
- "conversion_metadata.json": "d15664a8af19e9072d0e581e334f8e8e77e2cc093ab5b5224e0947772616567d",
5
- "lerobot_policy_dita-1.0.5-py3-none-any.whl": "8e4a6c5bf9d52a636751b97237305c13454d8091a9eb900fabcac875a7ae809e",
6
- "local_verification.json": "25b91f455fb8708da85597e859a6cf98f237aaeec1d3720dd0a41c8b367b2b5d",
7
  "model.safetensors": "b111459ee0921631a9b5bbbb04713856081750d8e9f33664ee13889a41151be2",
8
- "policy_postprocessor.json": "4f80b4d5c45a6f004a30021bbf17d8d6cbe621048ccd0364ca23cf496c8baac2",
9
  "policy_postprocessor_step_0_dita_masked_unnormalizer_processor.safetensors": "e6bef89048da8a99aff85aa4263a02097af441185b534df37c453be302a949fe",
10
- "policy_preprocessor.json": "3a61832dee2a66f9697dfc47eca57fb98a659c4c61c856c378f359074ca38aaa",
11
  "policy_preprocessor_step_4_dita_masked_normalizer_processor.safetensors": "e6bef89048da8a99aff85aa4263a02097af441185b534df37c453be302a949fe",
12
- "runtime_metadata.json": "5da64bf52df5c69f0e10c1b46e8a160ac1a6a7ab5c5c25096b685d84f7fda147",
13
- "runtime_source_manifest.json": "b5a59da8d67fef584e1caa7ad11bc89a1621f57468c0df0663e78fee2b04ee46",
14
- "runtime_validation_report.json": "07d1b3e42178e554791f2e9f9f099bd5b1fc474793b2d745c4f6577b601abe3b"
15
  }
 
1
  {
2
+ "GRIPPER_MODES.md": "92373ff4adbdb04cf5d5c415b9f56c29d768111a8fa712b669d2e0fb763ea5a4",
3
+ "README.md": "75327986b27402c095f05826c19a0814ab3eecf69b3bb4e1c574571b0be50f27",
4
+ "config.json": "9878d0fb0aa1ffd3fe7ba2a43c7225091fff7d801d51ca016f6420750ee6f820",
5
+ "conversion_metadata.json": "ee97a849125d84ca767c3ee9616af27896ac43fb1b0caed9fd608a770bbf7849",
6
+ "lerobot_policy_dita-2.0.0-py3-none-any.whl": "b948a1e1b2f2fb22ab1f952195ccae3006e08ad3f2695825533262296395ce01",
7
  "model.safetensors": "b111459ee0921631a9b5bbbb04713856081750d8e9f33664ee13889a41151be2",
8
+ "policy_postprocessor.json": "2668a59651f8fc638914065f71d7efebc48addca535891e38d75d4c2ba5e924c",
9
  "policy_postprocessor_step_0_dita_masked_unnormalizer_processor.safetensors": "e6bef89048da8a99aff85aa4263a02097af441185b534df37c453be302a949fe",
10
+ "policy_preprocessor.json": "ead05cc569fedb9f4ad5bc1338af09cd2174a1b83ac324be56f5c48049286a01",
11
  "policy_preprocessor_step_4_dita_masked_normalizer_processor.safetensors": "e6bef89048da8a99aff85aa4263a02097af441185b534df37c453be302a949fe",
12
+ "runtime_metadata.json": "a2ccff24ca51dc35f8e5d56d61702bf2c508cc2b553e3274babae9ce1bfbfa03",
13
+ "runtime_source_manifest.json": "9da1a65a4edc8a1fe56a580fe4ace28358b42393fb8a6d0170e6bb6a2df9af04",
14
+ "runtime_validation_report.json": "1872e9a2560ff916960b55aa70b26f98ac328b2c1c16c7724b191bff69b81792"
15
  }
config.json CHANGED
@@ -46,16 +46,6 @@
46
  "n_action_steps": 1,
47
  "history_frames": 2,
48
  "gripper_threshold": 0.5,
49
- "gripper_sign_flip": -1.0,
50
- "action_normalization_mask": [
51
- true,
52
- true,
53
- true,
54
- true,
55
- true,
56
- true,
57
- false
58
- ],
59
  "normalization_mapping": {
60
  "VISUAL": "IDENTITY",
61
  "ACTION": "QUANTILES",
@@ -69,5 +59,6 @@
69
  "optimizer_eps": 1e-08,
70
  "optimizer_weight_decay": 0.01,
71
  "optimizer_grad_clip_norm": 1.0,
72
- "dtype": "float16"
 
73
  }
 
46
  "n_action_steps": 1,
47
  "history_frames": 2,
48
  "gripper_threshold": 0.5,
 
 
 
 
 
 
 
 
 
 
49
  "normalization_mapping": {
50
  "VISUAL": "IDENTITY",
51
  "ACTION": "QUANTILES",
 
59
  "optimizer_eps": 1e-08,
60
  "optimizer_weight_decay": 0.01,
61
  "optimizer_grad_clip_norm": 1.0,
62
+ "dtype": "float16",
63
+ "gripper_mode": "binary"
64
  }
conversion_metadata.json CHANGED
@@ -46,5 +46,10 @@
46
  "policy_postprocessor_step_0_dita_masked_unnormalizer_processor.safetensors",
47
  "policy_preprocessor_step_4_dita_masked_normalizer_processor.safetensors"
48
  ],
49
- "previous_hub_revision": "4fa5f721f7f16621361a8b23fa77cee1bc1c952f"
 
 
 
 
 
50
  }
 
46
  "policy_postprocessor_step_0_dita_masked_unnormalizer_processor.safetensors",
47
  "policy_preprocessor_step_4_dita_masked_normalizer_processor.safetensors"
48
  ],
49
+ "previous_hub_revision": "4fa5f721f7f16621361a8b23fa77cee1bc1c952f",
50
+ "runtime_update": {
51
+ "version": "2.0.0",
52
+ "gripper_mode": "binary",
53
+ "metadata": "runtime_metadata.json"
54
+ }
55
  }
lerobot_policy_dita-2.0.0-py3-none-any.whl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b948a1e1b2f2fb22ab1f952195ccae3006e08ad3f2695825533262296395ce01
3
+ size 129502
policy_postprocessor.json CHANGED
@@ -18,16 +18,7 @@
18
  "ACTION": "QUANTILES",
19
  "LANGUAGE": "IDENTITY"
20
  },
21
- "action_normalization_mask": [
22
- true,
23
- true,
24
- true,
25
- true,
26
- true,
27
- true,
28
- false
29
- ],
30
- "gripper_sign_flip": -1.0
31
  },
32
  "state_file": "policy_postprocessor_step_0_dita_masked_unnormalizer_processor.safetensors"
33
  },
@@ -39,4 +30,4 @@
39
  }
40
  }
41
  ]
42
- }
 
18
  "ACTION": "QUANTILES",
19
  "LANGUAGE": "IDENTITY"
20
  },
21
+ "gripper_mode": "binary"
 
 
 
 
 
 
 
 
 
22
  },
23
  "state_file": "policy_postprocessor_step_0_dita_masked_unnormalizer_processor.safetensors"
24
  },
 
30
  }
31
  }
32
  ]
33
+ }
policy_preprocessor.json CHANGED
@@ -56,15 +56,7 @@
56
  "ACTION": "QUANTILES",
57
  "LANGUAGE": "IDENTITY"
58
  },
59
- "action_normalization_mask": [
60
- true,
61
- true,
62
- true,
63
- true,
64
- true,
65
- true,
66
- false
67
- ]
68
  },
69
  "state_file": "policy_preprocessor_step_4_dita_masked_normalizer_processor.safetensors"
70
  },
@@ -76,4 +68,4 @@
76
  }
77
  }
78
  ]
79
- }
 
56
  "ACTION": "QUANTILES",
57
  "LANGUAGE": "IDENTITY"
58
  },
59
+ "gripper_mode": "binary"
 
 
 
 
 
 
 
 
60
  },
61
  "state_file": "policy_preprocessor_step_4_dita_masked_normalizer_processor.safetensors"
62
  },
 
68
  }
69
  }
70
  ]
71
+ }
runtime_metadata.json CHANGED
@@ -1,27 +1,23 @@
1
  {
2
- "updated_at_utc": "2026-09-14T08:28:58.781286+00:00",
3
- "runtime_version": "1.0.5",
4
- "runtime_wheel": "lerobot_policy_dita-1.0.5-py3-none-any.whl",
5
- "runtime_wheel_sha256": "8e4a6c5bf9d52a636751b97237305c13454d8091a9eb900fabcac875a7ae809e",
6
- "source_git_head": "c97999bb495b3d58b105772690138a2cb7e8a709",
 
 
7
  "source_git_dirty": true,
8
  "source_manifest": "runtime_source_manifest.json",
9
- "previous_hub_revision": "2b76d79456232134252554fe19cc2c88de7bd199",
10
  "model_sha256": "b111459ee0921631a9b5bbbb04713856081750d8e9f33664ee13889a41151be2",
11
  "model_weights_changed": false,
12
- "processor_files_changed": false,
 
13
  "processor_sha256": {
 
 
14
  "policy_postprocessor_step_0_dita_masked_unnormalizer_processor.safetensors": "e6bef89048da8a99aff85aa4263a02097af441185b534df37c453be302a949fe",
15
- "policy_preprocessor_step_4_dita_masked_normalizer_processor.safetensors": "e6bef89048da8a99aff85aa4263a02097af441185b534df37c453be302a949fe",
16
- "policy_preprocessor.json": "3a61832dee2a66f9697dfc47eca57fb98a659c4c61c856c378f359074ca38aaa",
17
- "policy_postprocessor.json": "4f80b4d5c45a6f004a30021bbf17d8d6cbe621048ccd0364ca23cf496c8baac2"
18
  },
19
- "configuration_change": {
20
- "dtype": {
21
- "before": "absent (CUDA AMP default float16)",
22
- "after": "float16"
23
- }
24
- },
25
- "minimum_runtime_version": "1.0.5",
26
  "validation_report": "runtime_validation_report.json"
27
  }
 
1
  {
2
+ "updated_at_utc": "2026-09-14T10:39:32.234200+00:00",
3
+ "runtime_version": "2.0.0",
4
+ "minimum_runtime_version": "2.0.0",
5
+ "runtime_wheel": "lerobot_policy_dita-2.0.0-py3-none-any.whl",
6
+ "runtime_wheel_sha256": "b948a1e1b2f2fb22ab1f952195ccae3006e08ad3f2695825533262296395ce01",
7
+ "previous_hub_revision": "e222ad78a1905b39a38c31b169c62640d4666e4c",
8
+ "source_git_head": "7bc16687b141cdb7617e2a9dc6456e8ace1fedae",
9
  "source_git_dirty": true,
10
  "source_manifest": "runtime_source_manifest.json",
 
11
  "model_sha256": "b111459ee0921631a9b5bbbb04713856081750d8e9f33664ee13889a41151be2",
12
  "model_weights_changed": false,
13
+ "processor_configs_changed": true,
14
+ "processor_statistics_changed": false,
15
  "processor_sha256": {
16
+ "policy_postprocessor.json": "2668a59651f8fc638914065f71d7efebc48addca535891e38d75d4c2ba5e924c",
17
+ "policy_preprocessor.json": "ead05cc569fedb9f4ad5bc1338af09cd2174a1b83ac324be56f5c48049286a01",
18
  "policy_postprocessor_step_0_dita_masked_unnormalizer_processor.safetensors": "e6bef89048da8a99aff85aa4263a02097af441185b534df37c453be302a949fe",
19
+ "policy_preprocessor_step_4_dita_masked_normalizer_processor.safetensors": "e6bef89048da8a99aff85aa4263a02097af441185b534df37c453be302a949fe"
 
 
20
  },
21
+ "gripper_mode": "binary",
 
 
 
 
 
 
22
  "validation_report": "runtime_validation_report.json"
23
  }
runtime_source_manifest.json CHANGED
@@ -1,10 +1,10 @@
1
  {
2
- "wheel": "lerobot_policy_dita-1.0.5-py3-none-any.whl",
3
- "sha256": "8e4a6c5bf9d52a636751b97237305c13454d8091a9eb900fabcac875a7ae809e",
4
  "source_python_files": 79,
5
  "all_source_files_match": true,
6
  "source_sha256": {
7
- "lerobot_policy_dita/__init__.py": "b30cea9585424b15b93ddcf730d3b42d24372f78a063fc870af74b8763034b19",
8
  "lerobot_policy_dita/_loading.py": "325e7c57a422f2cc5827c6d95ad19df4b51acae4af0a9b70b0c98a37852e6689",
9
  "lerobot_policy_dita/approximation/__init__.py": "b0646b441737d19c58ce395dd402fa0c1dcb0e8531e4df8d8be251de20b11d5e",
10
  "lerobot_policy_dita/approximation/adapters/__init__.py": "e0b5bf1a2a01a82af6b1ab03954aa039f396096b8b3a67d17483a7f054fd98c5",
@@ -33,18 +33,18 @@
33
  "lerobot_policy_dita/evaluation/static.py": "758ea97ef6b68c0a32197d962d9ff9af62b2aeb337c248bc72d8d960cdeba712",
34
  "lerobot_policy_dita/evaluation/trace.py": "a4399277a49e412589df69529d952e5931d87742f0a6dd16832d39cba113e1d3",
35
  "lerobot_policy_dita/policy/__init__.py": "9785f8e7279dc6760b4b7dbbe587ed6c6f467daa1dbbdf2ea095a645c1c52a57",
36
- "lerobot_policy_dita/policy/_lerobot_compat.py": "84e49b026ed2b9cff8f079ff0839fef528a25e02e986aa4bcf79906c949e9b36",
37
  "lerobot_policy_dita/policy/approximation/__init__.py": "0632173bd9a1595a72c9741e6bb5538f644c0f448c8caca606542ae3d2cb3b5a",
38
  "lerobot_policy_dita/policy/approximation/adapter.py": "d603f444c2237a76a23f44dd8b2df734b66525d3522695f200478b3c055152a4",
39
  "lerobot_policy_dita/policy/approximation/configuration.py": "8fa1f0f24624352b691d73c71f9fc75c0196c8f81e888e6b77a9f11eba7926af",
40
  "lerobot_policy_dita/policy/approximation/ddim.py": "d32a16f85aa670bd07375ce2691498c47b9f9e700160fde12eea33e6a56f09fa",
41
  "lerobot_policy_dita/policy/attention.py": "3253866b5ea0bdf24a85b2047d813573e24588a4294adc9b72d01488d236909e",
42
- "lerobot_policy_dita/policy/configuration_dita.py": "3817b74d2d30366d097e537897a12a20f0ce08d57c389de10d0458893870bee4",
43
  "lerobot_policy_dita/policy/evaluation/__init__.py": "8c0ca0bbd994637ce95307daec7647082fdb3e8e982073ab6c60ba7f9a16745f",
44
  "lerobot_policy_dita/policy/evaluation/adapter.py": "fdbfadfbfa13772eef20a513c74a06cda0e6cea456a4b2197cb314af42c2dbec",
45
  "lerobot_policy_dita/policy/evaluation/static.py": "4517d7af032dee8ef0f73217a0dda023cc48d8fc6a39624b26c9647d71b0f169",
46
- "lerobot_policy_dita/policy/modeling_dita.py": "dcf0766a3c92988bd38c55dab8c902a5b8cd97443fab00fde4189aa93c7931c0",
47
- "lerobot_policy_dita/policy/processor_dita.py": "e0c14c6b2a217e28ca6cf7e9654a24134471d8efe09acd7481358be1f3fe0707",
48
  "lerobot_policy_dita/policy/quantization/__init__.py": "8b130b24c8c2a6e5b585c1e5c80e37ba317578ded5bfc624b68a9548d82fcd67",
49
  "lerobot_policy_dita/policy/quantization/adapter.py": "1633d4eb613972afe14d0de3138ec45391764702449e1b7f6312cfeb209d2068",
50
  "lerobot_policy_dita/policy/quantization/attention.py": "e54d5105cb5930050b268d53e098bfcde6303908884f3d909e83bb50e740ec5e",
 
1
  {
2
+ "wheel": "lerobot_policy_dita-2.0.0-py3-none-any.whl",
3
+ "sha256": "b948a1e1b2f2fb22ab1f952195ccae3006e08ad3f2695825533262296395ce01",
4
  "source_python_files": 79,
5
  "all_source_files_match": true,
6
  "source_sha256": {
7
+ "lerobot_policy_dita/__init__.py": "885069ffa087e7a89a2fb1461df108617e4632fe4ddfe7a3f62070b9b50c2601",
8
  "lerobot_policy_dita/_loading.py": "325e7c57a422f2cc5827c6d95ad19df4b51acae4af0a9b70b0c98a37852e6689",
9
  "lerobot_policy_dita/approximation/__init__.py": "b0646b441737d19c58ce395dd402fa0c1dcb0e8531e4df8d8be251de20b11d5e",
10
  "lerobot_policy_dita/approximation/adapters/__init__.py": "e0b5bf1a2a01a82af6b1ab03954aa039f396096b8b3a67d17483a7f054fd98c5",
 
33
  "lerobot_policy_dita/evaluation/static.py": "758ea97ef6b68c0a32197d962d9ff9af62b2aeb337c248bc72d8d960cdeba712",
34
  "lerobot_policy_dita/evaluation/trace.py": "a4399277a49e412589df69529d952e5931d87742f0a6dd16832d39cba113e1d3",
35
  "lerobot_policy_dita/policy/__init__.py": "9785f8e7279dc6760b4b7dbbe587ed6c6f467daa1dbbdf2ea095a645c1c52a57",
36
+ "lerobot_policy_dita/policy/_lerobot_compat.py": "d3434f59edf9d1dbb5616b874d0d6babf67a254f0b48196559e06d0dae1c6214",
37
  "lerobot_policy_dita/policy/approximation/__init__.py": "0632173bd9a1595a72c9741e6bb5538f644c0f448c8caca606542ae3d2cb3b5a",
38
  "lerobot_policy_dita/policy/approximation/adapter.py": "d603f444c2237a76a23f44dd8b2df734b66525d3522695f200478b3c055152a4",
39
  "lerobot_policy_dita/policy/approximation/configuration.py": "8fa1f0f24624352b691d73c71f9fc75c0196c8f81e888e6b77a9f11eba7926af",
40
  "lerobot_policy_dita/policy/approximation/ddim.py": "d32a16f85aa670bd07375ce2691498c47b9f9e700160fde12eea33e6a56f09fa",
41
  "lerobot_policy_dita/policy/attention.py": "3253866b5ea0bdf24a85b2047d813573e24588a4294adc9b72d01488d236909e",
42
+ "lerobot_policy_dita/policy/configuration_dita.py": "379bbbb0124e445d3930e527c5e8706451f6c16d76775f04fffdb97230761f3b",
43
  "lerobot_policy_dita/policy/evaluation/__init__.py": "8c0ca0bbd994637ce95307daec7647082fdb3e8e982073ab6c60ba7f9a16745f",
44
  "lerobot_policy_dita/policy/evaluation/adapter.py": "fdbfadfbfa13772eef20a513c74a06cda0e6cea456a4b2197cb314af42c2dbec",
45
  "lerobot_policy_dita/policy/evaluation/static.py": "4517d7af032dee8ef0f73217a0dda023cc48d8fc6a39624b26c9647d71b0f169",
46
+ "lerobot_policy_dita/policy/modeling_dita.py": "1fb98b081deb3c47f51180e31874abdf342b2fb9e5b8d5d8d7bef5e60a0c7a1d",
47
+ "lerobot_policy_dita/policy/processor_dita.py": "3173c16c7be81bdb5f86cce305eee8f96a16235acfb45586f874e80324f8257b",
48
  "lerobot_policy_dita/policy/quantization/__init__.py": "8b130b24c8c2a6e5b585c1e5c80e37ba317578ded5bfc624b68a9548d82fcd67",
49
  "lerobot_policy_dita/policy/quantization/adapter.py": "1633d4eb613972afe14d0de3138ec45391764702449e1b7f6312cfeb209d2068",
50
  "lerobot_policy_dita/policy/quantization/attention.py": "e54d5105cb5930050b268d53e098bfcde6303908884f3d909e83bb50e740ec5e",
runtime_validation_report.json CHANGED
@@ -1,33 +1,470 @@
1
  {
2
- "source": "albus2024/dita_long",
3
- "dataset_suite": "libero_10_no_noops",
4
- "strict_from_pretrained": true,
5
- "processor_stats_roundtrip": true,
6
- "model_roundtrip_max_abs_diff": 0.0,
7
- "inference_steps": 3,
8
- "actions_finite": true,
9
- "action_shape": [
10
- 1,
11
- 7
12
- ],
13
- "gripper_values": [
14
- -1.0,
15
- -1.0,
16
- -1.0
17
- ],
18
- "history_lengths": [
19
- 1,
20
- 2,
21
- 2
22
- ],
23
- "result": "passed",
24
- "runtime_version": "1.0.5",
25
- "runtime_from_bundled_wheel": true,
26
- "dtype_cli_overrides": [
27
- "float32",
28
- "float16",
29
- "bfloat16"
30
- ],
31
- "weights_and_processor_files_unchanged": true,
32
- "full_task_benchmark_run": false
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  }
 
1
  {
2
+ "runtime_version": "2.0.0",
3
+ "unit_tests_passed": 305,
4
+ "libero_four_checkpoint_real_frame_parity": true,
5
+ "libero_spatial_simulator_steps": 3,
6
+ "hardware_rollout_tested": false,
7
+ "task_success_evaluated": false,
8
+ "real_data_validation": {
9
+ "libero": {
10
+ "mode": "binary",
11
+ "dataset_repo_id": "HuggingFaceVLA/libero",
12
+ "episodes": [
13
+ 0,
14
+ 1,
15
+ 2
16
+ ],
17
+ "frames": 843,
18
+ "training_steps": 10,
19
+ "resume_steps": 1,
20
+ "batch_size": 4,
21
+ "losses": [
22
+ 0.201,
23
+ 0.139,
24
+ 0.288,
25
+ 0.059,
26
+ 0.156,
27
+ 0.183,
28
+ 0.152,
29
+ 0.092,
30
+ 0.241,
31
+ 0.215,
32
+ 0.441
33
+ ],
34
+ "gradient_norms": [
35
+ 6.592,
36
+ 4.542,
37
+ 7.649,
38
+ 2.729,
39
+ 4.631,
40
+ 4.119,
41
+ 4.009,
42
+ 3.905,
43
+ 4.769,
44
+ 7.744,
45
+ 13.014
46
+ ],
47
+ "reloaded_loss": 0.10520374029874802,
48
+ "changed_weight_tensors": 198,
49
+ "all_model_and_optimizer_tensors_finite": true,
50
+ "optimizer_steps": [
51
+ 11.0
52
+ ],
53
+ "processor_stats_preserved_on_resume": true,
54
+ "real_action_encode_decode_roundtrip": true,
55
+ "gripper_bounds_source": "LIBERO signed commands",
56
+ "dataset_gripper_min_max": [
57
+ -1.0,
58
+ 1.0
59
+ ],
60
+ "bound_gripper_min_max": [
61
+ -1.0,
62
+ 1.0
63
+ ],
64
+ "inference_shape": [
65
+ 4,
66
+ 10,
67
+ 7
68
+ ],
69
+ "selected_action_shape": [
70
+ 4,
71
+ 7
72
+ ],
73
+ "inference_gripper_values": [
74
+ -1.0,
75
+ -1.0,
76
+ -1.0,
77
+ -1.0,
78
+ -1.0,
79
+ -1.0,
80
+ -1.0,
81
+ -1.0,
82
+ -1.0,
83
+ -1.0,
84
+ -1.0,
85
+ -1.0,
86
+ -1.0,
87
+ -1.0,
88
+ -1.0,
89
+ -1.0,
90
+ -1.0,
91
+ -1.0,
92
+ -1.0,
93
+ -1.0,
94
+ -1.0,
95
+ -1.0,
96
+ -1.0,
97
+ -1.0,
98
+ -1.0,
99
+ -1.0,
100
+ -1.0,
101
+ -1.0,
102
+ -1.0,
103
+ -1.0,
104
+ 1.0,
105
+ 1.0,
106
+ 1.0,
107
+ 1.0,
108
+ 1.0,
109
+ 1.0,
110
+ 1.0,
111
+ 1.0,
112
+ 1.0,
113
+ 1.0
114
+ ],
115
+ "runtime_version": "2.0.0",
116
+ "versions": {
117
+ "lerobot": "0.6.1",
118
+ "torch": "2.9.1",
119
+ "accelerate": "1.14.0",
120
+ "diffusers": "0.39.0"
121
+ },
122
+ "scope": "Real-data training, resume and offline inference; no task success or hardware rollout claim"
123
+ },
124
+ "so101": {
125
+ "mode": "continuous",
126
+ "dataset_repo_id": "albus2024/so101_merged",
127
+ "episodes": [
128
+ 0,
129
+ 1,
130
+ 2
131
+ ],
132
+ "frames": 1341,
133
+ "training_steps": 10,
134
+ "resume_steps": 1,
135
+ "batch_size": 4,
136
+ "losses": [
137
+ 0.188,
138
+ 0.379,
139
+ 0.258,
140
+ 0.078,
141
+ 0.139,
142
+ 0.227,
143
+ 0.131,
144
+ 0.091,
145
+ 0.319,
146
+ 0.227,
147
+ 0.544
148
+ ],
149
+ "gradient_norms": [
150
+ 6.483,
151
+ 9.196,
152
+ 7.543,
153
+ 2.857,
154
+ 4.061,
155
+ 4.045,
156
+ 3.402,
157
+ 3.099,
158
+ 6.443,
159
+ 4.464,
160
+ 8.722
161
+ ],
162
+ "reloaded_loss": 0.32114681601524353,
163
+ "changed_weight_tensors": 198,
164
+ "all_model_and_optimizer_tensors_finite": true,
165
+ "optimizer_steps": [
166
+ 11.0
167
+ ],
168
+ "processor_stats_preserved_on_resume": true,
169
+ "real_action_encode_decode_roundtrip": true,
170
+ "gripper_bounds_source": "action.min/max",
171
+ "dataset_gripper_min_max": [
172
+ 0.37735849618911743,
173
+ 47.47169876098633
174
+ ],
175
+ "bound_gripper_min_max": [
176
+ 0.37735849618911743,
177
+ 47.47169876098633
178
+ ],
179
+ "inference_shape": [
180
+ 4,
181
+ 10,
182
+ 7
183
+ ],
184
+ "selected_action_shape": [
185
+ 4,
186
+ 7
187
+ ],
188
+ "inference_gripper_values": [
189
+ 2.7805802822113037,
190
+ 4.978194713592529,
191
+ 6.185774326324463,
192
+ 6.798575401306152,
193
+ 5.922640800476074,
194
+ 12.053372383117676,
195
+ 11.256832122802734,
196
+ 19.64849853515625,
197
+ 10.308959007263184,
198
+ 5.831273078918457,
199
+ 16.023744583129883,
200
+ 11.27537727355957,
201
+ 7.672808647155762,
202
+ 8.728656768798828,
203
+ 7.07811164855957,
204
+ 7.678109645843506,
205
+ 8.474404335021973,
206
+ 10.399279594421387,
207
+ 5.7238264083862305,
208
+ 1.8922457695007324,
209
+ 19.525482177734375,
210
+ 13.28436279296875,
211
+ 12.212488174438477,
212
+ 7.542376518249512,
213
+ 7.725221633911133,
214
+ 7.23825216293335,
215
+ 9.160019874572754,
216
+ 9.65340518951416,
217
+ 6.483657360076904,
218
+ 9.079004287719727,
219
+ 2.6967198848724365,
220
+ 0.8949151635169983,
221
+ 2.467010021209717,
222
+ 1.1595251560211182,
223
+ 5.166204929351807,
224
+ 5.179502010345459,
225
+ 4.2831854820251465,
226
+ 0.5067476630210876,
227
+ 0.44492819905281067,
228
+ 1.639739751815796
229
+ ],
230
+ "runtime_version": "2.0.0",
231
+ "versions": {
232
+ "lerobot": "0.6.1",
233
+ "torch": "2.9.1",
234
+ "accelerate": "1.14.0",
235
+ "diffusers": "0.39.0"
236
+ },
237
+ "scope": "Real-data training, resume and offline inference; no task success or hardware rollout claim"
238
+ },
239
+ "wheel_libero": {
240
+ "mode": "binary",
241
+ "dataset_repo_id": "HuggingFaceVLA/libero",
242
+ "episodes": [
243
+ 0,
244
+ 1,
245
+ 2
246
+ ],
247
+ "frames": 843,
248
+ "training_steps": 10,
249
+ "resume_steps": 1,
250
+ "batch_size": 4,
251
+ "losses": [
252
+ 0.201,
253
+ 0.139,
254
+ 0.288,
255
+ 0.059,
256
+ 0.156,
257
+ 0.183,
258
+ 0.152,
259
+ 0.092,
260
+ 0.241,
261
+ 0.215,
262
+ 0.441
263
+ ],
264
+ "gradient_norms": [
265
+ 6.592,
266
+ 4.542,
267
+ 7.649,
268
+ 2.729,
269
+ 4.631,
270
+ 4.119,
271
+ 4.009,
272
+ 3.905,
273
+ 4.769,
274
+ 7.744,
275
+ 13.014
276
+ ],
277
+ "reloaded_loss": 0.29260557889938354,
278
+ "changed_weight_tensors": 198,
279
+ "all_model_and_optimizer_tensors_finite": true,
280
+ "optimizer_steps": [
281
+ 11.0
282
+ ],
283
+ "processor_stats_preserved_on_resume": true,
284
+ "real_action_encode_decode_roundtrip": true,
285
+ "gripper_bounds_source": "LIBERO signed commands",
286
+ "dataset_gripper_min_max": [
287
+ -1.0,
288
+ 1.0
289
+ ],
290
+ "bound_gripper_min_max": [
291
+ -1.0,
292
+ 1.0
293
+ ],
294
+ "inference_shape": [
295
+ 4,
296
+ 10,
297
+ 7
298
+ ],
299
+ "selected_action_shape": [
300
+ 4,
301
+ 7
302
+ ],
303
+ "inference_gripper_values": [
304
+ -1.0,
305
+ -1.0,
306
+ -1.0,
307
+ -1.0,
308
+ -1.0,
309
+ -1.0,
310
+ -1.0,
311
+ -1.0,
312
+ -1.0,
313
+ -1.0,
314
+ -1.0,
315
+ -1.0,
316
+ -1.0,
317
+ -1.0,
318
+ -1.0,
319
+ -1.0,
320
+ -1.0,
321
+ -1.0,
322
+ -1.0,
323
+ -1.0,
324
+ -1.0,
325
+ -1.0,
326
+ -1.0,
327
+ -1.0,
328
+ -1.0,
329
+ -1.0,
330
+ -1.0,
331
+ -1.0,
332
+ -1.0,
333
+ -1.0,
334
+ 1.0,
335
+ 1.0,
336
+ 1.0,
337
+ 1.0,
338
+ 1.0,
339
+ 1.0,
340
+ 1.0,
341
+ 1.0,
342
+ 1.0,
343
+ 1.0
344
+ ],
345
+ "runtime_version": "2.0.0",
346
+ "versions": {
347
+ "lerobot": "0.6.1",
348
+ "torch": "2.9.1",
349
+ "accelerate": "1.14.0",
350
+ "diffusers": "0.39.0"
351
+ },
352
+ "scope": "Real-data training, resume and offline inference; no task success or hardware rollout claim"
353
+ },
354
+ "wheel_so101": {
355
+ "mode": "continuous",
356
+ "dataset_repo_id": "albus2024/so101_merged",
357
+ "episodes": [
358
+ 0,
359
+ 1,
360
+ 2
361
+ ],
362
+ "frames": 1341,
363
+ "training_steps": 10,
364
+ "resume_steps": 1,
365
+ "batch_size": 4,
366
+ "losses": [
367
+ 0.188,
368
+ 0.379,
369
+ 0.258,
370
+ 0.078,
371
+ 0.139,
372
+ 0.227,
373
+ 0.131,
374
+ 0.091,
375
+ 0.319,
376
+ 0.227,
377
+ 0.544
378
+ ],
379
+ "gradient_norms": [
380
+ 6.483,
381
+ 9.196,
382
+ 7.543,
383
+ 2.857,
384
+ 4.061,
385
+ 4.045,
386
+ 3.402,
387
+ 3.099,
388
+ 6.443,
389
+ 4.464,
390
+ 8.722
391
+ ],
392
+ "reloaded_loss": 0.15004707872867584,
393
+ "changed_weight_tensors": 198,
394
+ "all_model_and_optimizer_tensors_finite": true,
395
+ "optimizer_steps": [
396
+ 11.0
397
+ ],
398
+ "processor_stats_preserved_on_resume": true,
399
+ "real_action_encode_decode_roundtrip": true,
400
+ "gripper_bounds_source": "action.min/max",
401
+ "dataset_gripper_min_max": [
402
+ 0.37735849618911743,
403
+ 47.47169876098633
404
+ ],
405
+ "bound_gripper_min_max": [
406
+ 0.37735849618911743,
407
+ 47.47169876098633
408
+ ],
409
+ "inference_shape": [
410
+ 4,
411
+ 10,
412
+ 7
413
+ ],
414
+ "selected_action_shape": [
415
+ 4,
416
+ 7
417
+ ],
418
+ "inference_gripper_values": [
419
+ 2.7805802822113037,
420
+ 4.978194713592529,
421
+ 6.185774326324463,
422
+ 6.798575401306152,
423
+ 5.922640800476074,
424
+ 12.053372383117676,
425
+ 11.256832122802734,
426
+ 19.64849853515625,
427
+ 10.308959007263184,
428
+ 5.831273078918457,
429
+ 16.023744583129883,
430
+ 11.27537727355957,
431
+ 7.672808647155762,
432
+ 8.728656768798828,
433
+ 7.07811164855957,
434
+ 7.678109645843506,
435
+ 8.474404335021973,
436
+ 10.399279594421387,
437
+ 5.7238264083862305,
438
+ 1.8922457695007324,
439
+ 19.525482177734375,
440
+ 13.28436279296875,
441
+ 12.212488174438477,
442
+ 7.542376518249512,
443
+ 7.725221633911133,
444
+ 7.23825216293335,
445
+ 9.160019874572754,
446
+ 9.65340518951416,
447
+ 6.483657360076904,
448
+ 9.079004287719727,
449
+ 2.6967198848724365,
450
+ 0.8949151635169983,
451
+ 2.467010021209717,
452
+ 1.1595251560211182,
453
+ 5.166204929351807,
454
+ 5.179502010345459,
455
+ 4.2831854820251465,
456
+ 0.5067476630210876,
457
+ 0.44492819905281067,
458
+ 1.639739751815796
459
+ ],
460
+ "runtime_version": "2.0.0",
461
+ "versions": {
462
+ "lerobot": "0.6.1",
463
+ "torch": "2.9.1",
464
+ "accelerate": "1.14.0",
465
+ "diffusers": "0.39.0"
466
+ },
467
+ "scope": "Real-data training, resume and offline inference; no task success or hardware rollout claim"
468
+ }
469
+ }
470
  }