@@ -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
4247model :
@@ -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