Robotics
LeRobot
Safetensors
imitation-learning
act
b-spline
so101
bspline_act
aryankakad commited on
Commit
f02afaf
·
verified ·
1 Parent(s): b175221

Add checkpoint at step 100000

Browse files
checkpoints/100000/README.md ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ library_name: lerobot
4
+ pipeline_tag: robotics
5
+ tags:
6
+ - robotics
7
+ - lerobot
8
+ - imitation-learning
9
+ - act
10
+ - b-spline
11
+ - so101
12
+ - bspline_act
13
+ datasets:
14
+ - aryankakad/CUPSTACKING
15
+ model_name: cupstack_bspline_act
16
+ ---
17
+
18
+ # cupstack_bspline_act
19
+
20
+ An [ACT](https://huggingface.co/papers/2304.13705) policy that predicts **B-spline
21
+ trajectory segments** instead of discrete action chunks, trained on SO-101 cup
22
+ stacking. This is the "Reg.+BSP" variant from
23
+ [B-spline Policy: Accelerating Manipulation Policies via B-spline Action Representations](https://arxiv.org/abs/2607.09648).
24
+
25
+ The practical consequence: **you can run this checkpoint faster without retraining it.**
26
+ The policy outputs a curve, so executing `a(n·t)` replays the same trajectory geometry
27
+ n times faster. Speed-up is an inference flag.
28
+
29
+ > [!WARNING]
30
+ > **This checkpoint has never been evaluated on held-out data or on hardware.**
31
+ > It was trained on all 50 episodes with no validation split, so its numbers measure
32
+ > fit, not generalization. Treat first hardware runs as untested — keep the e-stop
33
+ > within reach. See [Limitations](#limitations).
34
+
35
+ ## Usage
36
+
37
+ ```bash
38
+ lerobot-rollout \
39
+ --strategy.type=base \
40
+ --policy.path=aryankakad/cupstack_bspline_act \
41
+ --policy.speed_up=1.0 \
42
+ --device=cuda \
43
+ --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=FOLLOWER \
44
+ --robot.cameras='{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, gripper: {type: opencv, index_or_path: 4, width: 640, height: 480, fps: 30}}' \
45
+ --task="stack the cups" \
46
+ --fps=30 --duration=30 --display_data=true
47
+ ```
48
+
49
+ Raise `--policy.speed_up` to 2.0 or 4.0 to execute faster. Start at 1.0 and step up
50
+ only once the task succeeds.
51
+
52
+ ### Camera naming is not optional
53
+
54
+ The policy requires exactly these observation keys, so the `--robot.cameras` dict keys
55
+ must be **`front`** and **`gripper`**, lowercase:
56
+
57
+ | Key | Shape |
58
+ |---|---|
59
+ | `observation.images.front` | `(3, 480, 640)` |
60
+ | `observation.images.gripper` | `(3, 480, 640)` |
61
+ | `observation.state` | `(6,)` |
62
+
63
+ Joint order is `shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll, gripper`.
64
+ Swapping the two cameras produces confident but wrong behaviour rather than an error.
65
+
66
+ ### Requirements
67
+
68
+ This policy type is not in upstream LeRobot. You need a checkout containing the
69
+ `bspline_act` policy, installed with the scipy extra:
70
+
71
+ ```bash
72
+ uv pip install -e ".[feetech,bspline]"
73
+ ```
74
+
75
+ `scipy>=1.15` is required for `interpolate.generate_knots`.
76
+
77
+ ### No dataset needed at inference
78
+
79
+ Unnormalization statistics are stored as buffers inside `model.safetensors`, so the
80
+ checkpoint is self-contained. You do not need the training dataset on the robot machine.
81
+
82
+ ## Training
83
+
84
+ | | |
85
+ |---|---|
86
+ | Steps | **100,000** |
87
+ | Batch size | 32 |
88
+ | Epochs | 133.09 |
89
+ | Dataset | [`aryankakad/CUPSTACKING`](https://huggingface.co/datasets/aryankakad/CUPSTACKING) → B-spline converted |
90
+ | Episodes / frames | 50 / 24,044 @ 30 fps |
91
+ | Optimizer | AdamW, lr 2e-5 (backbone 1e-5), wd 1e-4 |
92
+ | Precision | bf16 autocast + `channels_last` |
93
+ | Hardware | 1× RTX 4090, 5 h 24 min |
94
+ | Seed | 1000 |
95
+
96
+ Learning rate is 2e-5 rather than ACT's default 1e-5, sqrt-scaled for batch 32.
97
+
98
+ ### Loss
99
+
100
+ | Step | loss | l1_loss | kld_loss |
101
+ |---|---|---|---|
102
+ | 500 | 3.027 | 0.390 | 0.264 |
103
+ | 10k | 0.166 | 0.104 | 0.007 |
104
+ | 50k | ~0.111 | 0.041 | 0.007 |
105
+ | **100k** | **0.095** | **0.026** | **0.007** |
106
+
107
+ Training loss only — there was no validation split.
108
+
109
+ ## Architecture
110
+
111
+ Standard ACT with one change: the decoder emits a B-spline **parameter matrix** rather
112
+ than an action chunk.
113
+
114
+ ```
115
+ (n_knots, 1 + action_dim) = (16, 7) = 112 values per prediction
116
+ column 0 knot vector, in source-frame units, 0 = "now"
117
+ columns 1: control points, one per joint
118
+ ```
119
+
120
+ | | |
121
+ |---|---|
122
+ | Params | 52 M |
123
+ | Vision backbone | ResNet18 (ImageNet init) |
124
+ | dim_model / chunk_size | 512 / 16 |
125
+ | VAE | enabled, kl_weight 10.0 |
126
+ | B-spline degree | 3 (cubic, C² continuous) |
127
+ | bspline_chunk_size | 10 |
128
+ | Fitting tolerance ε | 0.2 (degrees) |
129
+
130
+ Knot spacing is fitted adaptively per episode, so a fixed 16 rows covers a **variable**
131
+ time horizon — 0.53 s to 1.47 s per segment on this dataset, 0.84 s mean. The network
132
+ only runs when a segment is exhausted, which decouples policy rate from control rate.
133
+
134
+ ### On the fitting tolerance
135
+
136
+ ε = 0.2 is not the paper's value. The paper uses 0.002 for metre-scale end-effector
137
+ actions; SO-101 stores joint targets in **degrees** (~±120), roughly 100× larger. At
138
+ ε = 0.002 compression is 1.06× — one knot per frame, which defeats the representation.
139
+
140
+ | ε | Compression | p99 reconstruction | Segment span |
141
+ |---|---|---|---|
142
+ | 0.05 | 1.4× | 0.05° | 0.44 s |
143
+ | **0.2** | **2.7×** | **0.19°** | **0.84 s** |
144
+ | 0.5 | 4.1× | 0.48° | 1.24 s |
145
+
146
+ 2.7× sits inside the paper's reported 1.12×–3.34× range.
147
+
148
+ ## Evaluation
149
+
150
+ **Offline only. No hardware evaluation has been performed.**
151
+
152
+ Open-loop prediction error — decoded trajectory vs ground-truth actions, measured on
153
+ **training data**:
154
+
155
+ | Checkpoint | Mean | Median | p90 | Max |
156
+ |---|---|---|---|---|
157
+ | 20k | 5.99° | 4.12° | 8.78° | 45.2° |
158
+ | 50k | 3.34° | 2.28° | 6.53° | 30.8° |
159
+ | **100k** | **2.10°** | **1.61°** | **3.86°** | **18.6°** |
160
+
161
+ Error was still falling at 100k and 2.10° is far from zero, which argues against
162
+ outright memorization — but this is training data, so it is not evidence of
163
+ generalization.
164
+
165
+ The representation is not the bottleneck: B-spline fitting reconstructs to 0.19° p99,
166
+ so essentially all of the 2.10° is policy prediction error.
167
+
168
+ Temporal rescaling is **exact**. On a real predicted segment (0.76 s span), `a(2t)` and
169
+ `a(4t)` reproduce the 1× samples to 0.00e+00, consuming the segment in 22 / 11 / 5
170
+ control ticks.
171
+
172
+ ## Limitations
173
+
174
+ - **No validation split.** All 50 episodes were used for training (`eval_steps: 0`).
175
+ Generalization is unmeasured.
176
+ - **No hardware evaluation.** Task success rate is unknown.
177
+ - **Speed-up has a hardware ceiling.** The paper reaches 4× on cube picking but only 2×
178
+ on speed stacking before the low-level controller loses tracking. Cup stacking is the
179
+ same precise-placement regime, so expect degradation near 2×. Retiming does not make
180
+ the arm faster — past the tracking limit it overshoots rather than stopping.
181
+ - **Single task, single scene.** 50 demonstrations of one cup-stacking setup; no
182
+ robustness to lighting, camera placement, or cup position changes should be assumed.
183
+ - **Camera assignment is silent when wrong.** Swapped views degrade behaviour without
184
+ raising an error.
185
+
186
+ ## Citation
187
+
188
+ ```bibtex
189
+ @article{han2026b,
190
+ title={B-spline Policy: Accelerating Manipulation Policies via B-spline Action Representations},
191
+ author={Han, Xiaoshen and Xiong, Haoyu and Chen, Haonan and Liu, Chaoqi and
192
+ Torralba, Antonio and Zhu, Yuke and Du, Yilun},
193
+ journal={arXiv preprint arXiv:2607.09648},
194
+ year={2026}
195
+ }
196
+ ```
checkpoints/100000/config.json ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "type": "bspline_act",
3
+ "n_obs_steps": 1,
4
+ "input_features": {
5
+ "observation.state": {
6
+ "type": "STATE",
7
+ "shape": [
8
+ 6
9
+ ]
10
+ },
11
+ "observation.images.front": {
12
+ "type": "VISUAL",
13
+ "shape": [
14
+ 3,
15
+ 480,
16
+ 640
17
+ ]
18
+ },
19
+ "observation.images.gripper": {
20
+ "type": "VISUAL",
21
+ "shape": [
22
+ 3,
23
+ 480,
24
+ 640
25
+ ]
26
+ }
27
+ },
28
+ "output_features": {
29
+ "action": {
30
+ "type": "ACTION",
31
+ "shape": [
32
+ 112
33
+ ]
34
+ }
35
+ },
36
+ "device": "cuda",
37
+ "use_amp": false,
38
+ "use_peft": false,
39
+ "push_to_hub": false,
40
+ "repo_id": null,
41
+ "private": null,
42
+ "tags": null,
43
+ "license": null,
44
+ "pretrained_path": null,
45
+ "pretrained_revision": null,
46
+ "chunk_size": 16,
47
+ "n_action_steps": 16,
48
+ "normalization_mapping": {
49
+ "VISUAL": "MEAN_STD",
50
+ "STATE": "MEAN_STD",
51
+ "ACTION": "MEAN_STD"
52
+ },
53
+ "vision_backbone": "resnet18",
54
+ "pretrained_backbone_weights": "ResNet18_Weights.IMAGENET1K_V1",
55
+ "replace_final_stride_with_dilation": false,
56
+ "pre_norm": false,
57
+ "dim_model": 512,
58
+ "n_heads": 8,
59
+ "dim_feedforward": 3200,
60
+ "feedforward_activation": "relu",
61
+ "n_encoder_layers": 4,
62
+ "n_decoder_layers": 1,
63
+ "use_vae": true,
64
+ "latent_dim": 32,
65
+ "n_vae_encoder_layers": 4,
66
+ "temporal_ensemble_coeff": null,
67
+ "dropout": 0.1,
68
+ "kl_weight": 10.0,
69
+ "optimizer_lr": 2e-05,
70
+ "optimizer_weight_decay": 0.0001,
71
+ "optimizer_lr_backbone": 1e-05,
72
+ "bspline_degree": 3,
73
+ "bspline_chunk_size": 10,
74
+ "relative_knots": false,
75
+ "speed_up": 1.0,
76
+ "n_decoded_steps": 32,
77
+ "align_segments": true,
78
+ "align_error_threshold": 0.5,
79
+ "align_max_fraction": 0.2,
80
+ "align_exclude_last_dims": 1,
81
+ "replan_margin": 1.0,
82
+ "channels_last": true
83
+ }
checkpoints/100000/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a77d68bc97ef70d0034826afe7e58465472f1573a40581c60defae1cbe52b24c
3
+ size 206360820
checkpoints/100000/policy_postprocessor.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "policy_postprocessor",
3
+ "steps": [
4
+ {
5
+ "registry_name": "device_processor",
6
+ "config": {
7
+ "device": "cpu",
8
+ "float_dtype": null
9
+ }
10
+ }
11
+ ]
12
+ }
checkpoints/100000/policy_preprocessor.json ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "policy_preprocessor",
3
+ "steps": [
4
+ {
5
+ "registry_name": "rename_observations_processor",
6
+ "config": {
7
+ "rename_map": {}
8
+ }
9
+ },
10
+ {
11
+ "registry_name": "to_batch_processor",
12
+ "config": {}
13
+ },
14
+ {
15
+ "registry_name": "device_processor",
16
+ "config": {
17
+ "device": "cuda",
18
+ "float_dtype": null
19
+ }
20
+ },
21
+ {
22
+ "registry_name": "normalizer_processor",
23
+ "config": {
24
+ "eps": 1e-08,
25
+ "features": {
26
+ "observation.state": {
27
+ "type": "STATE",
28
+ "shape": [
29
+ 6
30
+ ]
31
+ },
32
+ "observation.images.front": {
33
+ "type": "VISUAL",
34
+ "shape": [
35
+ 3,
36
+ 480,
37
+ 640
38
+ ]
39
+ },
40
+ "observation.images.gripper": {
41
+ "type": "VISUAL",
42
+ "shape": [
43
+ 3,
44
+ 480,
45
+ 640
46
+ ]
47
+ },
48
+ "action": {
49
+ "type": "ACTION",
50
+ "shape": [
51
+ 112
52
+ ]
53
+ }
54
+ },
55
+ "norm_map": {
56
+ "VISUAL": "MEAN_STD",
57
+ "STATE": "MEAN_STD",
58
+ "ACTION": "MEAN_STD"
59
+ }
60
+ },
61
+ "state_file": "policy_preprocessor_step_3_normalizer_processor.safetensors"
62
+ }
63
+ ]
64
+ }
checkpoints/100000/policy_preprocessor_step_3_normalizer_processor.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:02568f8cfc013582b7eb3e22a63efb41cf4125b6adb6ad83935e8dbc2eb6e42c
3
+ size 11592
checkpoints/100000/train_config.json ADDED
@@ -0,0 +1,230 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "dataset": {
3
+ "repo_id": "aryankakad/CUPSTACKING_bspline",
4
+ "root": null,
5
+ "episodes": null,
6
+ "image_transforms": {
7
+ "enable": false,
8
+ "max_num_transforms": 3,
9
+ "random_order": false,
10
+ "tfs": {
11
+ "brightness": {
12
+ "weight": 1.0,
13
+ "type": "ColorJitter",
14
+ "kwargs": {
15
+ "brightness": [
16
+ 0.8,
17
+ 1.2
18
+ ]
19
+ }
20
+ },
21
+ "contrast": {
22
+ "weight": 1.0,
23
+ "type": "ColorJitter",
24
+ "kwargs": {
25
+ "contrast": [
26
+ 0.8,
27
+ 1.2
28
+ ]
29
+ }
30
+ },
31
+ "saturation": {
32
+ "weight": 1.0,
33
+ "type": "ColorJitter",
34
+ "kwargs": {
35
+ "saturation": [
36
+ 0.5,
37
+ 1.5
38
+ ]
39
+ }
40
+ },
41
+ "hue": {
42
+ "weight": 1.0,
43
+ "type": "ColorJitter",
44
+ "kwargs": {
45
+ "hue": [
46
+ -0.05,
47
+ 0.05
48
+ ]
49
+ }
50
+ },
51
+ "sharpness": {
52
+ "weight": 1.0,
53
+ "type": "SharpnessJitter",
54
+ "kwargs": {
55
+ "sharpness": [
56
+ 0.5,
57
+ 1.5
58
+ ]
59
+ }
60
+ },
61
+ "affine": {
62
+ "weight": 1.0,
63
+ "type": "RandomAffine",
64
+ "kwargs": {
65
+ "degrees": [
66
+ -5.0,
67
+ 5.0
68
+ ],
69
+ "translate": [
70
+ 0.05,
71
+ 0.05
72
+ ]
73
+ }
74
+ }
75
+ }
76
+ },
77
+ "revision": null,
78
+ "use_imagenet_stats": true,
79
+ "video_backend": "torchcodec",
80
+ "return_uint8": false,
81
+ "depth_output_unit": "mm",
82
+ "streaming": false,
83
+ "eval_split": 0.0
84
+ },
85
+ "env": null,
86
+ "policy": {
87
+ "type": "bspline_act",
88
+ "n_obs_steps": 1,
89
+ "input_features": {
90
+ "observation.state": {
91
+ "type": "STATE",
92
+ "shape": [
93
+ 6
94
+ ]
95
+ },
96
+ "observation.images.front": {
97
+ "type": "VISUAL",
98
+ "shape": [
99
+ 3,
100
+ 480,
101
+ 640
102
+ ]
103
+ },
104
+ "observation.images.gripper": {
105
+ "type": "VISUAL",
106
+ "shape": [
107
+ 3,
108
+ 480,
109
+ 640
110
+ ]
111
+ }
112
+ },
113
+ "output_features": {
114
+ "action": {
115
+ "type": "ACTION",
116
+ "shape": [
117
+ 112
118
+ ]
119
+ }
120
+ },
121
+ "device": "cuda",
122
+ "use_amp": false,
123
+ "use_peft": false,
124
+ "push_to_hub": false,
125
+ "repo_id": null,
126
+ "private": null,
127
+ "tags": null,
128
+ "license": null,
129
+ "pretrained_path": null,
130
+ "pretrained_revision": null,
131
+ "chunk_size": 16,
132
+ "n_action_steps": 16,
133
+ "normalization_mapping": {
134
+ "VISUAL": "MEAN_STD",
135
+ "STATE": "MEAN_STD",
136
+ "ACTION": "MEAN_STD"
137
+ },
138
+ "vision_backbone": "resnet18",
139
+ "pretrained_backbone_weights": "ResNet18_Weights.IMAGENET1K_V1",
140
+ "replace_final_stride_with_dilation": false,
141
+ "pre_norm": false,
142
+ "dim_model": 512,
143
+ "n_heads": 8,
144
+ "dim_feedforward": 3200,
145
+ "feedforward_activation": "relu",
146
+ "n_encoder_layers": 4,
147
+ "n_decoder_layers": 1,
148
+ "use_vae": true,
149
+ "latent_dim": 32,
150
+ "n_vae_encoder_layers": 4,
151
+ "temporal_ensemble_coeff": null,
152
+ "dropout": 0.1,
153
+ "kl_weight": 10.0,
154
+ "optimizer_lr": 2e-05,
155
+ "optimizer_weight_decay": 0.0001,
156
+ "optimizer_lr_backbone": 1e-05,
157
+ "bspline_degree": 3,
158
+ "bspline_chunk_size": 10,
159
+ "relative_knots": false,
160
+ "speed_up": 1.0,
161
+ "n_decoded_steps": 32,
162
+ "align_segments": true,
163
+ "align_error_threshold": 0.5,
164
+ "align_max_fraction": 0.2,
165
+ "align_exclude_last_dims": 1,
166
+ "replan_margin": 1.0,
167
+ "channels_last": true
168
+ },
169
+ "reward_model": null,
170
+ "output_dir": "/home/sra/mimosa/lerobot/outputs/cupstack_bspline_act",
171
+ "job_name": "cupstack_bspline_act",
172
+ "resume": false,
173
+ "seed": 1000,
174
+ "cudnn_deterministic": false,
175
+ "num_workers": 8,
176
+ "batch_size": 32,
177
+ "prefetch_factor": 4,
178
+ "persistent_workers": true,
179
+ "steps": 100000,
180
+ "env_eval_freq": 20000,
181
+ "log_freq": 500,
182
+ "eval_steps": 0,
183
+ "max_eval_samples": 0,
184
+ "tolerance_s": 0.0001,
185
+ "save_checkpoint": true,
186
+ "save_freq": 10000,
187
+ "use_policy_training_preset": true,
188
+ "optimizer": {
189
+ "type": "adamw",
190
+ "lr": 2e-05,
191
+ "weight_decay": 0.0001,
192
+ "grad_clip_norm": 10.0,
193
+ "betas": [
194
+ 0.9,
195
+ 0.999
196
+ ],
197
+ "eps": 1e-08
198
+ },
199
+ "scheduler": null,
200
+ "eval": {
201
+ "n_episodes": 50,
202
+ "batch_size": 22,
203
+ "use_async_envs": true,
204
+ "recording": false,
205
+ "recording_repo_id": null,
206
+ "recording_private": false
207
+ },
208
+ "wandb": {
209
+ "enable": false,
210
+ "disable_artifact": false,
211
+ "project": "lerobot",
212
+ "entity": null,
213
+ "notes": null,
214
+ "run_id": null,
215
+ "mode": null,
216
+ "add_tags": true
217
+ },
218
+ "peft": null,
219
+ "job": {
220
+ "target": null,
221
+ "image": "huggingface/lerobot-gpu:latest",
222
+ "timeout": "2d",
223
+ "detach": false,
224
+ "tags": []
225
+ },
226
+ "save_checkpoint_to_hub": false,
227
+ "sample_weighting": null,
228
+ "rename_map": {},
229
+ "checkpoint_path": null
230
+ }