Skip to content

QwenVLA: a Qwen 3.5 VLM policy with a layer-wise cross-attention flow head - #660

Closed
RyanPCo wants to merge 9 commits into
ryanco/qwen35-vlmfrom
ryanco/qwenvla
Closed

RyanPCo wants to merge 9 commits into
ryanco/qwen35-vlmfrom
ryanco/qwenvla

Conversation

@RyanPCo

@RyanPCo RyanPCo commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Ports starVLA's QwenPI into EgoVerse as a new algo, so the HPT architecture campaign has a VLM-policy arm to compare against. Bottom to top:

  • bdf27905b DeterministicEvalMixin — the seeded-prompt / seeded-flow-sampling eval helpers lifted out of HPT so both algos share one contract.
  • 785b4153e multi-image fake Qwen 3.5 fixture — lets everything below be tested without loading a real checkpoint.
  • 9905b88b7 layer-wise cross-attention DiT + LayerwiseFMHead — a GR00T N1.5 / starVLA port written in torch primitives.
  • 1aeeb5592 QwenVLBackbone and QwenVLAModel — multi-frame Qwen 3.5 with all layers exposed, so the head can attend per block.
  • 45d199f45 the QwenVLA algo — embodiment prompt, padded shared action width, deterministic eval.
  • d7c81f253 configs — QwenVLA model and recipe yamls, plus the flagship keypoint data and recipes for the QwenVLA-vs-HPT comparison.
  • 80609cdaf ddp_qwenvla trainer — find_unused_parameters (the interleaved DiT leaves the last VLM layer and final norm without a gradient) and bf16 gradient compression, which took the lab's NVLink-less 8xA40 nodes from 6.4 to 3.6 s/step at per-GPU batch 16. The hook is exposed through a zero-arg factory because Lightning logs its __qualname__, which a Hydra _partial_ does not carry.
  • 6acc4940b build on CPU, move once Lightning assigns the rank's GPU — every DDP rank used to construct the algo on cuda:0 before per-rank devices were assigned, parking 8 x 4.8 GB of fp32 VLM weights on GPU 0. A fresh start just fit; a checkpoint resume loaded state into those copies first and OOMed (job 3850634).
  • c3d071e11 eval overlay fps — _video_fps divided 30 fps by world_size to undo a DistributedSampler stride that never applies (the val heads are CombinedLoaders Lightning does not shard), so rank 0 rendered every frame and the 8-GPU videos came out as 8x slow motion.

The comparison this feeds: 144-D wrist-frame keypoints, prompt "fold clothes", the same 8xA40 recipe as the HPT rerun.

Testing

test_layerwise_dit.py, test_qwenvla_algo.py, test_qwenvla_nets.py and test_qwenvla_configs.py; the config tests drive two optimizer steps through the real trainHydra.train() path against the fake backbone.

🤖 Generated with Claude Code

RyanPCo and others added 9 commits September 17, 2026 11:25
…/ starVLA port, torch primitives)

Co-Authored-By: Claude Fable 5.1 <[email protected]>
…es for the QwenVLA vs HPT comparison

QwenVLA: qwenvla_bc_mecka_{6d,kp}_0p8b, qwenvla_bc_mecka_6d_2b,
qwenvla_cotrain_eva_mecka_6d, train_zarr_mecka_flagship_{6d,kp}_qwenvla.
Comparison arms (user, 2026-09-16): 144-D wrist-frame MANO keypoints on the
flagship top-3 split with default_prompt "fold clothes":
data/mecka_fold_flagship_{opsplit,top3}_hpt_keypoints and
train_zarr_mecka_flagship_kp_hpt; hpt_bc_keypoints_wrist_300M gains the
history_len / history_dropout stem knobs and backbone_lr_scale so it matches
hpt_bc_mecka_6d_300M's lanes.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
…ression)

QwenVLA needs find_unused_parameters (the interleaved DiT leaves the last VLM
layer and final norm without a gradient) and, on the lab's NVLink-less 8 x A40
nodes, bf16 all-reduce: 6.4 -> 3.6 s/step at per-GPU batch 16. The hook is
exposed through a zero-arg factory because Lightning logs its __qualname__,
which a Hydra _partial_ does not carry.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
…once Lightning assigns the rank's GPU

Every DDP rank constructed the algo on torch.device('cuda') = cuda:0 before
Lightning had assigned per-rank devices, so 8 x 4.8 GB of fp32 VLM weights
sat on GPU 0 until on_fit_start. A fresh start just fit; a checkpoint resume
loads the state into those copies first and OOMs (job 3850634).

Co-Authored-By: Claude Fable 5.1 <[email protected]>
_video_fps divided 30 fps by world_size to undo a DistributedSampler stride
that never applies: the val heads are CombinedLoaders Lightning does not
shard (every rank runs every val batch; 1 rank = 223 val steps, 8 ranks =
8 x 223 in the 2026-09-16 DDP check), so rank 0 renders every frame and the
8-GPU videos came out as 8x slow motion (416 frames at 4 fps).

Co-Authored-By: Claude Fable 5.1 <[email protected]>
@RyanPCo RyanPCo changed the title algo: DeterministicEvalMixin, the seeded eval helpers HPT and QwenVLA share QwenVLA: a Qwen 3.5 VLM policy with a layer-wise cross-attention flow head Sep 17, 2026

RyanPCo commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor Author

Warning

This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
Learn more

This stack of pull requests is managed by Graphite. Learn more about stacking.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant