Supersedes the provisional-label HL
This checkpoint supersedes
happyhappy-jun/qwen3-vl-4b-uvd-racer-hl6k,
which is the same recipe, base model and step count trained on the provisional
UVD target16 subtask labels (gpu26 job 13433). Only the subtask-label source
changed. Prefer this repository (and its cs16 counterpart below) for
anything new.
Checkpoint identity
- Training run: experiment
hl_cu in 20260913_target_sub_a100
- Checkpoint:
20260913_target_sub_a100/hl_cu/checkpoint-6000 (6,000 optimizer updates)
- Source job:
14240 on the lab AWS cluster gpu26 (us-west-2), 4 x A100 on a single node (partition a100, QoS normal8, node a100-st-p4d-cb-1 excluded)
- Completion: trained 6,000/6,000 steps in about 7 h 45 min, ended 2026-09-13 14:42Z (23:42 KST)
- Base model:
Qwen/Qwen3-VL-4B-Instruct at revision
ebb281ec70b05090aa6165b016eac8ec08e71b17 (license apache-2.0)
- Source promotion-manifest SHA-256:
0dd5ca0b0bc024c894af5913ae160009a215da5af212a13a63a3c79c07afe528
The run's own COMPLETE.json names checkpoint-6000
({"global_step": 6000, "microbatch": 8, "effective_batch": 128, "zero_stage": 2, "source_job": "14240"}),
trainer_state.json has global_step 6000 == max_steps 6000, and
best_model_checkpoint is null (no load-best-at-end) — so checkpoint-6000 is
the final model by construction. The published files are copied byte-for-byte from
that step. No weights, tokenizer entries or configuration values were changed for
this upload; see publication_manifest.json for per-file sizes, SHA-256 values and
origins.
What it consumes and what it emits
Input — exactly one image, no frame history. A single
768 x 256 x 3 uint8 RGB tile, the observation.images.robot0_3view_concat
stream: three 256 px-wide columns, upright and unscaled, in this order —
[ agentview_left | agentview_right | eye_in_hand ]
Prompt. The user turn is rendered from this template verbatim (template
SHA-256 02507401ec656857916b1b825605a0f51bb2ce7ce71a11ef8c18a156af4e74d1,
exactly one <image> placeholder):
Task: {task_instruction}
You are observing the robot's current camera view (three views horizontally tiled: left, right, and wrist-mounted).
<image>
What subtask should the robot execute right now? Reply with just the subtask description.
At training time {task_instruction} is the episode's full-task instruction
(the dataset's tasks[0]), and the <image> placeholder is expanded in place into
the tile's vision tokens. Serve it the same way: one user turn, one image at that
position.
Output. One bare subtask sentence, decoded greedily
(do_sample=False, num_beams=1, max_new_tokens=64). No chain of thought, no
formatting, no list.
The training recipe passes --min_pixels 50176 --max_pixels 115200, but under the
pinned Transformers 5.6.1 those two arguments are inert: the image
processor stores its bounds in a size dataclass, so the fork's
update_processor_pixels mutates nothing. The saved processor therefore carries the
base bounds {"longest_edge": 16777216, "shortest_edge": 65536}, and the
768 x 256 tile is fed unresized: image_grid_thw [1, 16, 48] = 768 patches =
192 image tokens after the 2 x 2 merge.
This is measured, not inferred, and gated in the eval harness — see
experiments/eval_manager/HL_INPUT_CONTRACT.md section 4 in the publishing lab's
repository. The processor_config.json shipped here (SHA-256
479b624a5b02852c3947d0b88e2570bb10464d583ad45092e2028099614bd820) is exactly that
base-bounds file, so loading the processor from this repository reproduces the
trained resolution.
Do not substitute a processor config carrying the recipe's 115200 / 50176
bounds: it shrinks the tile to 576 x 192, image_grid_thw [1, 12, 36], 108
image tokens — a resolution this model never saw.
Training setup
Table with columns: Item, Value| Item | Value |
|---|
| Trainer | hl_entry.py driving the pinned qwen-vl-finetune fork (runtime pin recorded in the run's launch_contract.json) |
| Data | 16 RoboCasa365 composite-unseen (CU16) target tasks, final UVD-RACER target annotations (staged dataset rc365_target_cu16_uvd_final_20260913), --dataset_use uvd_hivla_cu --data_flatten True |
| HL SFT population | 8,104 episodes → 3,202,087 train samples / 156,572 val samples |
| Steps | 6,000 (--max_steps 6000, with --num_train_epochs 15 capped by it) — 6,000 x 128 = 768,000 samples ≈ of the train split ( epoch ) |
Supervision and frame sampling
- Targets are the per-frame subtask sentences of the final UVD-RACER target
annotation delivery (derived segment key
subtask_uvd_final, sentence column
annotation.human.subtask).
- Frames are sampled
every_k: train stride 2, offset 0; val stride 40,
offset 1; an edge buffer of 3 frames is dropped on each side of a segment
boundary; tiles are encoded as JPEG quality 90.
- The HL sees no action, state or proprioception input — only the tile and the
instruction text.
Contents
model.safetensors (single unsharded bf16 weight file), config.json,
generation_config.json, tokenizer.json, tokenizer_config.json,
chat_template.jinja, processor_config.json, plus this card and
publication_manifest.json.
This repository is self-sufficient for inference — model, tokenizer and processor
all load from it directly:
from transformers import AutoProcessor, AutoModelForImageTextToText
REPO = "happyhappy-jun/qwen3-vl-4b-uvd-racer-hl6k-cu16-final"
processor = AutoProcessor.from_pretrained(REPO)
model = AutoModelForImageTextToText.from_pretrained(REPO, dtype="auto", device_map="auto")
vocab.json / merges.txt are not shipped and are not needed: tokenizer.json
is self-contained, so the fast tokenizer loads without them.
Where each file comes from
The run wrote two exports at step 6,000: the checkpoint directory
20260913_target_sub_a100/hl_cu/checkpoint-6000, which the run's own completion marker
designates, and a final save_model export at the run root. The six
weight/config/tokenizer files here are copied byte-for-byte from
checkpoint-6000. The pinned trainer passes only the tokenizer to the
Trainer as its processing class, so no checkpoint-N/ directory contains a
processor config; processor_config.json is therefore copied byte-for-byte from
the run-root save_model export — the same step of the same job — purely so that
AutoProcessor.from_pretrained resolves against this repository. It is a
Qwen3VLProcessor config holding the Qwen2VLImageProcessor settings (patch size
16, merge size 2, temporal patch size 2, mean/std 0.5) and the video-processor
settings (fps 2, frame sampling on); on this Transformers version that single file
replaces the base repo's separate preprocessor_config.json and
video_preprocessor_config.json. No preprocessing setting was changed relative
to the base model. Per-file sizes and SHA-256 values, each tagged with its origin,
are in .
Not included, by design: DeepSpeed ZeRO optimizer shards (global_step6000/),
optimizer/scheduler/RNG state, trainer_state.json, training_args.bin, training
logs and the training data. This is a model export for inference, not a
complete optimizer-state resume bundle.
Download
from huggingface_hub import snapshot_download
checkpoint_dir = snapshot_download(
"happyhappy-jun/qwen3-vl-4b-uvd-racer-hl6k-cu16-final",
)
The whole payload is submitted in one atomic commit on a freshly created
repository, so that commit's sha is the only model revision here. It cannot be
written inside this file (the text would change the commit it names); the pinned
snapshot_download(..., revision=...) snippet is recorded in the publishing lab's
publication log alongside the per-file SHA-256 values.
Limitations
No GPU inference or robot-rollout evaluation was run for this upload. Upload
verification covers source checksum identity, the Safetensors header and
contiguous tensor-offset coverage of the single weight file, payload content
scanning, and Hub file integrity after the commit — nothing more. No
subtask-accuracy, task-success, hierarchical-policy or safety-performance number is
claimed by this model card, and none should be inferred from the training losses
above: they are training/validation cross-entropy on the sampled frames of this
split, not a behavioural metric.
Further scope limits worth stating plainly: the model was trained on 16 target
tasks of one simulated benchmark with a fixed three-view tile, emits language only
(it drives no actuator by itself), and was optimized for composite-unseen (CU16)
RoboCasa365 tasks — behaviour on other task distributions, camera layouts or tile
orders is untested.
License and safety
Inherits the base model's Apache-2.0 license. Attribution: Qwen team, Alibaba
Cloud — Qwen/Qwen3-VL-4B-Instruct. This repository is an independent derivative
fine-tune and is not endorsed by the Qwen team.
Outputs are generated language and are not guaranteed to be correct or safe.
Validate in simulation and use appropriate robot safety controls before any
physical deployment.