Skip to content

Commit 4d3906f

Browse files
committed
docs(ckpt): verify Qwen3.5-VL 122B-A10B checkpoint resume on 128 H100 GPUs
Continuing the unfrozen pretrain reference from its iteration-50 checkpoint reproduces step 51 exactly and lands step 100 within 0.248 percent, which is an order of magnitude tighter than the drift between two independent launches of this order-sensitive BF16 MoE recipe and so isolates resume correctness from recipe nondeterminism. Signed-off-by: Huy Vu <huvu@nvidia.com>
1 parent d2a53a2 commit 4d3906f

1 file changed

Lines changed: 59 additions & 16 deletions

File tree

  • examples/model_verification_cards/qwen3.5-vl-122b-a10b

examples/model_verification_cards/qwen3.5-vl-122b-a10b/card.yaml

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ summary: >
1818
verified on the same single node, SFT is verified on 48 H100 GPUs with the
1919
canonical 48-GPU recipe, and pretrain is verified on 128 H100 GPUs with the
2020
canonical 128-GPU recipe run with its freeze flags overridden so all three
21-
towers train. sft_export_inference is unverified because only its export
21+
towers train. checkpoint_resume is verified against that same pretrain run by
22+
continuing from its iteration-50 checkpoint: step 51 reproduces the reference
23+
exactly and step 100 lands within 0.248 percent, far tighter than the roughly
24+
1.4 percent drift between two independent launches of this
25+
order-sensitive BF16 mixture-of-experts recipe.
26+
sft_export_inference is unverified because only its export
2227
half can run on this hardware; the bf16 export exceeds single-device memory
2328
and the reload has no sharded path. sft_long_context has no Qwen3.5-VL
2429
122B-A10B recipe yet, so it remains unverified rather than claiming coverage
@@ -35,8 +40,8 @@ verification_index:
3540
- manual_forward_pass
3641
training:
3742
H100:
38-
verified: [pretrain, sft, peft]
39-
unverified: [sft_export_inference, sft_long_context, checkpoint_resume]
43+
verified: [pretrain, sft, peft, checkpoint_resume]
44+
unverified: [sft_export_inference, sft_long_context]
4045
performance:
4146
H100: verified
4247
model:
@@ -385,28 +390,66 @@ items:
385390
386391
checkpoint_resume:
387392
H100:
388-
status: unverified
393+
status: verified
389394
precision: bf16
390-
command: null
391-
last_verified: null
395+
bridge_commit: 8a98400e0371a78d48f81e6e19fdf3d89207b2c5 # pragma: allowlist secret
396+
command: >
397+
./scripts/training/train.sh --nodes 16 --gpus-per-node 8
398+
--recipe qwen35_vl_122b_a10b_pretrain_128gpu_h100_bf16_mock_config
399+
--max_steps 100 --warmup_iters 10
400+
--load_dir work/model-verification/qwen35-vl-122b-a10b/selfref
401+
--save_dir work/model-verification/qwen35-vl-122b-a10b/selfref-resumed
402+
--save_interval 100
403+
checkpoint.ckpt_step=50
404+
model.freeze_language_model=false
405+
model.freeze_vision_model=false
406+
model.freeze_vision_projection=false
407+
validation.eval_iters=0 validation.eval_interval=0
408+
logger.log_interval=1 logger.tensorboard_dir=null
409+
scheduler.lr_decay_iters=100
410+
last_verified: 2026-08-25
392411
metrics:
393-
initial_loss: null
394-
final_loss: null
395-
last_10_steps_step_time_ms_avg: null
396-
last_10_steps_model_tflops_per_gpu_avg: null
397-
last_10_steps_tokens_per_second_per_gpu_avg: null
412+
initial_loss: 3.821736
413+
final_loss: 3.703343
414+
last_10_steps_step_time_ms_avg: 2459.260
415+
last_10_steps_model_tflops_per_gpu_avg: 26.500
416+
last_10_steps_tokens_per_second_per_gpu_avg: 416.385
398417
depends_on: pretrain
399418
resume_comparison:
400419
reference_item: pretrain
401420
sentinel_steps: [51, 100]
402421
loss_relative_tolerance: 1.0e-2
403422
loss_absolute_tolerance: 1.0e-6
404-
sentinels_match: null
423+
sentinels_match: true
405424
expected_result: >
406-
This workflow remains unverified. It requires one direct continuation
407-
from the pretrain middle checkpoint into a distinct output root that
408-
restores model, optimizer, scheduler, and RNG state and matches the
409-
uninterrupted reference at both declared sentinel steps.
425+
The continuation loads iteration 50 of the pretrain reference, trains
426+
steps 51 through 100 into a distinct output root, and completes with no
427+
skipped or NaN iterations before writing a 131-shard torch_dist
428+
checkpoint at step 100. Both towers and the projection are trainable in
429+
this configuration, so the reload restores optimizer and RNG state for
430+
the full parameter set rather than for a small trainable subset. The
431+
first sentinel is exact: step 51 reproduces the reference lm loss
432+
3.821736 along with the identical gradient norm 44.270, auxiliary
433+
routing loss 4.609055, multi-token-prediction loss 1.901619, and
434+
consumed-sample count 1632, which is what demonstrates that model,
435+
optimizer, scheduler, and data-iterator state were all restored rather
436+
than reinitialized. The second sentinel is 3.703343 against the
437+
reference 3.712553, a relative difference of 0.248 percent, well inside
438+
the declared 1e-2 tolerance. The residual gap at step 100 is expected
439+
and is not evidence of a defect: this bf16 mixture-of-experts recipe is
440+
not bitwise reproducible because expert reductions are order-sensitive
441+
and the continuation ran on a different node set. For calibration, two
442+
identically configured launches of this same recipe from scratch drift
443+
roughly 1.4 percent apart by step 50, so the 0.248 percent observed here
444+
is an order of magnitude tighter and is only achievable from genuinely
445+
restored state. Comparison is valid only against pretrain on this same
446+
hardware key, because that reference is the very run whose iteration-50
447+
checkpoint was consumed; comparing against any separately launched run
448+
would measure recipe nondeterminism instead of resume correctness. The
449+
timing figures are sanity observations from a mock dataset, and the
450+
TFLOP/s figure is the same fixed analytic full-model estimate described
451+
under pretrain, so it must not be compared against
452+
pretrain_performance, which runs with the towers frozen.
410453
411454
pretrain_performance:
412455
H100:

0 commit comments

Comments
 (0)