LJYAI commited on
Commit
b7bcddc
·
verified ·
1 Parent(s): 0e92ebc

Qwen3 base no-FiT merge control wb; all9 stages

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_01_merge.json +110 -0
  2. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_01_transport.pt +3 -0
  3. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_02_merge.json +110 -0
  4. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_02_transport.pt +3 -0
  5. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_03_merge.json +110 -0
  6. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_03_transport.pt +3 -0
  7. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_04_merge.json +110 -0
  8. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_04_transport.pt +3 -0
  9. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_05_merge.json +110 -0
  10. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_05_transport.pt +3 -0
  11. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_06_merge.json +110 -0
  12. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_06_transport.pt +3 -0
  13. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_07_merge.json +110 -0
  14. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_07_transport.pt +3 -0
  15. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_08_merge.json +110 -0
  16. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_08_transport.pt +3 -0
  17. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_09_merge.json +110 -0
  18. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_09_transport.pt +3 -0
  19. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/data_manifest.json +15 -0
  20. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/selection.json +992 -0
  21. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/2026-10-11_qwen3-base-nofit-merge4.md +52 -0
  22. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/abprune_compact.py +284 -0
  23. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/abprune_stagewise_geometry.py +227 -0
  24. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/aggregate_transport_rho_fit_14bench.py +70 -0
  25. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/bootstrap_qwen3_nofit_bench8.sh +59 -0
  26. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/bootstrap_qwen3_nofit_merge4.sh +55 -0
  27. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/common_lm_data.py +651 -0
  28. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/dm500_rows.py +130 -0
  29. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/eval_llama31_8b_12bench.py +194 -0
  30. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/eval_llama31_fit_ablation_one.sh +63 -0
  31. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/eval_opencompass_ppl_fast.py +231 -0
  32. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/evaluate_abprune_compact_ppl.py +187 -0
  33. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/evaluate_hchc_wikitext2_ppl.py +152 -0
  34. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/fit_ablation_mka.py +482 -0
  35. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/fixed_span_merge_init.py +59 -0
  36. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/fuse_layers.py +0 -0
  37. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/fuse_layers_distill.py +0 -0
  38. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/launch_qwen3_nofit_bench8.sh +69 -0
  39. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/launch_qwen3_nofit_merge4.sh +64 -0
  40. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/launch_qwen3_nofit_transport_zs6.sh +119 -0
  41. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/monitor_qwen3_nofit_bench8.ps1 +58 -0
  42. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/monitor_qwen3_nofit_merge4.ps1 +52 -0
  43. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/monitor_qwen3_nofit_transport_zs6.ps1 +78 -0
  44. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/nofit_merge_control.py +37 -0
  45. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/offline_eval_policy.py +26 -0
  46. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/package_qwen3_nofit_merge_backup.py +47 -0
  47. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/prepare_lmeval9_local_cache.py +108 -0
  48. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/prepare_qwen3_nofit_merge_inputs.py +35 -0
  49. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/project_commit.txt +1 -0
  50. runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/qwen3_nofit_local_mse.py +101 -0
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_01_merge.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cycle": 1,
3
+ "anchor": 12,
4
+ "removed_original_layer": 13,
5
+ "selection_policy": "fixed_our_span_13_22_anchor12",
6
+ "fit": false,
7
+ "lambda_left": 0.0,
8
+ "transport_matrix_sha256": "ea43767088fa2f8cc0b7ba197024635f7b8a7e19fdd34170b499f470c2461672",
9
+ "transport": {
10
+ "stats": {
11
+ "tokens": 65536,
12
+ "ridge_relative": 0.001,
13
+ "ridge_absolute": 6.060115993022919e-05,
14
+ "gram_mean_diagonal": 0.06060115993022919,
15
+ "calibration_nmse": 0.12798181447783583,
16
+ "calibration_cosine": 0.9338195359584089,
17
+ "calibration_norm_ratio": 0.9329591782339236,
18
+ "transport_relative_identity_distance": 0.4961368441581726,
19
+ "enabled": true,
20
+ "batches": 32,
21
+ "coordinate_fit": "X_anchor @ T ~= X_source",
22
+ "weight_rewrite": [
23
+ "mlp.gate_proj.weight <- W_source @ T.T",
24
+ "mlp.up_proj.weight <- W_source @ T.T"
25
+ ],
26
+ "down_proj_transported": false,
27
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
28
+ },
29
+ "source_before_sha256": {
30
+ "self_attn.q_proj.weight": "67540e2474547f1d622b738128696574720591fddabb8157d2f6812ecc3af308",
31
+ "self_attn.k_proj.weight": "efbe8b71b99ef90277849155ebc45e9aad5ffe746f2958c077c7c7130d783c7b",
32
+ "self_attn.v_proj.weight": "c53545e1ac9a6447efa83242434a0b28bcda5fe12ef3866e173dd13c3da45e38",
33
+ "self_attn.o_proj.weight": "8812afef76626e47fb5dffe3a77a0cb07a07e8a7f5cf3a97453368a1284b0ffa",
34
+ "self_attn.q_norm.weight": "79bbb659cb1c2af322ca85abf7d26b088c837bcd284e70efa95a6449f69b5673",
35
+ "self_attn.k_norm.weight": "e50a57833625792c16439de078eeb810df393e1a49ef7bbe43f5af6a93923adc",
36
+ "mlp.gate_proj.weight": "6bc0a4412e6639d40e3a7d5c9099a5a05f2573bd12744019550fc11da2c52c55",
37
+ "mlp.up_proj.weight": "8715dd4fa81b5d58a577a1b2fdfb24592b23775921014b36f832fe8dbf2bbf51",
38
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b",
39
+ "input_layernorm.weight": "c419d161cc4932ecddf0ec98cbe5737b92688f0d5aa71a7e95d2006ca824ffca",
40
+ "post_attention_layernorm.weight": "ee6a9a96c2b4f35eb0807060229f10bc28080072ed9ecfa0a17e1aaa3cb4df40"
41
+ },
42
+ "source_after_sha256": {
43
+ "self_attn.q_proj.weight": "67540e2474547f1d622b738128696574720591fddabb8157d2f6812ecc3af308",
44
+ "self_attn.k_proj.weight": "efbe8b71b99ef90277849155ebc45e9aad5ffe746f2958c077c7c7130d783c7b",
45
+ "self_attn.v_proj.weight": "c53545e1ac9a6447efa83242434a0b28bcda5fe12ef3866e173dd13c3da45e38",
46
+ "self_attn.o_proj.weight": "8812afef76626e47fb5dffe3a77a0cb07a07e8a7f5cf3a97453368a1284b0ffa",
47
+ "self_attn.q_norm.weight": "79bbb659cb1c2af322ca85abf7d26b088c837bcd284e70efa95a6449f69b5673",
48
+ "self_attn.k_norm.weight": "e50a57833625792c16439de078eeb810df393e1a49ef7bbe43f5af6a93923adc",
49
+ "mlp.gate_proj.weight": "655a66345118a70ec952e549407ec7f19222782a04bf0db39c5ee8372372a2bf",
50
+ "mlp.up_proj.weight": "cb86cdbce20a724154f50658e0c2cfc3ec3d63e3802388217035698470825d82",
51
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b",
52
+ "input_layernorm.weight": "c419d161cc4932ecddf0ec98cbe5737b92688f0d5aa71a7e95d2006ca824ffca",
53
+ "post_attention_layernorm.weight": "ee6a9a96c2b4f35eb0807060229f10bc28080072ed9ecfa0a17e1aaa3cb4df40"
54
+ },
55
+ "changed": [
56
+ "mlp.gate_proj.weight",
57
+ "mlp.up_proj.weight"
58
+ ]
59
+ },
60
+ "merge": {
61
+ "initializer": "wb",
62
+ "lambda_left": 0.0,
63
+ "lambda_right": 1.0,
64
+ "projection_names": [
65
+ "mlp.gate_proj.weight",
66
+ "mlp.up_proj.weight",
67
+ "mlp.down_proj.weight"
68
+ ],
69
+ "scope": "mlp",
70
+ "frozen_anchor_sha256": {
71
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
72
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
73
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
74
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
75
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
76
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
77
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
78
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
79
+ },
80
+ "anchor_before_sha256": {
81
+ "mlp.gate_proj.weight": "3e138d6d890dfaeeeb88ae9b8a48c084aea69752230749e87f1586b975880ddd",
82
+ "mlp.up_proj.weight": "1f3dacc4c4a3af2a55d6273cfc2374077a2eda18cec7cf8237e05c54cc1b8ea5",
83
+ "mlp.down_proj.weight": "7a34a8a9bcc1a25c928397e3be5c409081b9de0ec283d13425482c0020e6db43"
84
+ },
85
+ "source_post_transport_sha256": {
86
+ "self_attn.q_proj.weight": "67540e2474547f1d622b738128696574720591fddabb8157d2f6812ecc3af308",
87
+ "self_attn.k_proj.weight": "efbe8b71b99ef90277849155ebc45e9aad5ffe746f2958c077c7c7130d783c7b",
88
+ "self_attn.v_proj.weight": "c53545e1ac9a6447efa83242434a0b28bcda5fe12ef3866e173dd13c3da45e38",
89
+ "self_attn.o_proj.weight": "8812afef76626e47fb5dffe3a77a0cb07a07e8a7f5cf3a97453368a1284b0ffa",
90
+ "self_attn.q_norm.weight": "79bbb659cb1c2af322ca85abf7d26b088c837bcd284e70efa95a6449f69b5673",
91
+ "self_attn.k_norm.weight": "e50a57833625792c16439de078eeb810df393e1a49ef7bbe43f5af6a93923adc",
92
+ "mlp.gate_proj.weight": "655a66345118a70ec952e549407ec7f19222782a04bf0db39c5ee8372372a2bf",
93
+ "mlp.up_proj.weight": "cb86cdbce20a724154f50658e0c2cfc3ec3d63e3802388217035698470825d82",
94
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b",
95
+ "input_layernorm.weight": "c419d161cc4932ecddf0ec98cbe5737b92688f0d5aa71a7e95d2006ca824ffca",
96
+ "post_attention_layernorm.weight": "ee6a9a96c2b4f35eb0807060229f10bc28080072ed9ecfa0a17e1aaa3cb4df40"
97
+ },
98
+ "anchor_after_sha256": {
99
+ "mlp.gate_proj.weight": "655a66345118a70ec952e549407ec7f19222782a04bf0db39c5ee8372372a2bf",
100
+ "mlp.up_proj.weight": "cb86cdbce20a724154f50658e0c2cfc3ec3d63e3802388217035698470825d82",
101
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b"
102
+ },
103
+ "norm_policy": "keep_Wa_including_QK_norms",
104
+ "source_mutated_by_merge": false,
105
+ "fisher_computed": false,
106
+ "fit": false,
107
+ "optimizer_steps": 0,
108
+ "backward_calls": 0
109
+ }
110
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_01_transport.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ce29905e20c096a8d0a555134ba437d93e2e81d3e91cbfdff0b3e62513583bbb
3
+ size 67110518
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_02_merge.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cycle": 2,
3
+ "anchor": 12,
4
+ "removed_original_layer": 14,
5
+ "selection_policy": "fixed_our_span_13_22_anchor12",
6
+ "fit": false,
7
+ "lambda_left": 0.0,
8
+ "transport_matrix_sha256": "2f2164ca8bffcf85ff9cfb9506308fa1340559aba7e44bda37d1e050e6e82d36",
9
+ "transport": {
10
+ "stats": {
11
+ "tokens": 65536,
12
+ "ridge_relative": 0.001,
13
+ "ridge_absolute": 6.060115993022919e-05,
14
+ "gram_mean_diagonal": 0.06060115993022919,
15
+ "calibration_nmse": 0.10099672573787757,
16
+ "calibration_cosine": 0.9481582440752598,
17
+ "calibration_norm_ratio": 0.9472741933087646,
18
+ "transport_relative_identity_distance": 0.45524656772613525,
19
+ "enabled": true,
20
+ "batches": 32,
21
+ "coordinate_fit": "X_anchor @ T ~= X_source",
22
+ "weight_rewrite": [
23
+ "mlp.gate_proj.weight <- W_source @ T.T",
24
+ "mlp.up_proj.weight <- W_source @ T.T"
25
+ ],
26
+ "down_proj_transported": false,
27
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
28
+ },
29
+ "source_before_sha256": {
30
+ "self_attn.q_proj.weight": "f57ad388d57bb515af2ac9324d86dc9e19c4cc44bc73879a7b409f9c07597c15",
31
+ "self_attn.k_proj.weight": "09cba09d72eea6b683087478aeaaf6d321423335a9eb57d47006adbc1f336c63",
32
+ "self_attn.v_proj.weight": "af4adee7b325a938beb530808104ab27a70afc0d494134b3de1f5ea8ef060773",
33
+ "self_attn.o_proj.weight": "6888fff18d668ea322341951eb6ab19a3fbbc4cf94b758ed0f8dba411a262d1f",
34
+ "self_attn.q_norm.weight": "e3e9ec56f12aa5ec410018bbac99e6953ad52f3b8b796d73c5bd0cc6545fb93b",
35
+ "self_attn.k_norm.weight": "a5bf1576b21d93da019094f1a61912669136a5d9e89e8d2301c88f6bf2def290",
36
+ "mlp.gate_proj.weight": "1d90e8cf937190e4027f0c7bc34bbabd5bb43c5f3d081537e0d866da8a3efe3f",
37
+ "mlp.up_proj.weight": "dc867f2d0718d761bb166f69bd21878837006daf9ae392c955a2e9578a15ad97",
38
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d",
39
+ "input_layernorm.weight": "c21d58d80fa7aca24ff0dac67092f8204b3876926fa095bb7e6ceb3a16060706",
40
+ "post_attention_layernorm.weight": "1e599b9bd0ed7fdbcef34cff94651bf467bf923745a76a96d33a74ae551ad5d5"
41
+ },
42
+ "source_after_sha256": {
43
+ "self_attn.q_proj.weight": "f57ad388d57bb515af2ac9324d86dc9e19c4cc44bc73879a7b409f9c07597c15",
44
+ "self_attn.k_proj.weight": "09cba09d72eea6b683087478aeaaf6d321423335a9eb57d47006adbc1f336c63",
45
+ "self_attn.v_proj.weight": "af4adee7b325a938beb530808104ab27a70afc0d494134b3de1f5ea8ef060773",
46
+ "self_attn.o_proj.weight": "6888fff18d668ea322341951eb6ab19a3fbbc4cf94b758ed0f8dba411a262d1f",
47
+ "self_attn.q_norm.weight": "e3e9ec56f12aa5ec410018bbac99e6953ad52f3b8b796d73c5bd0cc6545fb93b",
48
+ "self_attn.k_norm.weight": "a5bf1576b21d93da019094f1a61912669136a5d9e89e8d2301c88f6bf2def290",
49
+ "mlp.gate_proj.weight": "f7c92c612a7c8544bac0f0123aff1cb5f922f5b1cf88006c20b8768643f37029",
50
+ "mlp.up_proj.weight": "4a3522038cb62630906e194bfc0a6e0d5b7f7e8a614b029b83f93145bc4c4a04",
51
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d",
52
+ "input_layernorm.weight": "c21d58d80fa7aca24ff0dac67092f8204b3876926fa095bb7e6ceb3a16060706",
53
+ "post_attention_layernorm.weight": "1e599b9bd0ed7fdbcef34cff94651bf467bf923745a76a96d33a74ae551ad5d5"
54
+ },
55
+ "changed": [
56
+ "mlp.gate_proj.weight",
57
+ "mlp.up_proj.weight"
58
+ ]
59
+ },
60
+ "merge": {
61
+ "initializer": "wb",
62
+ "lambda_left": 0.0,
63
+ "lambda_right": 1.0,
64
+ "projection_names": [
65
+ "mlp.gate_proj.weight",
66
+ "mlp.up_proj.weight",
67
+ "mlp.down_proj.weight"
68
+ ],
69
+ "scope": "mlp",
70
+ "frozen_anchor_sha256": {
71
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
72
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
73
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
74
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
75
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
76
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
77
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
78
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
79
+ },
80
+ "anchor_before_sha256": {
81
+ "mlp.gate_proj.weight": "655a66345118a70ec952e549407ec7f19222782a04bf0db39c5ee8372372a2bf",
82
+ "mlp.up_proj.weight": "cb86cdbce20a724154f50658e0c2cfc3ec3d63e3802388217035698470825d82",
83
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b"
84
+ },
85
+ "source_post_transport_sha256": {
86
+ "self_attn.q_proj.weight": "f57ad388d57bb515af2ac9324d86dc9e19c4cc44bc73879a7b409f9c07597c15",
87
+ "self_attn.k_proj.weight": "09cba09d72eea6b683087478aeaaf6d321423335a9eb57d47006adbc1f336c63",
88
+ "self_attn.v_proj.weight": "af4adee7b325a938beb530808104ab27a70afc0d494134b3de1f5ea8ef060773",
89
+ "self_attn.o_proj.weight": "6888fff18d668ea322341951eb6ab19a3fbbc4cf94b758ed0f8dba411a262d1f",
90
+ "self_attn.q_norm.weight": "e3e9ec56f12aa5ec410018bbac99e6953ad52f3b8b796d73c5bd0cc6545fb93b",
91
+ "self_attn.k_norm.weight": "a5bf1576b21d93da019094f1a61912669136a5d9e89e8d2301c88f6bf2def290",
92
+ "mlp.gate_proj.weight": "f7c92c612a7c8544bac0f0123aff1cb5f922f5b1cf88006c20b8768643f37029",
93
+ "mlp.up_proj.weight": "4a3522038cb62630906e194bfc0a6e0d5b7f7e8a614b029b83f93145bc4c4a04",
94
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d",
95
+ "input_layernorm.weight": "c21d58d80fa7aca24ff0dac67092f8204b3876926fa095bb7e6ceb3a16060706",
96
+ "post_attention_layernorm.weight": "1e599b9bd0ed7fdbcef34cff94651bf467bf923745a76a96d33a74ae551ad5d5"
97
+ },
98
+ "anchor_after_sha256": {
99
+ "mlp.gate_proj.weight": "f7c92c612a7c8544bac0f0123aff1cb5f922f5b1cf88006c20b8768643f37029",
100
+ "mlp.up_proj.weight": "4a3522038cb62630906e194bfc0a6e0d5b7f7e8a614b029b83f93145bc4c4a04",
101
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d"
102
+ },
103
+ "norm_policy": "keep_Wa_including_QK_norms",
104
+ "source_mutated_by_merge": false,
105
+ "fisher_computed": false,
106
+ "fit": false,
107
+ "optimizer_steps": 0,
108
+ "backward_calls": 0
109
+ }
110
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_02_transport.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:771567c95fea3376299e7efde066b56970e55b94ec143fe51c9236dce5599fc0
3
+ size 67110518
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_03_merge.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cycle": 3,
3
+ "anchor": 12,
4
+ "removed_original_layer": 15,
5
+ "selection_policy": "fixed_our_span_13_22_anchor12",
6
+ "fit": false,
7
+ "lambda_left": 0.0,
8
+ "transport_matrix_sha256": "c74bae7cb32fe1396e861248ba6bf41c2fd708fc354660e485db8f232fea727e",
9
+ "transport": {
10
+ "stats": {
11
+ "tokens": 65536,
12
+ "ridge_relative": 0.001,
13
+ "ridge_absolute": 6.060115993022919e-05,
14
+ "gram_mean_diagonal": 0.06060115993022919,
15
+ "calibration_nmse": 0.11038890826345682,
16
+ "calibration_cosine": 0.9431923979113933,
17
+ "calibration_norm_ratio": 0.9422936536202322,
18
+ "transport_relative_identity_distance": 0.480193167924881,
19
+ "enabled": true,
20
+ "batches": 32,
21
+ "coordinate_fit": "X_anchor @ T ~= X_source",
22
+ "weight_rewrite": [
23
+ "mlp.gate_proj.weight <- W_source @ T.T",
24
+ "mlp.up_proj.weight <- W_source @ T.T"
25
+ ],
26
+ "down_proj_transported": false,
27
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
28
+ },
29
+ "source_before_sha256": {
30
+ "self_attn.q_proj.weight": "6005f741b04aefb4b83452f774f7d013b010b6218020e382a98c92a45d8878ac",
31
+ "self_attn.k_proj.weight": "e4d7d1464c351cfcb69799eb3e3bf63cc597383cbfb0d07263236ba2d8eb3d5b",
32
+ "self_attn.v_proj.weight": "25063dfdce05fdcb1a48c5d71c3e0107d7a894b7fb6c0f7defa2e768c68ba3d7",
33
+ "self_attn.o_proj.weight": "e96bf888e3b0629075b2ee05288e147fd875119467d978c2269ecfeb3b0db4eb",
34
+ "self_attn.q_norm.weight": "d77168c19fe27a0d64a2611360be089b4435adc62444d0e82a986419be1d9b44",
35
+ "self_attn.k_norm.weight": "2cbb9d53874b3fe1d350a9c9031d64cd138a1dbac549529d07da2927106a10ff",
36
+ "mlp.gate_proj.weight": "3acdf3c7c3b8dd224f2837ef92c5e72e8bc7963baa021e9ba2a032da6084c86a",
37
+ "mlp.up_proj.weight": "6a0bdd43c6eab5e133991697799089710e9077591b56bcbde02440054dbfebbc",
38
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea",
39
+ "input_layernorm.weight": "3f2e5d516a4c80f8d93f0221e5ecbc2e7e692f111118c7c629f210ee9d03419d",
40
+ "post_attention_layernorm.weight": "3a237234fa5182946c09967a08faec9d9060f4bd780bdd6627f6159edebe2f98"
41
+ },
42
+ "source_after_sha256": {
43
+ "self_attn.q_proj.weight": "6005f741b04aefb4b83452f774f7d013b010b6218020e382a98c92a45d8878ac",
44
+ "self_attn.k_proj.weight": "e4d7d1464c351cfcb69799eb3e3bf63cc597383cbfb0d07263236ba2d8eb3d5b",
45
+ "self_attn.v_proj.weight": "25063dfdce05fdcb1a48c5d71c3e0107d7a894b7fb6c0f7defa2e768c68ba3d7",
46
+ "self_attn.o_proj.weight": "e96bf888e3b0629075b2ee05288e147fd875119467d978c2269ecfeb3b0db4eb",
47
+ "self_attn.q_norm.weight": "d77168c19fe27a0d64a2611360be089b4435adc62444d0e82a986419be1d9b44",
48
+ "self_attn.k_norm.weight": "2cbb9d53874b3fe1d350a9c9031d64cd138a1dbac549529d07da2927106a10ff",
49
+ "mlp.gate_proj.weight": "8292c665701ba7b813c028746607fae674b14b68899c1b53243212237e3d7d2c",
50
+ "mlp.up_proj.weight": "17669eaa9229e48a498c1cc80e87be7605a037083184521ca6ab99b277bfa6d2",
51
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea",
52
+ "input_layernorm.weight": "3f2e5d516a4c80f8d93f0221e5ecbc2e7e692f111118c7c629f210ee9d03419d",
53
+ "post_attention_layernorm.weight": "3a237234fa5182946c09967a08faec9d9060f4bd780bdd6627f6159edebe2f98"
54
+ },
55
+ "changed": [
56
+ "mlp.gate_proj.weight",
57
+ "mlp.up_proj.weight"
58
+ ]
59
+ },
60
+ "merge": {
61
+ "initializer": "wb",
62
+ "lambda_left": 0.0,
63
+ "lambda_right": 1.0,
64
+ "projection_names": [
65
+ "mlp.gate_proj.weight",
66
+ "mlp.up_proj.weight",
67
+ "mlp.down_proj.weight"
68
+ ],
69
+ "scope": "mlp",
70
+ "frozen_anchor_sha256": {
71
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
72
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
73
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
74
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
75
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
76
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
77
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
78
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
79
+ },
80
+ "anchor_before_sha256": {
81
+ "mlp.gate_proj.weight": "f7c92c612a7c8544bac0f0123aff1cb5f922f5b1cf88006c20b8768643f37029",
82
+ "mlp.up_proj.weight": "4a3522038cb62630906e194bfc0a6e0d5b7f7e8a614b029b83f93145bc4c4a04",
83
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d"
84
+ },
85
+ "source_post_transport_sha256": {
86
+ "self_attn.q_proj.weight": "6005f741b04aefb4b83452f774f7d013b010b6218020e382a98c92a45d8878ac",
87
+ "self_attn.k_proj.weight": "e4d7d1464c351cfcb69799eb3e3bf63cc597383cbfb0d07263236ba2d8eb3d5b",
88
+ "self_attn.v_proj.weight": "25063dfdce05fdcb1a48c5d71c3e0107d7a894b7fb6c0f7defa2e768c68ba3d7",
89
+ "self_attn.o_proj.weight": "e96bf888e3b0629075b2ee05288e147fd875119467d978c2269ecfeb3b0db4eb",
90
+ "self_attn.q_norm.weight": "d77168c19fe27a0d64a2611360be089b4435adc62444d0e82a986419be1d9b44",
91
+ "self_attn.k_norm.weight": "2cbb9d53874b3fe1d350a9c9031d64cd138a1dbac549529d07da2927106a10ff",
92
+ "mlp.gate_proj.weight": "8292c665701ba7b813c028746607fae674b14b68899c1b53243212237e3d7d2c",
93
+ "mlp.up_proj.weight": "17669eaa9229e48a498c1cc80e87be7605a037083184521ca6ab99b277bfa6d2",
94
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea",
95
+ "input_layernorm.weight": "3f2e5d516a4c80f8d93f0221e5ecbc2e7e692f111118c7c629f210ee9d03419d",
96
+ "post_attention_layernorm.weight": "3a237234fa5182946c09967a08faec9d9060f4bd780bdd6627f6159edebe2f98"
97
+ },
98
+ "anchor_after_sha256": {
99
+ "mlp.gate_proj.weight": "8292c665701ba7b813c028746607fae674b14b68899c1b53243212237e3d7d2c",
100
+ "mlp.up_proj.weight": "17669eaa9229e48a498c1cc80e87be7605a037083184521ca6ab99b277bfa6d2",
101
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea"
102
+ },
103
+ "norm_policy": "keep_Wa_including_QK_norms",
104
+ "source_mutated_by_merge": false,
105
+ "fisher_computed": false,
106
+ "fit": false,
107
+ "optimizer_steps": 0,
108
+ "backward_calls": 0
109
+ }
110
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_03_transport.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:092a56f0df3e4eb2717935143213ae33bb0fc618abe15caefafdc39ff542cc90
3
+ size 67110518
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_04_merge.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cycle": 4,
3
+ "anchor": 12,
4
+ "removed_original_layer": 16,
5
+ "selection_policy": "fixed_our_span_13_22_anchor12",
6
+ "fit": false,
7
+ "lambda_left": 0.0,
8
+ "transport_matrix_sha256": "49bbea5f7162f9479174a850b673f69481d7c2e8e01b01c5a110ec706d662fce",
9
+ "transport": {
10
+ "stats": {
11
+ "tokens": 65536,
12
+ "ridge_relative": 0.001,
13
+ "ridge_absolute": 6.060115993022919e-05,
14
+ "gram_mean_diagonal": 0.06060115993022919,
15
+ "calibration_nmse": 0.09866496995725485,
16
+ "calibration_cosine": 0.9493870783680597,
17
+ "calibration_norm_ratio": 0.9484957145281611,
18
+ "transport_relative_identity_distance": 0.46458062529563904,
19
+ "enabled": true,
20
+ "batches": 32,
21
+ "coordinate_fit": "X_anchor @ T ~= X_source",
22
+ "weight_rewrite": [
23
+ "mlp.gate_proj.weight <- W_source @ T.T",
24
+ "mlp.up_proj.weight <- W_source @ T.T"
25
+ ],
26
+ "down_proj_transported": false,
27
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
28
+ },
29
+ "source_before_sha256": {
30
+ "self_attn.q_proj.weight": "a9874967bd53acfd480ed2bd5552fab4e1a06f610af242d411e176c279e0191a",
31
+ "self_attn.k_proj.weight": "0a285bc594b54a921f698937c566bce629295ff4befcebb203038dd0d97eb3f0",
32
+ "self_attn.v_proj.weight": "dd8847c5b10e200df29bf79b30321ec7f1d90427ab9b3d273e18a4cbd83e597d",
33
+ "self_attn.o_proj.weight": "e6afd2a9ba7c9e6f1911d773062b9d37442a01ead339c9aa9255ff20f146b196",
34
+ "self_attn.q_norm.weight": "48de60cd86dec981224231f275146bc8d17990394835783504bbf5f0e9c5bb1a",
35
+ "self_attn.k_norm.weight": "d6ef88be0fc007a2bc5e9f1a0a70b7eac493495b5b54b4f72582378340b9bb4d",
36
+ "mlp.gate_proj.weight": "171beb5701a83f117d0a59a14a78be2936a062c7aa5700ec39efd9c816af96db",
37
+ "mlp.up_proj.weight": "e04d543903d934aae9062d2034f71ac4d3fb1ac69bd5f31d365f404c764e535e",
38
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1",
39
+ "input_layernorm.weight": "45d58615dedc0906944d998c52fed1d0d139338362abd51fc1b98ae12edec92a",
40
+ "post_attention_layernorm.weight": "af332049d823017194704880c92765ab0cf4a519c8819753d0539106ea951cef"
41
+ },
42
+ "source_after_sha256": {
43
+ "self_attn.q_proj.weight": "a9874967bd53acfd480ed2bd5552fab4e1a06f610af242d411e176c279e0191a",
44
+ "self_attn.k_proj.weight": "0a285bc594b54a921f698937c566bce629295ff4befcebb203038dd0d97eb3f0",
45
+ "self_attn.v_proj.weight": "dd8847c5b10e200df29bf79b30321ec7f1d90427ab9b3d273e18a4cbd83e597d",
46
+ "self_attn.o_proj.weight": "e6afd2a9ba7c9e6f1911d773062b9d37442a01ead339c9aa9255ff20f146b196",
47
+ "self_attn.q_norm.weight": "48de60cd86dec981224231f275146bc8d17990394835783504bbf5f0e9c5bb1a",
48
+ "self_attn.k_norm.weight": "d6ef88be0fc007a2bc5e9f1a0a70b7eac493495b5b54b4f72582378340b9bb4d",
49
+ "mlp.gate_proj.weight": "debf2f81470433f78676cc9649af3a208c369737428e6fcf4918ef2f14edeb9b",
50
+ "mlp.up_proj.weight": "5c1a4ef2663bb8509c1736405a121d2cf0105b113be03629fdd9c8ebae51064a",
51
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1",
52
+ "input_layernorm.weight": "45d58615dedc0906944d998c52fed1d0d139338362abd51fc1b98ae12edec92a",
53
+ "post_attention_layernorm.weight": "af332049d823017194704880c92765ab0cf4a519c8819753d0539106ea951cef"
54
+ },
55
+ "changed": [
56
+ "mlp.gate_proj.weight",
57
+ "mlp.up_proj.weight"
58
+ ]
59
+ },
60
+ "merge": {
61
+ "initializer": "wb",
62
+ "lambda_left": 0.0,
63
+ "lambda_right": 1.0,
64
+ "projection_names": [
65
+ "mlp.gate_proj.weight",
66
+ "mlp.up_proj.weight",
67
+ "mlp.down_proj.weight"
68
+ ],
69
+ "scope": "mlp",
70
+ "frozen_anchor_sha256": {
71
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
72
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
73
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
74
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
75
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
76
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
77
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
78
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
79
+ },
80
+ "anchor_before_sha256": {
81
+ "mlp.gate_proj.weight": "8292c665701ba7b813c028746607fae674b14b68899c1b53243212237e3d7d2c",
82
+ "mlp.up_proj.weight": "17669eaa9229e48a498c1cc80e87be7605a037083184521ca6ab99b277bfa6d2",
83
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea"
84
+ },
85
+ "source_post_transport_sha256": {
86
+ "self_attn.q_proj.weight": "a9874967bd53acfd480ed2bd5552fab4e1a06f610af242d411e176c279e0191a",
87
+ "self_attn.k_proj.weight": "0a285bc594b54a921f698937c566bce629295ff4befcebb203038dd0d97eb3f0",
88
+ "self_attn.v_proj.weight": "dd8847c5b10e200df29bf79b30321ec7f1d90427ab9b3d273e18a4cbd83e597d",
89
+ "self_attn.o_proj.weight": "e6afd2a9ba7c9e6f1911d773062b9d37442a01ead339c9aa9255ff20f146b196",
90
+ "self_attn.q_norm.weight": "48de60cd86dec981224231f275146bc8d17990394835783504bbf5f0e9c5bb1a",
91
+ "self_attn.k_norm.weight": "d6ef88be0fc007a2bc5e9f1a0a70b7eac493495b5b54b4f72582378340b9bb4d",
92
+ "mlp.gate_proj.weight": "debf2f81470433f78676cc9649af3a208c369737428e6fcf4918ef2f14edeb9b",
93
+ "mlp.up_proj.weight": "5c1a4ef2663bb8509c1736405a121d2cf0105b113be03629fdd9c8ebae51064a",
94
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1",
95
+ "input_layernorm.weight": "45d58615dedc0906944d998c52fed1d0d139338362abd51fc1b98ae12edec92a",
96
+ "post_attention_layernorm.weight": "af332049d823017194704880c92765ab0cf4a519c8819753d0539106ea951cef"
97
+ },
98
+ "anchor_after_sha256": {
99
+ "mlp.gate_proj.weight": "debf2f81470433f78676cc9649af3a208c369737428e6fcf4918ef2f14edeb9b",
100
+ "mlp.up_proj.weight": "5c1a4ef2663bb8509c1736405a121d2cf0105b113be03629fdd9c8ebae51064a",
101
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1"
102
+ },
103
+ "norm_policy": "keep_Wa_including_QK_norms",
104
+ "source_mutated_by_merge": false,
105
+ "fisher_computed": false,
106
+ "fit": false,
107
+ "optimizer_steps": 0,
108
+ "backward_calls": 0
109
+ }
110
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_04_transport.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:030b90624e604f764c93dc04a03b3b58095bbc3d2b1a21e22226d92b950f95d9
3
+ size 67110518
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_05_merge.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cycle": 5,
3
+ "anchor": 12,
4
+ "removed_original_layer": 17,
5
+ "selection_policy": "fixed_our_span_13_22_anchor12",
6
+ "fit": false,
7
+ "lambda_left": 0.0,
8
+ "transport_matrix_sha256": "b968cc0681a32eab25ab339122b95bf8f1b90e3ced55b7638652d052fbcdbcc3",
9
+ "transport": {
10
+ "stats": {
11
+ "tokens": 65536,
12
+ "ridge_relative": 0.001,
13
+ "ridge_absolute": 6.060115993022919e-05,
14
+ "gram_mean_diagonal": 0.06060115993022919,
15
+ "calibration_nmse": 0.09917833468174767,
16
+ "calibration_cosine": 0.9491166565617855,
17
+ "calibration_norm_ratio": 0.9482434757273703,
18
+ "transport_relative_identity_distance": 0.4882379472255707,
19
+ "enabled": true,
20
+ "batches": 32,
21
+ "coordinate_fit": "X_anchor @ T ~= X_source",
22
+ "weight_rewrite": [
23
+ "mlp.gate_proj.weight <- W_source @ T.T",
24
+ "mlp.up_proj.weight <- W_source @ T.T"
25
+ ],
26
+ "down_proj_transported": false,
27
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
28
+ },
29
+ "source_before_sha256": {
30
+ "self_attn.q_proj.weight": "93af1649dbcf27dcc906cff079a1448af3e0b78dc0ae7fcd0038e95d05f79fdc",
31
+ "self_attn.k_proj.weight": "919f1a2454b2957fa1f611232b1c0aaccdab718aed512b435923cf972cd52015",
32
+ "self_attn.v_proj.weight": "2a660e851663561147921fae640f303f3f599da61afc8d68545fed320cc9b63d",
33
+ "self_attn.o_proj.weight": "bfb11d528abdacfc054070ed7a55f90ddde74fb17704bc742ceffa065adcc717",
34
+ "self_attn.q_norm.weight": "a4538fa22891825dbfbac330127ff29569ac04b5ab0ee89e60db7e7bc64f26a3",
35
+ "self_attn.k_norm.weight": "f26654e4f51003513e7ff0cd2f23e99387481dc5c639b01444903ec9632ae685",
36
+ "mlp.gate_proj.weight": "1ec134d886ea6246b31de9cb6cbb4c451fddfb333fca1e90375f8659eb27d81c",
37
+ "mlp.up_proj.weight": "b7549bcdd3b5089f09aebb1847587e2049463294f52f4335b88b7e64888edd45",
38
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f",
39
+ "input_layernorm.weight": "70025e492885453112e0108ebf4311dfd994db35383e90da14292277834fb949",
40
+ "post_attention_layernorm.weight": "41357e377104509608d219bc3f4d8a51dde14749a9a6e6b592f6d4f4594faa85"
41
+ },
42
+ "source_after_sha256": {
43
+ "self_attn.q_proj.weight": "93af1649dbcf27dcc906cff079a1448af3e0b78dc0ae7fcd0038e95d05f79fdc",
44
+ "self_attn.k_proj.weight": "919f1a2454b2957fa1f611232b1c0aaccdab718aed512b435923cf972cd52015",
45
+ "self_attn.v_proj.weight": "2a660e851663561147921fae640f303f3f599da61afc8d68545fed320cc9b63d",
46
+ "self_attn.o_proj.weight": "bfb11d528abdacfc054070ed7a55f90ddde74fb17704bc742ceffa065adcc717",
47
+ "self_attn.q_norm.weight": "a4538fa22891825dbfbac330127ff29569ac04b5ab0ee89e60db7e7bc64f26a3",
48
+ "self_attn.k_norm.weight": "f26654e4f51003513e7ff0cd2f23e99387481dc5c639b01444903ec9632ae685",
49
+ "mlp.gate_proj.weight": "98ca3a1f76218aabde9d2dfeb23e28d798f812a336974e190ebaea9076ad4554",
50
+ "mlp.up_proj.weight": "91405003b4d46ce3a325e27da1f747b7b268d7570d3f6dab4f714a73aae768e6",
51
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f",
52
+ "input_layernorm.weight": "70025e492885453112e0108ebf4311dfd994db35383e90da14292277834fb949",
53
+ "post_attention_layernorm.weight": "41357e377104509608d219bc3f4d8a51dde14749a9a6e6b592f6d4f4594faa85"
54
+ },
55
+ "changed": [
56
+ "mlp.gate_proj.weight",
57
+ "mlp.up_proj.weight"
58
+ ]
59
+ },
60
+ "merge": {
61
+ "initializer": "wb",
62
+ "lambda_left": 0.0,
63
+ "lambda_right": 1.0,
64
+ "projection_names": [
65
+ "mlp.gate_proj.weight",
66
+ "mlp.up_proj.weight",
67
+ "mlp.down_proj.weight"
68
+ ],
69
+ "scope": "mlp",
70
+ "frozen_anchor_sha256": {
71
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
72
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
73
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
74
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
75
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
76
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
77
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
78
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
79
+ },
80
+ "anchor_before_sha256": {
81
+ "mlp.gate_proj.weight": "debf2f81470433f78676cc9649af3a208c369737428e6fcf4918ef2f14edeb9b",
82
+ "mlp.up_proj.weight": "5c1a4ef2663bb8509c1736405a121d2cf0105b113be03629fdd9c8ebae51064a",
83
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1"
84
+ },
85
+ "source_post_transport_sha256": {
86
+ "self_attn.q_proj.weight": "93af1649dbcf27dcc906cff079a1448af3e0b78dc0ae7fcd0038e95d05f79fdc",
87
+ "self_attn.k_proj.weight": "919f1a2454b2957fa1f611232b1c0aaccdab718aed512b435923cf972cd52015",
88
+ "self_attn.v_proj.weight": "2a660e851663561147921fae640f303f3f599da61afc8d68545fed320cc9b63d",
89
+ "self_attn.o_proj.weight": "bfb11d528abdacfc054070ed7a55f90ddde74fb17704bc742ceffa065adcc717",
90
+ "self_attn.q_norm.weight": "a4538fa22891825dbfbac330127ff29569ac04b5ab0ee89e60db7e7bc64f26a3",
91
+ "self_attn.k_norm.weight": "f26654e4f51003513e7ff0cd2f23e99387481dc5c639b01444903ec9632ae685",
92
+ "mlp.gate_proj.weight": "98ca3a1f76218aabde9d2dfeb23e28d798f812a336974e190ebaea9076ad4554",
93
+ "mlp.up_proj.weight": "91405003b4d46ce3a325e27da1f747b7b268d7570d3f6dab4f714a73aae768e6",
94
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f",
95
+ "input_layernorm.weight": "70025e492885453112e0108ebf4311dfd994db35383e90da14292277834fb949",
96
+ "post_attention_layernorm.weight": "41357e377104509608d219bc3f4d8a51dde14749a9a6e6b592f6d4f4594faa85"
97
+ },
98
+ "anchor_after_sha256": {
99
+ "mlp.gate_proj.weight": "98ca3a1f76218aabde9d2dfeb23e28d798f812a336974e190ebaea9076ad4554",
100
+ "mlp.up_proj.weight": "91405003b4d46ce3a325e27da1f747b7b268d7570d3f6dab4f714a73aae768e6",
101
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f"
102
+ },
103
+ "norm_policy": "keep_Wa_including_QK_norms",
104
+ "source_mutated_by_merge": false,
105
+ "fisher_computed": false,
106
+ "fit": false,
107
+ "optimizer_steps": 0,
108
+ "backward_calls": 0
109
+ }
110
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_05_transport.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c6889d5ef721bde145df816af6b64c40e1f943e4ddd06411a06a3196a78d20c2
3
+ size 67110518
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_06_merge.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cycle": 6,
3
+ "anchor": 12,
4
+ "removed_original_layer": 18,
5
+ "selection_policy": "fixed_our_span_13_22_anchor12",
6
+ "fit": false,
7
+ "lambda_left": 0.0,
8
+ "transport_matrix_sha256": "b1c313ea0a3aa1df29a0618ae2ef9e5bc49705d8fb26ca876cad9c127db74e9e",
9
+ "transport": {
10
+ "stats": {
11
+ "tokens": 65536,
12
+ "ridge_relative": 0.001,
13
+ "ridge_absolute": 6.060115993022919e-05,
14
+ "gram_mean_diagonal": 0.06060115993022919,
15
+ "calibration_nmse": 0.09820423130187533,
16
+ "calibration_cosine": 0.9496297005441647,
17
+ "calibration_norm_ratio": 0.9487355766850942,
18
+ "transport_relative_identity_distance": 0.48003679513931274,
19
+ "enabled": true,
20
+ "batches": 32,
21
+ "coordinate_fit": "X_anchor @ T ~= X_source",
22
+ "weight_rewrite": [
23
+ "mlp.gate_proj.weight <- W_source @ T.T",
24
+ "mlp.up_proj.weight <- W_source @ T.T"
25
+ ],
26
+ "down_proj_transported": false,
27
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
28
+ },
29
+ "source_before_sha256": {
30
+ "self_attn.q_proj.weight": "3d50a07d21693613e0d831209868828215164c78606ad76bb5339d0093e2b167",
31
+ "self_attn.k_proj.weight": "055922b3d6d8ae628f8a4761be8273b2b35bd979a899e599e03a4aebc9b31b15",
32
+ "self_attn.v_proj.weight": "35d50fc9ef07106a763c826a6bed55f5f8de393edeac002703ab161116d8dead",
33
+ "self_attn.o_proj.weight": "a211c679b699b735e0587b7e0bab5610d182a4c54868438be766544a8f36b4eb",
34
+ "self_attn.q_norm.weight": "41ed057917753085abc49146d705c39743047800a2ac65dba3e227fb675ad494",
35
+ "self_attn.k_norm.weight": "f01c939b42b6e7b3a03519eadb0a08a563897458717fc05d98b7c7d158621f02",
36
+ "mlp.gate_proj.weight": "a60ac64753890f45bc06d840148fad55807f022c4f14d6437d926bfe08d6e401",
37
+ "mlp.up_proj.weight": "f614342e9f77c5b73e0b93c34e9a6cbfb1692decfd132853765e9da75c5a2edc",
38
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7",
39
+ "input_layernorm.weight": "2c7f7059994a701ae1bfd696bd109340fa7a22df9deee3bfd6c4afb890155523",
40
+ "post_attention_layernorm.weight": "d85cdb5cf77b8d6d42c74fbd6aff643661b72fcfbe4f343311c4d31db4afc67f"
41
+ },
42
+ "source_after_sha256": {
43
+ "self_attn.q_proj.weight": "3d50a07d21693613e0d831209868828215164c78606ad76bb5339d0093e2b167",
44
+ "self_attn.k_proj.weight": "055922b3d6d8ae628f8a4761be8273b2b35bd979a899e599e03a4aebc9b31b15",
45
+ "self_attn.v_proj.weight": "35d50fc9ef07106a763c826a6bed55f5f8de393edeac002703ab161116d8dead",
46
+ "self_attn.o_proj.weight": "a211c679b699b735e0587b7e0bab5610d182a4c54868438be766544a8f36b4eb",
47
+ "self_attn.q_norm.weight": "41ed057917753085abc49146d705c39743047800a2ac65dba3e227fb675ad494",
48
+ "self_attn.k_norm.weight": "f01c939b42b6e7b3a03519eadb0a08a563897458717fc05d98b7c7d158621f02",
49
+ "mlp.gate_proj.weight": "03eb425fe1ff0c465accdbd062fa76ec3b951f4c173d9f900657e922811eff2f",
50
+ "mlp.up_proj.weight": "f482573a958623f2511b60e6bfdb8ddf1b18a35942833a3cf2f6036131673c06",
51
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7",
52
+ "input_layernorm.weight": "2c7f7059994a701ae1bfd696bd109340fa7a22df9deee3bfd6c4afb890155523",
53
+ "post_attention_layernorm.weight": "d85cdb5cf77b8d6d42c74fbd6aff643661b72fcfbe4f343311c4d31db4afc67f"
54
+ },
55
+ "changed": [
56
+ "mlp.gate_proj.weight",
57
+ "mlp.up_proj.weight"
58
+ ]
59
+ },
60
+ "merge": {
61
+ "initializer": "wb",
62
+ "lambda_left": 0.0,
63
+ "lambda_right": 1.0,
64
+ "projection_names": [
65
+ "mlp.gate_proj.weight",
66
+ "mlp.up_proj.weight",
67
+ "mlp.down_proj.weight"
68
+ ],
69
+ "scope": "mlp",
70
+ "frozen_anchor_sha256": {
71
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
72
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
73
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
74
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
75
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
76
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
77
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
78
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
79
+ },
80
+ "anchor_before_sha256": {
81
+ "mlp.gate_proj.weight": "98ca3a1f76218aabde9d2dfeb23e28d798f812a336974e190ebaea9076ad4554",
82
+ "mlp.up_proj.weight": "91405003b4d46ce3a325e27da1f747b7b268d7570d3f6dab4f714a73aae768e6",
83
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f"
84
+ },
85
+ "source_post_transport_sha256": {
86
+ "self_attn.q_proj.weight": "3d50a07d21693613e0d831209868828215164c78606ad76bb5339d0093e2b167",
87
+ "self_attn.k_proj.weight": "055922b3d6d8ae628f8a4761be8273b2b35bd979a899e599e03a4aebc9b31b15",
88
+ "self_attn.v_proj.weight": "35d50fc9ef07106a763c826a6bed55f5f8de393edeac002703ab161116d8dead",
89
+ "self_attn.o_proj.weight": "a211c679b699b735e0587b7e0bab5610d182a4c54868438be766544a8f36b4eb",
90
+ "self_attn.q_norm.weight": "41ed057917753085abc49146d705c39743047800a2ac65dba3e227fb675ad494",
91
+ "self_attn.k_norm.weight": "f01c939b42b6e7b3a03519eadb0a08a563897458717fc05d98b7c7d158621f02",
92
+ "mlp.gate_proj.weight": "03eb425fe1ff0c465accdbd062fa76ec3b951f4c173d9f900657e922811eff2f",
93
+ "mlp.up_proj.weight": "f482573a958623f2511b60e6bfdb8ddf1b18a35942833a3cf2f6036131673c06",
94
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7",
95
+ "input_layernorm.weight": "2c7f7059994a701ae1bfd696bd109340fa7a22df9deee3bfd6c4afb890155523",
96
+ "post_attention_layernorm.weight": "d85cdb5cf77b8d6d42c74fbd6aff643661b72fcfbe4f343311c4d31db4afc67f"
97
+ },
98
+ "anchor_after_sha256": {
99
+ "mlp.gate_proj.weight": "03eb425fe1ff0c465accdbd062fa76ec3b951f4c173d9f900657e922811eff2f",
100
+ "mlp.up_proj.weight": "f482573a958623f2511b60e6bfdb8ddf1b18a35942833a3cf2f6036131673c06",
101
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7"
102
+ },
103
+ "norm_policy": "keep_Wa_including_QK_norms",
104
+ "source_mutated_by_merge": false,
105
+ "fisher_computed": false,
106
+ "fit": false,
107
+ "optimizer_steps": 0,
108
+ "backward_calls": 0
109
+ }
110
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_06_transport.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b1400002d389e07d4a0bb71829c43f6aa137b91935e5ef07a925fea5f5040cee
3
+ size 67110518
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_07_merge.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cycle": 7,
3
+ "anchor": 12,
4
+ "removed_original_layer": 19,
5
+ "selection_policy": "fixed_our_span_13_22_anchor12",
6
+ "fit": false,
7
+ "lambda_left": 0.0,
8
+ "transport_matrix_sha256": "4b807a71a3f5c920f7bbe9842c8bc0c89de7ebf5b02893847374cb46eeebbaae",
9
+ "transport": {
10
+ "stats": {
11
+ "tokens": 65536,
12
+ "ridge_relative": 0.001,
13
+ "ridge_absolute": 6.060115993022919e-05,
14
+ "gram_mean_diagonal": 0.06060115993022919,
15
+ "calibration_nmse": 0.103606409701293,
16
+ "calibration_cosine": 0.9467810247760247,
17
+ "calibration_norm_ratio": 0.9459333354270779,
18
+ "transport_relative_identity_distance": 0.5275545120239258,
19
+ "enabled": true,
20
+ "batches": 32,
21
+ "coordinate_fit": "X_anchor @ T ~= X_source",
22
+ "weight_rewrite": [
23
+ "mlp.gate_proj.weight <- W_source @ T.T",
24
+ "mlp.up_proj.weight <- W_source @ T.T"
25
+ ],
26
+ "down_proj_transported": false,
27
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
28
+ },
29
+ "source_before_sha256": {
30
+ "self_attn.q_proj.weight": "d14bc25171528405c3db791fd017b4e0fe37d06a9b07a9878cb81c1f0eb98ae6",
31
+ "self_attn.k_proj.weight": "8911d7363eb8d7e35ff407ac925183a06d54d624a8d2bd0ff41db97423515a54",
32
+ "self_attn.v_proj.weight": "4781046a7d6224a77c3e34dda92a2ef5748eb777d9d554acf5621c4e5742be2a",
33
+ "self_attn.o_proj.weight": "90f47fc1bc507ddfad16299dfcecb78a6b4efac01e21d3a6402c6ef3eae56348",
34
+ "self_attn.q_norm.weight": "6915d87fcc2402518b382dee5f5929f5774006c5d82904db327d2f118d6a5c99",
35
+ "self_attn.k_norm.weight": "cb20faa93398541fe6b2fbda2a527ea3243337db753acebdfd045bf309cbc4ae",
36
+ "mlp.gate_proj.weight": "aaf6792caf14dc5a810bfa937c966c7989238e23b21080752c784428eedbf79c",
37
+ "mlp.up_proj.weight": "5a9cf857484fc35820ab3032e13383687631e54fc1a7c7ff0443ec36e962cf17",
38
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6",
39
+ "input_layernorm.weight": "316472831e20dec19263b56944811a059efb241cc842d8ace4fce706c98a8b11",
40
+ "post_attention_layernorm.weight": "7a462c4c15d73900fe1275d32448251905112e9530f615fe6776622c416f0f52"
41
+ },
42
+ "source_after_sha256": {
43
+ "self_attn.q_proj.weight": "d14bc25171528405c3db791fd017b4e0fe37d06a9b07a9878cb81c1f0eb98ae6",
44
+ "self_attn.k_proj.weight": "8911d7363eb8d7e35ff407ac925183a06d54d624a8d2bd0ff41db97423515a54",
45
+ "self_attn.v_proj.weight": "4781046a7d6224a77c3e34dda92a2ef5748eb777d9d554acf5621c4e5742be2a",
46
+ "self_attn.o_proj.weight": "90f47fc1bc507ddfad16299dfcecb78a6b4efac01e21d3a6402c6ef3eae56348",
47
+ "self_attn.q_norm.weight": "6915d87fcc2402518b382dee5f5929f5774006c5d82904db327d2f118d6a5c99",
48
+ "self_attn.k_norm.weight": "cb20faa93398541fe6b2fbda2a527ea3243337db753acebdfd045bf309cbc4ae",
49
+ "mlp.gate_proj.weight": "06d454e81788e8cfd28f613250c2c97f44fd78227c38bd35429f19915cdaeb51",
50
+ "mlp.up_proj.weight": "2c58e52893c9f2de1310538074a6ec2700403d256286f410d59a25064527f6c2",
51
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6",
52
+ "input_layernorm.weight": "316472831e20dec19263b56944811a059efb241cc842d8ace4fce706c98a8b11",
53
+ "post_attention_layernorm.weight": "7a462c4c15d73900fe1275d32448251905112e9530f615fe6776622c416f0f52"
54
+ },
55
+ "changed": [
56
+ "mlp.gate_proj.weight",
57
+ "mlp.up_proj.weight"
58
+ ]
59
+ },
60
+ "merge": {
61
+ "initializer": "wb",
62
+ "lambda_left": 0.0,
63
+ "lambda_right": 1.0,
64
+ "projection_names": [
65
+ "mlp.gate_proj.weight",
66
+ "mlp.up_proj.weight",
67
+ "mlp.down_proj.weight"
68
+ ],
69
+ "scope": "mlp",
70
+ "frozen_anchor_sha256": {
71
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
72
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
73
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
74
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
75
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
76
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
77
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
78
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
79
+ },
80
+ "anchor_before_sha256": {
81
+ "mlp.gate_proj.weight": "03eb425fe1ff0c465accdbd062fa76ec3b951f4c173d9f900657e922811eff2f",
82
+ "mlp.up_proj.weight": "f482573a958623f2511b60e6bfdb8ddf1b18a35942833a3cf2f6036131673c06",
83
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7"
84
+ },
85
+ "source_post_transport_sha256": {
86
+ "self_attn.q_proj.weight": "d14bc25171528405c3db791fd017b4e0fe37d06a9b07a9878cb81c1f0eb98ae6",
87
+ "self_attn.k_proj.weight": "8911d7363eb8d7e35ff407ac925183a06d54d624a8d2bd0ff41db97423515a54",
88
+ "self_attn.v_proj.weight": "4781046a7d6224a77c3e34dda92a2ef5748eb777d9d554acf5621c4e5742be2a",
89
+ "self_attn.o_proj.weight": "90f47fc1bc507ddfad16299dfcecb78a6b4efac01e21d3a6402c6ef3eae56348",
90
+ "self_attn.q_norm.weight": "6915d87fcc2402518b382dee5f5929f5774006c5d82904db327d2f118d6a5c99",
91
+ "self_attn.k_norm.weight": "cb20faa93398541fe6b2fbda2a527ea3243337db753acebdfd045bf309cbc4ae",
92
+ "mlp.gate_proj.weight": "06d454e81788e8cfd28f613250c2c97f44fd78227c38bd35429f19915cdaeb51",
93
+ "mlp.up_proj.weight": "2c58e52893c9f2de1310538074a6ec2700403d256286f410d59a25064527f6c2",
94
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6",
95
+ "input_layernorm.weight": "316472831e20dec19263b56944811a059efb241cc842d8ace4fce706c98a8b11",
96
+ "post_attention_layernorm.weight": "7a462c4c15d73900fe1275d32448251905112e9530f615fe6776622c416f0f52"
97
+ },
98
+ "anchor_after_sha256": {
99
+ "mlp.gate_proj.weight": "06d454e81788e8cfd28f613250c2c97f44fd78227c38bd35429f19915cdaeb51",
100
+ "mlp.up_proj.weight": "2c58e52893c9f2de1310538074a6ec2700403d256286f410d59a25064527f6c2",
101
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6"
102
+ },
103
+ "norm_policy": "keep_Wa_including_QK_norms",
104
+ "source_mutated_by_merge": false,
105
+ "fisher_computed": false,
106
+ "fit": false,
107
+ "optimizer_steps": 0,
108
+ "backward_calls": 0
109
+ }
110
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_07_transport.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d501ae2b2629df66facd8e4c516ff89d4312221d3383c886067b857ce6f86764
3
+ size 67110518
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_08_merge.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cycle": 8,
3
+ "anchor": 12,
4
+ "removed_original_layer": 20,
5
+ "selection_policy": "fixed_our_span_13_22_anchor12",
6
+ "fit": false,
7
+ "lambda_left": 0.0,
8
+ "transport_matrix_sha256": "2c7b2775e51300a42d0d75c89a6c22bee3e7c935b89f0db3cf2b3fd9863b8fd6",
9
+ "transport": {
10
+ "stats": {
11
+ "tokens": 65536,
12
+ "ridge_relative": 0.001,
13
+ "ridge_absolute": 6.060115993022919e-05,
14
+ "gram_mean_diagonal": 0.06060115993022919,
15
+ "calibration_nmse": 0.10606533290714001,
16
+ "calibration_cosine": 0.9454815765850116,
17
+ "calibration_norm_ratio": 0.9446186925723196,
18
+ "transport_relative_identity_distance": 0.5891098976135254,
19
+ "enabled": true,
20
+ "batches": 32,
21
+ "coordinate_fit": "X_anchor @ T ~= X_source",
22
+ "weight_rewrite": [
23
+ "mlp.gate_proj.weight <- W_source @ T.T",
24
+ "mlp.up_proj.weight <- W_source @ T.T"
25
+ ],
26
+ "down_proj_transported": false,
27
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
28
+ },
29
+ "source_before_sha256": {
30
+ "self_attn.q_proj.weight": "6bdb1d9174c7bf6d06b12d5d55b3a7649f4f880714e3e2d5a6f90c1449ad1a50",
31
+ "self_attn.k_proj.weight": "e3a98bfec07bba4f0fc6aa01b510f13fce379d8a5fdce7a70ce0870da65a2e43",
32
+ "self_attn.v_proj.weight": "f250ec94ab67ea3d397297fa0c70e7e24c7f77ca609a3a83cc8f7e792e4bc608",
33
+ "self_attn.o_proj.weight": "18f0f0ec64b28cbc88f0937245cb010fd86dcf094de2d96d1bd2162b76020229",
34
+ "self_attn.q_norm.weight": "2172344fe2c1fda6f261ece920fbd07a4b03d2385d2c0848c497aae4f07e69b5",
35
+ "self_attn.k_norm.weight": "a2c8f7815e194c45bad87d1e291c9ff2ad3a36929b1201d024354ec501563a4e",
36
+ "mlp.gate_proj.weight": "8334c424ddf9edb282ccb34d6f90321e9530eff5e81b7881ba9b3d74417a9672",
37
+ "mlp.up_proj.weight": "db91586fd2907e8ecccb075f036e5c180641fa35f7cd899a3f81411caa9d10df",
38
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd",
39
+ "input_layernorm.weight": "96fb39db2f64c716ae6891acb4e4e7f2a1276921a97d0d9a50d746727e4bbcd0",
40
+ "post_attention_layernorm.weight": "cd331d158252933122eae174cda361e7f3eb260b867b079b375650b368a4ae06"
41
+ },
42
+ "source_after_sha256": {
43
+ "self_attn.q_proj.weight": "6bdb1d9174c7bf6d06b12d5d55b3a7649f4f880714e3e2d5a6f90c1449ad1a50",
44
+ "self_attn.k_proj.weight": "e3a98bfec07bba4f0fc6aa01b510f13fce379d8a5fdce7a70ce0870da65a2e43",
45
+ "self_attn.v_proj.weight": "f250ec94ab67ea3d397297fa0c70e7e24c7f77ca609a3a83cc8f7e792e4bc608",
46
+ "self_attn.o_proj.weight": "18f0f0ec64b28cbc88f0937245cb010fd86dcf094de2d96d1bd2162b76020229",
47
+ "self_attn.q_norm.weight": "2172344fe2c1fda6f261ece920fbd07a4b03d2385d2c0848c497aae4f07e69b5",
48
+ "self_attn.k_norm.weight": "a2c8f7815e194c45bad87d1e291c9ff2ad3a36929b1201d024354ec501563a4e",
49
+ "mlp.gate_proj.weight": "9f8d001778d2562d9f0deb7aa67ab4b374ee11bc56cf341dd3bbc2f89da978a9",
50
+ "mlp.up_proj.weight": "82d2d94c9a1082f87643386884771be030ad54381da7fbfda1931d886bff69bc",
51
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd",
52
+ "input_layernorm.weight": "96fb39db2f64c716ae6891acb4e4e7f2a1276921a97d0d9a50d746727e4bbcd0",
53
+ "post_attention_layernorm.weight": "cd331d158252933122eae174cda361e7f3eb260b867b079b375650b368a4ae06"
54
+ },
55
+ "changed": [
56
+ "mlp.gate_proj.weight",
57
+ "mlp.up_proj.weight"
58
+ ]
59
+ },
60
+ "merge": {
61
+ "initializer": "wb",
62
+ "lambda_left": 0.0,
63
+ "lambda_right": 1.0,
64
+ "projection_names": [
65
+ "mlp.gate_proj.weight",
66
+ "mlp.up_proj.weight",
67
+ "mlp.down_proj.weight"
68
+ ],
69
+ "scope": "mlp",
70
+ "frozen_anchor_sha256": {
71
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
72
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
73
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
74
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
75
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
76
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
77
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
78
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
79
+ },
80
+ "anchor_before_sha256": {
81
+ "mlp.gate_proj.weight": "06d454e81788e8cfd28f613250c2c97f44fd78227c38bd35429f19915cdaeb51",
82
+ "mlp.up_proj.weight": "2c58e52893c9f2de1310538074a6ec2700403d256286f410d59a25064527f6c2",
83
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6"
84
+ },
85
+ "source_post_transport_sha256": {
86
+ "self_attn.q_proj.weight": "6bdb1d9174c7bf6d06b12d5d55b3a7649f4f880714e3e2d5a6f90c1449ad1a50",
87
+ "self_attn.k_proj.weight": "e3a98bfec07bba4f0fc6aa01b510f13fce379d8a5fdce7a70ce0870da65a2e43",
88
+ "self_attn.v_proj.weight": "f250ec94ab67ea3d397297fa0c70e7e24c7f77ca609a3a83cc8f7e792e4bc608",
89
+ "self_attn.o_proj.weight": "18f0f0ec64b28cbc88f0937245cb010fd86dcf094de2d96d1bd2162b76020229",
90
+ "self_attn.q_norm.weight": "2172344fe2c1fda6f261ece920fbd07a4b03d2385d2c0848c497aae4f07e69b5",
91
+ "self_attn.k_norm.weight": "a2c8f7815e194c45bad87d1e291c9ff2ad3a36929b1201d024354ec501563a4e",
92
+ "mlp.gate_proj.weight": "9f8d001778d2562d9f0deb7aa67ab4b374ee11bc56cf341dd3bbc2f89da978a9",
93
+ "mlp.up_proj.weight": "82d2d94c9a1082f87643386884771be030ad54381da7fbfda1931d886bff69bc",
94
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd",
95
+ "input_layernorm.weight": "96fb39db2f64c716ae6891acb4e4e7f2a1276921a97d0d9a50d746727e4bbcd0",
96
+ "post_attention_layernorm.weight": "cd331d158252933122eae174cda361e7f3eb260b867b079b375650b368a4ae06"
97
+ },
98
+ "anchor_after_sha256": {
99
+ "mlp.gate_proj.weight": "9f8d001778d2562d9f0deb7aa67ab4b374ee11bc56cf341dd3bbc2f89da978a9",
100
+ "mlp.up_proj.weight": "82d2d94c9a1082f87643386884771be030ad54381da7fbfda1931d886bff69bc",
101
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd"
102
+ },
103
+ "norm_policy": "keep_Wa_including_QK_norms",
104
+ "source_mutated_by_merge": false,
105
+ "fisher_computed": false,
106
+ "fit": false,
107
+ "optimizer_steps": 0,
108
+ "backward_calls": 0
109
+ }
110
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_08_transport.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:43deee7cc5037a42f1952463af7065212e8cfabff7be44e11268becab95c3bb0
3
+ size 67110518
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_09_merge.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cycle": 9,
3
+ "anchor": 12,
4
+ "removed_original_layer": 21,
5
+ "selection_policy": "fixed_our_span_13_22_anchor12",
6
+ "fit": false,
7
+ "lambda_left": 0.0,
8
+ "transport_matrix_sha256": "7ad34658a18ce5ffbab2f8af974892f191e7db80d7b5da8d19e347938544b107",
9
+ "transport": {
10
+ "stats": {
11
+ "tokens": 65536,
12
+ "ridge_relative": 0.001,
13
+ "ridge_absolute": 6.060115993022919e-05,
14
+ "gram_mean_diagonal": 0.06060115993022919,
15
+ "calibration_nmse": 0.13979247738453124,
16
+ "calibration_cosine": 0.927474114888108,
17
+ "calibration_norm_ratio": 0.9266308047370905,
18
+ "transport_relative_identity_distance": 0.6954833269119263,
19
+ "enabled": true,
20
+ "batches": 32,
21
+ "coordinate_fit": "X_anchor @ T ~= X_source",
22
+ "weight_rewrite": [
23
+ "mlp.gate_proj.weight <- W_source @ T.T",
24
+ "mlp.up_proj.weight <- W_source @ T.T"
25
+ ],
26
+ "down_proj_transported": false,
27
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
28
+ },
29
+ "source_before_sha256": {
30
+ "self_attn.q_proj.weight": "1839858bb3153a7d2907bbc4837cab44494ea4f8f73db2dac5a973f1500537c0",
31
+ "self_attn.k_proj.weight": "34776759a30508b301e6eeb4c03e74afc6e315a0e4005b788772f03267fa6bad",
32
+ "self_attn.v_proj.weight": "25ed7a7bfff05b2a63a9489ed945f49ed624baa5ffa7f971c263e4d3aade1d04",
33
+ "self_attn.o_proj.weight": "a8c4e7b3c03654158c39ea33456a291809aee2893e9dde1fa2d530da216b313c",
34
+ "self_attn.q_norm.weight": "21aa357e3be95df8e0b87310db2cf759d951d8c9a706c9e1bee207de27cbb87f",
35
+ "self_attn.k_norm.weight": "0dfad6f8b52d3a2c224e7cd2b5c1fe87db29b927a7d7fb4161f231df6df2ac02",
36
+ "mlp.gate_proj.weight": "4d745750b386ff30e96c0fe5ac21229e0672de87a3c4d30b7a877c333f250622",
37
+ "mlp.up_proj.weight": "b0b002f9bd65d4a6b4b37b6cf06139deb86a51ebc96fc27b4ebcff016f3e450b",
38
+ "mlp.down_proj.weight": "279864f62a9b78fa49dde314b363ca78f22fda503fbf8e9f64437ea6644a084a",
39
+ "input_layernorm.weight": "2974f6d5be715ca00edf542f4e51e5eb5ced2a292277c1974a92f5f6fec44871",
40
+ "post_attention_layernorm.weight": "a00da323dd47889f5a6238369523374a092cab49267ad69f4716d7b1c3778d5f"
41
+ },
42
+ "source_after_sha256": {
43
+ "self_attn.q_proj.weight": "1839858bb3153a7d2907bbc4837cab44494ea4f8f73db2dac5a973f1500537c0",
44
+ "self_attn.k_proj.weight": "34776759a30508b301e6eeb4c03e74afc6e315a0e4005b788772f03267fa6bad",
45
+ "self_attn.v_proj.weight": "25ed7a7bfff05b2a63a9489ed945f49ed624baa5ffa7f971c263e4d3aade1d04",
46
+ "self_attn.o_proj.weight": "a8c4e7b3c03654158c39ea33456a291809aee2893e9dde1fa2d530da216b313c",
47
+ "self_attn.q_norm.weight": "21aa357e3be95df8e0b87310db2cf759d951d8c9a706c9e1bee207de27cbb87f",
48
+ "self_attn.k_norm.weight": "0dfad6f8b52d3a2c224e7cd2b5c1fe87db29b927a7d7fb4161f231df6df2ac02",
49
+ "mlp.gate_proj.weight": "6b132cf55ede8fb805c51a5b57c84cddd3ac2e84d4d94d13538a0f3eae146ba2",
50
+ "mlp.up_proj.weight": "d8ae064ab88056091a57a96a007959b9d01bb6c1f037cdab35d76d5f5694b3ae",
51
+ "mlp.down_proj.weight": "279864f62a9b78fa49dde314b363ca78f22fda503fbf8e9f64437ea6644a084a",
52
+ "input_layernorm.weight": "2974f6d5be715ca00edf542f4e51e5eb5ced2a292277c1974a92f5f6fec44871",
53
+ "post_attention_layernorm.weight": "a00da323dd47889f5a6238369523374a092cab49267ad69f4716d7b1c3778d5f"
54
+ },
55
+ "changed": [
56
+ "mlp.gate_proj.weight",
57
+ "mlp.up_proj.weight"
58
+ ]
59
+ },
60
+ "merge": {
61
+ "initializer": "wb",
62
+ "lambda_left": 0.0,
63
+ "lambda_right": 1.0,
64
+ "projection_names": [
65
+ "mlp.gate_proj.weight",
66
+ "mlp.up_proj.weight",
67
+ "mlp.down_proj.weight"
68
+ ],
69
+ "scope": "mlp",
70
+ "frozen_anchor_sha256": {
71
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
72
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
73
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
74
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
75
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
76
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
77
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
78
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
79
+ },
80
+ "anchor_before_sha256": {
81
+ "mlp.gate_proj.weight": "9f8d001778d2562d9f0deb7aa67ab4b374ee11bc56cf341dd3bbc2f89da978a9",
82
+ "mlp.up_proj.weight": "82d2d94c9a1082f87643386884771be030ad54381da7fbfda1931d886bff69bc",
83
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd"
84
+ },
85
+ "source_post_transport_sha256": {
86
+ "self_attn.q_proj.weight": "1839858bb3153a7d2907bbc4837cab44494ea4f8f73db2dac5a973f1500537c0",
87
+ "self_attn.k_proj.weight": "34776759a30508b301e6eeb4c03e74afc6e315a0e4005b788772f03267fa6bad",
88
+ "self_attn.v_proj.weight": "25ed7a7bfff05b2a63a9489ed945f49ed624baa5ffa7f971c263e4d3aade1d04",
89
+ "self_attn.o_proj.weight": "a8c4e7b3c03654158c39ea33456a291809aee2893e9dde1fa2d530da216b313c",
90
+ "self_attn.q_norm.weight": "21aa357e3be95df8e0b87310db2cf759d951d8c9a706c9e1bee207de27cbb87f",
91
+ "self_attn.k_norm.weight": "0dfad6f8b52d3a2c224e7cd2b5c1fe87db29b927a7d7fb4161f231df6df2ac02",
92
+ "mlp.gate_proj.weight": "6b132cf55ede8fb805c51a5b57c84cddd3ac2e84d4d94d13538a0f3eae146ba2",
93
+ "mlp.up_proj.weight": "d8ae064ab88056091a57a96a007959b9d01bb6c1f037cdab35d76d5f5694b3ae",
94
+ "mlp.down_proj.weight": "279864f62a9b78fa49dde314b363ca78f22fda503fbf8e9f64437ea6644a084a",
95
+ "input_layernorm.weight": "2974f6d5be715ca00edf542f4e51e5eb5ced2a292277c1974a92f5f6fec44871",
96
+ "post_attention_layernorm.weight": "a00da323dd47889f5a6238369523374a092cab49267ad69f4716d7b1c3778d5f"
97
+ },
98
+ "anchor_after_sha256": {
99
+ "mlp.gate_proj.weight": "6b132cf55ede8fb805c51a5b57c84cddd3ac2e84d4d94d13538a0f3eae146ba2",
100
+ "mlp.up_proj.weight": "d8ae064ab88056091a57a96a007959b9d01bb6c1f037cdab35d76d5f5694b3ae",
101
+ "mlp.down_proj.weight": "279864f62a9b78fa49dde314b363ca78f22fda503fbf8e9f64437ea6644a084a"
102
+ },
103
+ "norm_policy": "keep_Wa_including_QK_norms",
104
+ "source_mutated_by_merge": false,
105
+ "fisher_computed": false,
106
+ "fit": false,
107
+ "optimizer_steps": 0,
108
+ "backward_calls": 0
109
+ }
110
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/cycle_09_transport.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7f785d329bfa8289c73722d71a8d82628c2c22f8a25f05a7201cc3f792ec3481
3
+ size 67110518
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/data_manifest.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "Qwen/Qwen3-8B-Base",
3
+ "model_revision": "49e3418fbbbca6ecbdf9608b4d22e5a407081db4",
4
+ "dataset": "DKYoon/SlimPajama-6B",
5
+ "revision": "b5f90f419b7489cdba26fdbc8c022fcb5562f968",
6
+ "split": "train",
7
+ "packing": "historical nonstreaming dataset.shuffle(seed42); concatenate encoded text without separators or BOS",
8
+ "samples": 64,
9
+ "seq_len": 1024,
10
+ "batch_size": 2,
11
+ "seed": 42,
12
+ "valid_tokens": 65536,
13
+ "input_ids_sha256": "85a84b9a68cf0856fd363186d3a273860886b1c17f876cae145fd092454aff55",
14
+ "attention_mask_sha256": "b1476de1907209012e63fa502715fd97db26e595352faa808d8c10433a1472a4"
15
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/audit/selection.json ADDED
@@ -0,0 +1,992 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "cycle": 1,
4
+ "anchor": 12,
5
+ "removed_original_layer": 13,
6
+ "selection_policy": "fixed_our_span_13_22_anchor12",
7
+ "fit": false,
8
+ "lambda_left": 0.0,
9
+ "transport_matrix_sha256": "ea43767088fa2f8cc0b7ba197024635f7b8a7e19fdd34170b499f470c2461672",
10
+ "transport": {
11
+ "stats": {
12
+ "tokens": 65536,
13
+ "ridge_relative": 0.001,
14
+ "ridge_absolute": 6.060115993022919e-05,
15
+ "gram_mean_diagonal": 0.06060115993022919,
16
+ "calibration_nmse": 0.12798181447783583,
17
+ "calibration_cosine": 0.9338195359584089,
18
+ "calibration_norm_ratio": 0.9329591782339236,
19
+ "transport_relative_identity_distance": 0.4961368441581726,
20
+ "enabled": true,
21
+ "batches": 32,
22
+ "coordinate_fit": "X_anchor @ T ~= X_source",
23
+ "weight_rewrite": [
24
+ "mlp.gate_proj.weight <- W_source @ T.T",
25
+ "mlp.up_proj.weight <- W_source @ T.T"
26
+ ],
27
+ "down_proj_transported": false,
28
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
29
+ },
30
+ "source_before_sha256": {
31
+ "self_attn.q_proj.weight": "67540e2474547f1d622b738128696574720591fddabb8157d2f6812ecc3af308",
32
+ "self_attn.k_proj.weight": "efbe8b71b99ef90277849155ebc45e9aad5ffe746f2958c077c7c7130d783c7b",
33
+ "self_attn.v_proj.weight": "c53545e1ac9a6447efa83242434a0b28bcda5fe12ef3866e173dd13c3da45e38",
34
+ "self_attn.o_proj.weight": "8812afef76626e47fb5dffe3a77a0cb07a07e8a7f5cf3a97453368a1284b0ffa",
35
+ "self_attn.q_norm.weight": "79bbb659cb1c2af322ca85abf7d26b088c837bcd284e70efa95a6449f69b5673",
36
+ "self_attn.k_norm.weight": "e50a57833625792c16439de078eeb810df393e1a49ef7bbe43f5af6a93923adc",
37
+ "mlp.gate_proj.weight": "6bc0a4412e6639d40e3a7d5c9099a5a05f2573bd12744019550fc11da2c52c55",
38
+ "mlp.up_proj.weight": "8715dd4fa81b5d58a577a1b2fdfb24592b23775921014b36f832fe8dbf2bbf51",
39
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b",
40
+ "input_layernorm.weight": "c419d161cc4932ecddf0ec98cbe5737b92688f0d5aa71a7e95d2006ca824ffca",
41
+ "post_attention_layernorm.weight": "ee6a9a96c2b4f35eb0807060229f10bc28080072ed9ecfa0a17e1aaa3cb4df40"
42
+ },
43
+ "source_after_sha256": {
44
+ "self_attn.q_proj.weight": "67540e2474547f1d622b738128696574720591fddabb8157d2f6812ecc3af308",
45
+ "self_attn.k_proj.weight": "efbe8b71b99ef90277849155ebc45e9aad5ffe746f2958c077c7c7130d783c7b",
46
+ "self_attn.v_proj.weight": "c53545e1ac9a6447efa83242434a0b28bcda5fe12ef3866e173dd13c3da45e38",
47
+ "self_attn.o_proj.weight": "8812afef76626e47fb5dffe3a77a0cb07a07e8a7f5cf3a97453368a1284b0ffa",
48
+ "self_attn.q_norm.weight": "79bbb659cb1c2af322ca85abf7d26b088c837bcd284e70efa95a6449f69b5673",
49
+ "self_attn.k_norm.weight": "e50a57833625792c16439de078eeb810df393e1a49ef7bbe43f5af6a93923adc",
50
+ "mlp.gate_proj.weight": "655a66345118a70ec952e549407ec7f19222782a04bf0db39c5ee8372372a2bf",
51
+ "mlp.up_proj.weight": "cb86cdbce20a724154f50658e0c2cfc3ec3d63e3802388217035698470825d82",
52
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b",
53
+ "input_layernorm.weight": "c419d161cc4932ecddf0ec98cbe5737b92688f0d5aa71a7e95d2006ca824ffca",
54
+ "post_attention_layernorm.weight": "ee6a9a96c2b4f35eb0807060229f10bc28080072ed9ecfa0a17e1aaa3cb4df40"
55
+ },
56
+ "changed": [
57
+ "mlp.gate_proj.weight",
58
+ "mlp.up_proj.weight"
59
+ ]
60
+ },
61
+ "merge": {
62
+ "initializer": "wb",
63
+ "lambda_left": 0.0,
64
+ "lambda_right": 1.0,
65
+ "projection_names": [
66
+ "mlp.gate_proj.weight",
67
+ "mlp.up_proj.weight",
68
+ "mlp.down_proj.weight"
69
+ ],
70
+ "scope": "mlp",
71
+ "frozen_anchor_sha256": {
72
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
73
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
74
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
75
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
76
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
77
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
78
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
79
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
80
+ },
81
+ "anchor_before_sha256": {
82
+ "mlp.gate_proj.weight": "3e138d6d890dfaeeeb88ae9b8a48c084aea69752230749e87f1586b975880ddd",
83
+ "mlp.up_proj.weight": "1f3dacc4c4a3af2a55d6273cfc2374077a2eda18cec7cf8237e05c54cc1b8ea5",
84
+ "mlp.down_proj.weight": "7a34a8a9bcc1a25c928397e3be5c409081b9de0ec283d13425482c0020e6db43"
85
+ },
86
+ "source_post_transport_sha256": {
87
+ "self_attn.q_proj.weight": "67540e2474547f1d622b738128696574720591fddabb8157d2f6812ecc3af308",
88
+ "self_attn.k_proj.weight": "efbe8b71b99ef90277849155ebc45e9aad5ffe746f2958c077c7c7130d783c7b",
89
+ "self_attn.v_proj.weight": "c53545e1ac9a6447efa83242434a0b28bcda5fe12ef3866e173dd13c3da45e38",
90
+ "self_attn.o_proj.weight": "8812afef76626e47fb5dffe3a77a0cb07a07e8a7f5cf3a97453368a1284b0ffa",
91
+ "self_attn.q_norm.weight": "79bbb659cb1c2af322ca85abf7d26b088c837bcd284e70efa95a6449f69b5673",
92
+ "self_attn.k_norm.weight": "e50a57833625792c16439de078eeb810df393e1a49ef7bbe43f5af6a93923adc",
93
+ "mlp.gate_proj.weight": "655a66345118a70ec952e549407ec7f19222782a04bf0db39c5ee8372372a2bf",
94
+ "mlp.up_proj.weight": "cb86cdbce20a724154f50658e0c2cfc3ec3d63e3802388217035698470825d82",
95
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b",
96
+ "input_layernorm.weight": "c419d161cc4932ecddf0ec98cbe5737b92688f0d5aa71a7e95d2006ca824ffca",
97
+ "post_attention_layernorm.weight": "ee6a9a96c2b4f35eb0807060229f10bc28080072ed9ecfa0a17e1aaa3cb4df40"
98
+ },
99
+ "anchor_after_sha256": {
100
+ "mlp.gate_proj.weight": "655a66345118a70ec952e549407ec7f19222782a04bf0db39c5ee8372372a2bf",
101
+ "mlp.up_proj.weight": "cb86cdbce20a724154f50658e0c2cfc3ec3d63e3802388217035698470825d82",
102
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b"
103
+ },
104
+ "norm_policy": "keep_Wa_including_QK_norms",
105
+ "source_mutated_by_merge": false,
106
+ "fisher_computed": false,
107
+ "fit": false,
108
+ "optimizer_steps": 0,
109
+ "backward_calls": 0
110
+ }
111
+ },
112
+ {
113
+ "cycle": 2,
114
+ "anchor": 12,
115
+ "removed_original_layer": 14,
116
+ "selection_policy": "fixed_our_span_13_22_anchor12",
117
+ "fit": false,
118
+ "lambda_left": 0.0,
119
+ "transport_matrix_sha256": "2f2164ca8bffcf85ff9cfb9506308fa1340559aba7e44bda37d1e050e6e82d36",
120
+ "transport": {
121
+ "stats": {
122
+ "tokens": 65536,
123
+ "ridge_relative": 0.001,
124
+ "ridge_absolute": 6.060115993022919e-05,
125
+ "gram_mean_diagonal": 0.06060115993022919,
126
+ "calibration_nmse": 0.10099672573787757,
127
+ "calibration_cosine": 0.9481582440752598,
128
+ "calibration_norm_ratio": 0.9472741933087646,
129
+ "transport_relative_identity_distance": 0.45524656772613525,
130
+ "enabled": true,
131
+ "batches": 32,
132
+ "coordinate_fit": "X_anchor @ T ~= X_source",
133
+ "weight_rewrite": [
134
+ "mlp.gate_proj.weight <- W_source @ T.T",
135
+ "mlp.up_proj.weight <- W_source @ T.T"
136
+ ],
137
+ "down_proj_transported": false,
138
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
139
+ },
140
+ "source_before_sha256": {
141
+ "self_attn.q_proj.weight": "f57ad388d57bb515af2ac9324d86dc9e19c4cc44bc73879a7b409f9c07597c15",
142
+ "self_attn.k_proj.weight": "09cba09d72eea6b683087478aeaaf6d321423335a9eb57d47006adbc1f336c63",
143
+ "self_attn.v_proj.weight": "af4adee7b325a938beb530808104ab27a70afc0d494134b3de1f5ea8ef060773",
144
+ "self_attn.o_proj.weight": "6888fff18d668ea322341951eb6ab19a3fbbc4cf94b758ed0f8dba411a262d1f",
145
+ "self_attn.q_norm.weight": "e3e9ec56f12aa5ec410018bbac99e6953ad52f3b8b796d73c5bd0cc6545fb93b",
146
+ "self_attn.k_norm.weight": "a5bf1576b21d93da019094f1a61912669136a5d9e89e8d2301c88f6bf2def290",
147
+ "mlp.gate_proj.weight": "1d90e8cf937190e4027f0c7bc34bbabd5bb43c5f3d081537e0d866da8a3efe3f",
148
+ "mlp.up_proj.weight": "dc867f2d0718d761bb166f69bd21878837006daf9ae392c955a2e9578a15ad97",
149
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d",
150
+ "input_layernorm.weight": "c21d58d80fa7aca24ff0dac67092f8204b3876926fa095bb7e6ceb3a16060706",
151
+ "post_attention_layernorm.weight": "1e599b9bd0ed7fdbcef34cff94651bf467bf923745a76a96d33a74ae551ad5d5"
152
+ },
153
+ "source_after_sha256": {
154
+ "self_attn.q_proj.weight": "f57ad388d57bb515af2ac9324d86dc9e19c4cc44bc73879a7b409f9c07597c15",
155
+ "self_attn.k_proj.weight": "09cba09d72eea6b683087478aeaaf6d321423335a9eb57d47006adbc1f336c63",
156
+ "self_attn.v_proj.weight": "af4adee7b325a938beb530808104ab27a70afc0d494134b3de1f5ea8ef060773",
157
+ "self_attn.o_proj.weight": "6888fff18d668ea322341951eb6ab19a3fbbc4cf94b758ed0f8dba411a262d1f",
158
+ "self_attn.q_norm.weight": "e3e9ec56f12aa5ec410018bbac99e6953ad52f3b8b796d73c5bd0cc6545fb93b",
159
+ "self_attn.k_norm.weight": "a5bf1576b21d93da019094f1a61912669136a5d9e89e8d2301c88f6bf2def290",
160
+ "mlp.gate_proj.weight": "f7c92c612a7c8544bac0f0123aff1cb5f922f5b1cf88006c20b8768643f37029",
161
+ "mlp.up_proj.weight": "4a3522038cb62630906e194bfc0a6e0d5b7f7e8a614b029b83f93145bc4c4a04",
162
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d",
163
+ "input_layernorm.weight": "c21d58d80fa7aca24ff0dac67092f8204b3876926fa095bb7e6ceb3a16060706",
164
+ "post_attention_layernorm.weight": "1e599b9bd0ed7fdbcef34cff94651bf467bf923745a76a96d33a74ae551ad5d5"
165
+ },
166
+ "changed": [
167
+ "mlp.gate_proj.weight",
168
+ "mlp.up_proj.weight"
169
+ ]
170
+ },
171
+ "merge": {
172
+ "initializer": "wb",
173
+ "lambda_left": 0.0,
174
+ "lambda_right": 1.0,
175
+ "projection_names": [
176
+ "mlp.gate_proj.weight",
177
+ "mlp.up_proj.weight",
178
+ "mlp.down_proj.weight"
179
+ ],
180
+ "scope": "mlp",
181
+ "frozen_anchor_sha256": {
182
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
183
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
184
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
185
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
186
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
187
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
188
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
189
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
190
+ },
191
+ "anchor_before_sha256": {
192
+ "mlp.gate_proj.weight": "655a66345118a70ec952e549407ec7f19222782a04bf0db39c5ee8372372a2bf",
193
+ "mlp.up_proj.weight": "cb86cdbce20a724154f50658e0c2cfc3ec3d63e3802388217035698470825d82",
194
+ "mlp.down_proj.weight": "032dc5aba56bd954e7498918ca13b8589c12587c97ad88560480e8d28c18883b"
195
+ },
196
+ "source_post_transport_sha256": {
197
+ "self_attn.q_proj.weight": "f57ad388d57bb515af2ac9324d86dc9e19c4cc44bc73879a7b409f9c07597c15",
198
+ "self_attn.k_proj.weight": "09cba09d72eea6b683087478aeaaf6d321423335a9eb57d47006adbc1f336c63",
199
+ "self_attn.v_proj.weight": "af4adee7b325a938beb530808104ab27a70afc0d494134b3de1f5ea8ef060773",
200
+ "self_attn.o_proj.weight": "6888fff18d668ea322341951eb6ab19a3fbbc4cf94b758ed0f8dba411a262d1f",
201
+ "self_attn.q_norm.weight": "e3e9ec56f12aa5ec410018bbac99e6953ad52f3b8b796d73c5bd0cc6545fb93b",
202
+ "self_attn.k_norm.weight": "a5bf1576b21d93da019094f1a61912669136a5d9e89e8d2301c88f6bf2def290",
203
+ "mlp.gate_proj.weight": "f7c92c612a7c8544bac0f0123aff1cb5f922f5b1cf88006c20b8768643f37029",
204
+ "mlp.up_proj.weight": "4a3522038cb62630906e194bfc0a6e0d5b7f7e8a614b029b83f93145bc4c4a04",
205
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d",
206
+ "input_layernorm.weight": "c21d58d80fa7aca24ff0dac67092f8204b3876926fa095bb7e6ceb3a16060706",
207
+ "post_attention_layernorm.weight": "1e599b9bd0ed7fdbcef34cff94651bf467bf923745a76a96d33a74ae551ad5d5"
208
+ },
209
+ "anchor_after_sha256": {
210
+ "mlp.gate_proj.weight": "f7c92c612a7c8544bac0f0123aff1cb5f922f5b1cf88006c20b8768643f37029",
211
+ "mlp.up_proj.weight": "4a3522038cb62630906e194bfc0a6e0d5b7f7e8a614b029b83f93145bc4c4a04",
212
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d"
213
+ },
214
+ "norm_policy": "keep_Wa_including_QK_norms",
215
+ "source_mutated_by_merge": false,
216
+ "fisher_computed": false,
217
+ "fit": false,
218
+ "optimizer_steps": 0,
219
+ "backward_calls": 0
220
+ }
221
+ },
222
+ {
223
+ "cycle": 3,
224
+ "anchor": 12,
225
+ "removed_original_layer": 15,
226
+ "selection_policy": "fixed_our_span_13_22_anchor12",
227
+ "fit": false,
228
+ "lambda_left": 0.0,
229
+ "transport_matrix_sha256": "c74bae7cb32fe1396e861248ba6bf41c2fd708fc354660e485db8f232fea727e",
230
+ "transport": {
231
+ "stats": {
232
+ "tokens": 65536,
233
+ "ridge_relative": 0.001,
234
+ "ridge_absolute": 6.060115993022919e-05,
235
+ "gram_mean_diagonal": 0.06060115993022919,
236
+ "calibration_nmse": 0.11038890826345682,
237
+ "calibration_cosine": 0.9431923979113933,
238
+ "calibration_norm_ratio": 0.9422936536202322,
239
+ "transport_relative_identity_distance": 0.480193167924881,
240
+ "enabled": true,
241
+ "batches": 32,
242
+ "coordinate_fit": "X_anchor @ T ~= X_source",
243
+ "weight_rewrite": [
244
+ "mlp.gate_proj.weight <- W_source @ T.T",
245
+ "mlp.up_proj.weight <- W_source @ T.T"
246
+ ],
247
+ "down_proj_transported": false,
248
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
249
+ },
250
+ "source_before_sha256": {
251
+ "self_attn.q_proj.weight": "6005f741b04aefb4b83452f774f7d013b010b6218020e382a98c92a45d8878ac",
252
+ "self_attn.k_proj.weight": "e4d7d1464c351cfcb69799eb3e3bf63cc597383cbfb0d07263236ba2d8eb3d5b",
253
+ "self_attn.v_proj.weight": "25063dfdce05fdcb1a48c5d71c3e0107d7a894b7fb6c0f7defa2e768c68ba3d7",
254
+ "self_attn.o_proj.weight": "e96bf888e3b0629075b2ee05288e147fd875119467d978c2269ecfeb3b0db4eb",
255
+ "self_attn.q_norm.weight": "d77168c19fe27a0d64a2611360be089b4435adc62444d0e82a986419be1d9b44",
256
+ "self_attn.k_norm.weight": "2cbb9d53874b3fe1d350a9c9031d64cd138a1dbac549529d07da2927106a10ff",
257
+ "mlp.gate_proj.weight": "3acdf3c7c3b8dd224f2837ef92c5e72e8bc7963baa021e9ba2a032da6084c86a",
258
+ "mlp.up_proj.weight": "6a0bdd43c6eab5e133991697799089710e9077591b56bcbde02440054dbfebbc",
259
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea",
260
+ "input_layernorm.weight": "3f2e5d516a4c80f8d93f0221e5ecbc2e7e692f111118c7c629f210ee9d03419d",
261
+ "post_attention_layernorm.weight": "3a237234fa5182946c09967a08faec9d9060f4bd780bdd6627f6159edebe2f98"
262
+ },
263
+ "source_after_sha256": {
264
+ "self_attn.q_proj.weight": "6005f741b04aefb4b83452f774f7d013b010b6218020e382a98c92a45d8878ac",
265
+ "self_attn.k_proj.weight": "e4d7d1464c351cfcb69799eb3e3bf63cc597383cbfb0d07263236ba2d8eb3d5b",
266
+ "self_attn.v_proj.weight": "25063dfdce05fdcb1a48c5d71c3e0107d7a894b7fb6c0f7defa2e768c68ba3d7",
267
+ "self_attn.o_proj.weight": "e96bf888e3b0629075b2ee05288e147fd875119467d978c2269ecfeb3b0db4eb",
268
+ "self_attn.q_norm.weight": "d77168c19fe27a0d64a2611360be089b4435adc62444d0e82a986419be1d9b44",
269
+ "self_attn.k_norm.weight": "2cbb9d53874b3fe1d350a9c9031d64cd138a1dbac549529d07da2927106a10ff",
270
+ "mlp.gate_proj.weight": "8292c665701ba7b813c028746607fae674b14b68899c1b53243212237e3d7d2c",
271
+ "mlp.up_proj.weight": "17669eaa9229e48a498c1cc80e87be7605a037083184521ca6ab99b277bfa6d2",
272
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea",
273
+ "input_layernorm.weight": "3f2e5d516a4c80f8d93f0221e5ecbc2e7e692f111118c7c629f210ee9d03419d",
274
+ "post_attention_layernorm.weight": "3a237234fa5182946c09967a08faec9d9060f4bd780bdd6627f6159edebe2f98"
275
+ },
276
+ "changed": [
277
+ "mlp.gate_proj.weight",
278
+ "mlp.up_proj.weight"
279
+ ]
280
+ },
281
+ "merge": {
282
+ "initializer": "wb",
283
+ "lambda_left": 0.0,
284
+ "lambda_right": 1.0,
285
+ "projection_names": [
286
+ "mlp.gate_proj.weight",
287
+ "mlp.up_proj.weight",
288
+ "mlp.down_proj.weight"
289
+ ],
290
+ "scope": "mlp",
291
+ "frozen_anchor_sha256": {
292
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
293
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
294
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
295
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
296
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
297
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
298
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
299
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
300
+ },
301
+ "anchor_before_sha256": {
302
+ "mlp.gate_proj.weight": "f7c92c612a7c8544bac0f0123aff1cb5f922f5b1cf88006c20b8768643f37029",
303
+ "mlp.up_proj.weight": "4a3522038cb62630906e194bfc0a6e0d5b7f7e8a614b029b83f93145bc4c4a04",
304
+ "mlp.down_proj.weight": "0ac1fc28ab86d85f9cb5f40fbde4485ceac5d2d531a13f5f05d81910ebd8b48d"
305
+ },
306
+ "source_post_transport_sha256": {
307
+ "self_attn.q_proj.weight": "6005f741b04aefb4b83452f774f7d013b010b6218020e382a98c92a45d8878ac",
308
+ "self_attn.k_proj.weight": "e4d7d1464c351cfcb69799eb3e3bf63cc597383cbfb0d07263236ba2d8eb3d5b",
309
+ "self_attn.v_proj.weight": "25063dfdce05fdcb1a48c5d71c3e0107d7a894b7fb6c0f7defa2e768c68ba3d7",
310
+ "self_attn.o_proj.weight": "e96bf888e3b0629075b2ee05288e147fd875119467d978c2269ecfeb3b0db4eb",
311
+ "self_attn.q_norm.weight": "d77168c19fe27a0d64a2611360be089b4435adc62444d0e82a986419be1d9b44",
312
+ "self_attn.k_norm.weight": "2cbb9d53874b3fe1d350a9c9031d64cd138a1dbac549529d07da2927106a10ff",
313
+ "mlp.gate_proj.weight": "8292c665701ba7b813c028746607fae674b14b68899c1b53243212237e3d7d2c",
314
+ "mlp.up_proj.weight": "17669eaa9229e48a498c1cc80e87be7605a037083184521ca6ab99b277bfa6d2",
315
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea",
316
+ "input_layernorm.weight": "3f2e5d516a4c80f8d93f0221e5ecbc2e7e692f111118c7c629f210ee9d03419d",
317
+ "post_attention_layernorm.weight": "3a237234fa5182946c09967a08faec9d9060f4bd780bdd6627f6159edebe2f98"
318
+ },
319
+ "anchor_after_sha256": {
320
+ "mlp.gate_proj.weight": "8292c665701ba7b813c028746607fae674b14b68899c1b53243212237e3d7d2c",
321
+ "mlp.up_proj.weight": "17669eaa9229e48a498c1cc80e87be7605a037083184521ca6ab99b277bfa6d2",
322
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea"
323
+ },
324
+ "norm_policy": "keep_Wa_including_QK_norms",
325
+ "source_mutated_by_merge": false,
326
+ "fisher_computed": false,
327
+ "fit": false,
328
+ "optimizer_steps": 0,
329
+ "backward_calls": 0
330
+ }
331
+ },
332
+ {
333
+ "cycle": 4,
334
+ "anchor": 12,
335
+ "removed_original_layer": 16,
336
+ "selection_policy": "fixed_our_span_13_22_anchor12",
337
+ "fit": false,
338
+ "lambda_left": 0.0,
339
+ "transport_matrix_sha256": "49bbea5f7162f9479174a850b673f69481d7c2e8e01b01c5a110ec706d662fce",
340
+ "transport": {
341
+ "stats": {
342
+ "tokens": 65536,
343
+ "ridge_relative": 0.001,
344
+ "ridge_absolute": 6.060115993022919e-05,
345
+ "gram_mean_diagonal": 0.06060115993022919,
346
+ "calibration_nmse": 0.09866496995725485,
347
+ "calibration_cosine": 0.9493870783680597,
348
+ "calibration_norm_ratio": 0.9484957145281611,
349
+ "transport_relative_identity_distance": 0.46458062529563904,
350
+ "enabled": true,
351
+ "batches": 32,
352
+ "coordinate_fit": "X_anchor @ T ~= X_source",
353
+ "weight_rewrite": [
354
+ "mlp.gate_proj.weight <- W_source @ T.T",
355
+ "mlp.up_proj.weight <- W_source @ T.T"
356
+ ],
357
+ "down_proj_transported": false,
358
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
359
+ },
360
+ "source_before_sha256": {
361
+ "self_attn.q_proj.weight": "a9874967bd53acfd480ed2bd5552fab4e1a06f610af242d411e176c279e0191a",
362
+ "self_attn.k_proj.weight": "0a285bc594b54a921f698937c566bce629295ff4befcebb203038dd0d97eb3f0",
363
+ "self_attn.v_proj.weight": "dd8847c5b10e200df29bf79b30321ec7f1d90427ab9b3d273e18a4cbd83e597d",
364
+ "self_attn.o_proj.weight": "e6afd2a9ba7c9e6f1911d773062b9d37442a01ead339c9aa9255ff20f146b196",
365
+ "self_attn.q_norm.weight": "48de60cd86dec981224231f275146bc8d17990394835783504bbf5f0e9c5bb1a",
366
+ "self_attn.k_norm.weight": "d6ef88be0fc007a2bc5e9f1a0a70b7eac493495b5b54b4f72582378340b9bb4d",
367
+ "mlp.gate_proj.weight": "171beb5701a83f117d0a59a14a78be2936a062c7aa5700ec39efd9c816af96db",
368
+ "mlp.up_proj.weight": "e04d543903d934aae9062d2034f71ac4d3fb1ac69bd5f31d365f404c764e535e",
369
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1",
370
+ "input_layernorm.weight": "45d58615dedc0906944d998c52fed1d0d139338362abd51fc1b98ae12edec92a",
371
+ "post_attention_layernorm.weight": "af332049d823017194704880c92765ab0cf4a519c8819753d0539106ea951cef"
372
+ },
373
+ "source_after_sha256": {
374
+ "self_attn.q_proj.weight": "a9874967bd53acfd480ed2bd5552fab4e1a06f610af242d411e176c279e0191a",
375
+ "self_attn.k_proj.weight": "0a285bc594b54a921f698937c566bce629295ff4befcebb203038dd0d97eb3f0",
376
+ "self_attn.v_proj.weight": "dd8847c5b10e200df29bf79b30321ec7f1d90427ab9b3d273e18a4cbd83e597d",
377
+ "self_attn.o_proj.weight": "e6afd2a9ba7c9e6f1911d773062b9d37442a01ead339c9aa9255ff20f146b196",
378
+ "self_attn.q_norm.weight": "48de60cd86dec981224231f275146bc8d17990394835783504bbf5f0e9c5bb1a",
379
+ "self_attn.k_norm.weight": "d6ef88be0fc007a2bc5e9f1a0a70b7eac493495b5b54b4f72582378340b9bb4d",
380
+ "mlp.gate_proj.weight": "debf2f81470433f78676cc9649af3a208c369737428e6fcf4918ef2f14edeb9b",
381
+ "mlp.up_proj.weight": "5c1a4ef2663bb8509c1736405a121d2cf0105b113be03629fdd9c8ebae51064a",
382
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1",
383
+ "input_layernorm.weight": "45d58615dedc0906944d998c52fed1d0d139338362abd51fc1b98ae12edec92a",
384
+ "post_attention_layernorm.weight": "af332049d823017194704880c92765ab0cf4a519c8819753d0539106ea951cef"
385
+ },
386
+ "changed": [
387
+ "mlp.gate_proj.weight",
388
+ "mlp.up_proj.weight"
389
+ ]
390
+ },
391
+ "merge": {
392
+ "initializer": "wb",
393
+ "lambda_left": 0.0,
394
+ "lambda_right": 1.0,
395
+ "projection_names": [
396
+ "mlp.gate_proj.weight",
397
+ "mlp.up_proj.weight",
398
+ "mlp.down_proj.weight"
399
+ ],
400
+ "scope": "mlp",
401
+ "frozen_anchor_sha256": {
402
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
403
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
404
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
405
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
406
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
407
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
408
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
409
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
410
+ },
411
+ "anchor_before_sha256": {
412
+ "mlp.gate_proj.weight": "8292c665701ba7b813c028746607fae674b14b68899c1b53243212237e3d7d2c",
413
+ "mlp.up_proj.weight": "17669eaa9229e48a498c1cc80e87be7605a037083184521ca6ab99b277bfa6d2",
414
+ "mlp.down_proj.weight": "1f66d7843032883982c0b98e73d9193144e181de07f5506b718d1cea3edb23ea"
415
+ },
416
+ "source_post_transport_sha256": {
417
+ "self_attn.q_proj.weight": "a9874967bd53acfd480ed2bd5552fab4e1a06f610af242d411e176c279e0191a",
418
+ "self_attn.k_proj.weight": "0a285bc594b54a921f698937c566bce629295ff4befcebb203038dd0d97eb3f0",
419
+ "self_attn.v_proj.weight": "dd8847c5b10e200df29bf79b30321ec7f1d90427ab9b3d273e18a4cbd83e597d",
420
+ "self_attn.o_proj.weight": "e6afd2a9ba7c9e6f1911d773062b9d37442a01ead339c9aa9255ff20f146b196",
421
+ "self_attn.q_norm.weight": "48de60cd86dec981224231f275146bc8d17990394835783504bbf5f0e9c5bb1a",
422
+ "self_attn.k_norm.weight": "d6ef88be0fc007a2bc5e9f1a0a70b7eac493495b5b54b4f72582378340b9bb4d",
423
+ "mlp.gate_proj.weight": "debf2f81470433f78676cc9649af3a208c369737428e6fcf4918ef2f14edeb9b",
424
+ "mlp.up_proj.weight": "5c1a4ef2663bb8509c1736405a121d2cf0105b113be03629fdd9c8ebae51064a",
425
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1",
426
+ "input_layernorm.weight": "45d58615dedc0906944d998c52fed1d0d139338362abd51fc1b98ae12edec92a",
427
+ "post_attention_layernorm.weight": "af332049d823017194704880c92765ab0cf4a519c8819753d0539106ea951cef"
428
+ },
429
+ "anchor_after_sha256": {
430
+ "mlp.gate_proj.weight": "debf2f81470433f78676cc9649af3a208c369737428e6fcf4918ef2f14edeb9b",
431
+ "mlp.up_proj.weight": "5c1a4ef2663bb8509c1736405a121d2cf0105b113be03629fdd9c8ebae51064a",
432
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1"
433
+ },
434
+ "norm_policy": "keep_Wa_including_QK_norms",
435
+ "source_mutated_by_merge": false,
436
+ "fisher_computed": false,
437
+ "fit": false,
438
+ "optimizer_steps": 0,
439
+ "backward_calls": 0
440
+ }
441
+ },
442
+ {
443
+ "cycle": 5,
444
+ "anchor": 12,
445
+ "removed_original_layer": 17,
446
+ "selection_policy": "fixed_our_span_13_22_anchor12",
447
+ "fit": false,
448
+ "lambda_left": 0.0,
449
+ "transport_matrix_sha256": "b968cc0681a32eab25ab339122b95bf8f1b90e3ced55b7638652d052fbcdbcc3",
450
+ "transport": {
451
+ "stats": {
452
+ "tokens": 65536,
453
+ "ridge_relative": 0.001,
454
+ "ridge_absolute": 6.060115993022919e-05,
455
+ "gram_mean_diagonal": 0.06060115993022919,
456
+ "calibration_nmse": 0.09917833468174767,
457
+ "calibration_cosine": 0.9491166565617855,
458
+ "calibration_norm_ratio": 0.9482434757273703,
459
+ "transport_relative_identity_distance": 0.4882379472255707,
460
+ "enabled": true,
461
+ "batches": 32,
462
+ "coordinate_fit": "X_anchor @ T ~= X_source",
463
+ "weight_rewrite": [
464
+ "mlp.gate_proj.weight <- W_source @ T.T",
465
+ "mlp.up_proj.weight <- W_source @ T.T"
466
+ ],
467
+ "down_proj_transported": false,
468
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
469
+ },
470
+ "source_before_sha256": {
471
+ "self_attn.q_proj.weight": "93af1649dbcf27dcc906cff079a1448af3e0b78dc0ae7fcd0038e95d05f79fdc",
472
+ "self_attn.k_proj.weight": "919f1a2454b2957fa1f611232b1c0aaccdab718aed512b435923cf972cd52015",
473
+ "self_attn.v_proj.weight": "2a660e851663561147921fae640f303f3f599da61afc8d68545fed320cc9b63d",
474
+ "self_attn.o_proj.weight": "bfb11d528abdacfc054070ed7a55f90ddde74fb17704bc742ceffa065adcc717",
475
+ "self_attn.q_norm.weight": "a4538fa22891825dbfbac330127ff29569ac04b5ab0ee89e60db7e7bc64f26a3",
476
+ "self_attn.k_norm.weight": "f26654e4f51003513e7ff0cd2f23e99387481dc5c639b01444903ec9632ae685",
477
+ "mlp.gate_proj.weight": "1ec134d886ea6246b31de9cb6cbb4c451fddfb333fca1e90375f8659eb27d81c",
478
+ "mlp.up_proj.weight": "b7549bcdd3b5089f09aebb1847587e2049463294f52f4335b88b7e64888edd45",
479
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f",
480
+ "input_layernorm.weight": "70025e492885453112e0108ebf4311dfd994db35383e90da14292277834fb949",
481
+ "post_attention_layernorm.weight": "41357e377104509608d219bc3f4d8a51dde14749a9a6e6b592f6d4f4594faa85"
482
+ },
483
+ "source_after_sha256": {
484
+ "self_attn.q_proj.weight": "93af1649dbcf27dcc906cff079a1448af3e0b78dc0ae7fcd0038e95d05f79fdc",
485
+ "self_attn.k_proj.weight": "919f1a2454b2957fa1f611232b1c0aaccdab718aed512b435923cf972cd52015",
486
+ "self_attn.v_proj.weight": "2a660e851663561147921fae640f303f3f599da61afc8d68545fed320cc9b63d",
487
+ "self_attn.o_proj.weight": "bfb11d528abdacfc054070ed7a55f90ddde74fb17704bc742ceffa065adcc717",
488
+ "self_attn.q_norm.weight": "a4538fa22891825dbfbac330127ff29569ac04b5ab0ee89e60db7e7bc64f26a3",
489
+ "self_attn.k_norm.weight": "f26654e4f51003513e7ff0cd2f23e99387481dc5c639b01444903ec9632ae685",
490
+ "mlp.gate_proj.weight": "98ca3a1f76218aabde9d2dfeb23e28d798f812a336974e190ebaea9076ad4554",
491
+ "mlp.up_proj.weight": "91405003b4d46ce3a325e27da1f747b7b268d7570d3f6dab4f714a73aae768e6",
492
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f",
493
+ "input_layernorm.weight": "70025e492885453112e0108ebf4311dfd994db35383e90da14292277834fb949",
494
+ "post_attention_layernorm.weight": "41357e377104509608d219bc3f4d8a51dde14749a9a6e6b592f6d4f4594faa85"
495
+ },
496
+ "changed": [
497
+ "mlp.gate_proj.weight",
498
+ "mlp.up_proj.weight"
499
+ ]
500
+ },
501
+ "merge": {
502
+ "initializer": "wb",
503
+ "lambda_left": 0.0,
504
+ "lambda_right": 1.0,
505
+ "projection_names": [
506
+ "mlp.gate_proj.weight",
507
+ "mlp.up_proj.weight",
508
+ "mlp.down_proj.weight"
509
+ ],
510
+ "scope": "mlp",
511
+ "frozen_anchor_sha256": {
512
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
513
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
514
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
515
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
516
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
517
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
518
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
519
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
520
+ },
521
+ "anchor_before_sha256": {
522
+ "mlp.gate_proj.weight": "debf2f81470433f78676cc9649af3a208c369737428e6fcf4918ef2f14edeb9b",
523
+ "mlp.up_proj.weight": "5c1a4ef2663bb8509c1736405a121d2cf0105b113be03629fdd9c8ebae51064a",
524
+ "mlp.down_proj.weight": "c297d40f8af2ed96c90ff2f616877b4aaeed4bc2918f0e3b56ea769203724ce1"
525
+ },
526
+ "source_post_transport_sha256": {
527
+ "self_attn.q_proj.weight": "93af1649dbcf27dcc906cff079a1448af3e0b78dc0ae7fcd0038e95d05f79fdc",
528
+ "self_attn.k_proj.weight": "919f1a2454b2957fa1f611232b1c0aaccdab718aed512b435923cf972cd52015",
529
+ "self_attn.v_proj.weight": "2a660e851663561147921fae640f303f3f599da61afc8d68545fed320cc9b63d",
530
+ "self_attn.o_proj.weight": "bfb11d528abdacfc054070ed7a55f90ddde74fb17704bc742ceffa065adcc717",
531
+ "self_attn.q_norm.weight": "a4538fa22891825dbfbac330127ff29569ac04b5ab0ee89e60db7e7bc64f26a3",
532
+ "self_attn.k_norm.weight": "f26654e4f51003513e7ff0cd2f23e99387481dc5c639b01444903ec9632ae685",
533
+ "mlp.gate_proj.weight": "98ca3a1f76218aabde9d2dfeb23e28d798f812a336974e190ebaea9076ad4554",
534
+ "mlp.up_proj.weight": "91405003b4d46ce3a325e27da1f747b7b268d7570d3f6dab4f714a73aae768e6",
535
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f",
536
+ "input_layernorm.weight": "70025e492885453112e0108ebf4311dfd994db35383e90da14292277834fb949",
537
+ "post_attention_layernorm.weight": "41357e377104509608d219bc3f4d8a51dde14749a9a6e6b592f6d4f4594faa85"
538
+ },
539
+ "anchor_after_sha256": {
540
+ "mlp.gate_proj.weight": "98ca3a1f76218aabde9d2dfeb23e28d798f812a336974e190ebaea9076ad4554",
541
+ "mlp.up_proj.weight": "91405003b4d46ce3a325e27da1f747b7b268d7570d3f6dab4f714a73aae768e6",
542
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f"
543
+ },
544
+ "norm_policy": "keep_Wa_including_QK_norms",
545
+ "source_mutated_by_merge": false,
546
+ "fisher_computed": false,
547
+ "fit": false,
548
+ "optimizer_steps": 0,
549
+ "backward_calls": 0
550
+ }
551
+ },
552
+ {
553
+ "cycle": 6,
554
+ "anchor": 12,
555
+ "removed_original_layer": 18,
556
+ "selection_policy": "fixed_our_span_13_22_anchor12",
557
+ "fit": false,
558
+ "lambda_left": 0.0,
559
+ "transport_matrix_sha256": "b1c313ea0a3aa1df29a0618ae2ef9e5bc49705d8fb26ca876cad9c127db74e9e",
560
+ "transport": {
561
+ "stats": {
562
+ "tokens": 65536,
563
+ "ridge_relative": 0.001,
564
+ "ridge_absolute": 6.060115993022919e-05,
565
+ "gram_mean_diagonal": 0.06060115993022919,
566
+ "calibration_nmse": 0.09820423130187533,
567
+ "calibration_cosine": 0.9496297005441647,
568
+ "calibration_norm_ratio": 0.9487355766850942,
569
+ "transport_relative_identity_distance": 0.48003679513931274,
570
+ "enabled": true,
571
+ "batches": 32,
572
+ "coordinate_fit": "X_anchor @ T ~= X_source",
573
+ "weight_rewrite": [
574
+ "mlp.gate_proj.weight <- W_source @ T.T",
575
+ "mlp.up_proj.weight <- W_source @ T.T"
576
+ ],
577
+ "down_proj_transported": false,
578
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
579
+ },
580
+ "source_before_sha256": {
581
+ "self_attn.q_proj.weight": "3d50a07d21693613e0d831209868828215164c78606ad76bb5339d0093e2b167",
582
+ "self_attn.k_proj.weight": "055922b3d6d8ae628f8a4761be8273b2b35bd979a899e599e03a4aebc9b31b15",
583
+ "self_attn.v_proj.weight": "35d50fc9ef07106a763c826a6bed55f5f8de393edeac002703ab161116d8dead",
584
+ "self_attn.o_proj.weight": "a211c679b699b735e0587b7e0bab5610d182a4c54868438be766544a8f36b4eb",
585
+ "self_attn.q_norm.weight": "41ed057917753085abc49146d705c39743047800a2ac65dba3e227fb675ad494",
586
+ "self_attn.k_norm.weight": "f01c939b42b6e7b3a03519eadb0a08a563897458717fc05d98b7c7d158621f02",
587
+ "mlp.gate_proj.weight": "a60ac64753890f45bc06d840148fad55807f022c4f14d6437d926bfe08d6e401",
588
+ "mlp.up_proj.weight": "f614342e9f77c5b73e0b93c34e9a6cbfb1692decfd132853765e9da75c5a2edc",
589
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7",
590
+ "input_layernorm.weight": "2c7f7059994a701ae1bfd696bd109340fa7a22df9deee3bfd6c4afb890155523",
591
+ "post_attention_layernorm.weight": "d85cdb5cf77b8d6d42c74fbd6aff643661b72fcfbe4f343311c4d31db4afc67f"
592
+ },
593
+ "source_after_sha256": {
594
+ "self_attn.q_proj.weight": "3d50a07d21693613e0d831209868828215164c78606ad76bb5339d0093e2b167",
595
+ "self_attn.k_proj.weight": "055922b3d6d8ae628f8a4761be8273b2b35bd979a899e599e03a4aebc9b31b15",
596
+ "self_attn.v_proj.weight": "35d50fc9ef07106a763c826a6bed55f5f8de393edeac002703ab161116d8dead",
597
+ "self_attn.o_proj.weight": "a211c679b699b735e0587b7e0bab5610d182a4c54868438be766544a8f36b4eb",
598
+ "self_attn.q_norm.weight": "41ed057917753085abc49146d705c39743047800a2ac65dba3e227fb675ad494",
599
+ "self_attn.k_norm.weight": "f01c939b42b6e7b3a03519eadb0a08a563897458717fc05d98b7c7d158621f02",
600
+ "mlp.gate_proj.weight": "03eb425fe1ff0c465accdbd062fa76ec3b951f4c173d9f900657e922811eff2f",
601
+ "mlp.up_proj.weight": "f482573a958623f2511b60e6bfdb8ddf1b18a35942833a3cf2f6036131673c06",
602
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7",
603
+ "input_layernorm.weight": "2c7f7059994a701ae1bfd696bd109340fa7a22df9deee3bfd6c4afb890155523",
604
+ "post_attention_layernorm.weight": "d85cdb5cf77b8d6d42c74fbd6aff643661b72fcfbe4f343311c4d31db4afc67f"
605
+ },
606
+ "changed": [
607
+ "mlp.gate_proj.weight",
608
+ "mlp.up_proj.weight"
609
+ ]
610
+ },
611
+ "merge": {
612
+ "initializer": "wb",
613
+ "lambda_left": 0.0,
614
+ "lambda_right": 1.0,
615
+ "projection_names": [
616
+ "mlp.gate_proj.weight",
617
+ "mlp.up_proj.weight",
618
+ "mlp.down_proj.weight"
619
+ ],
620
+ "scope": "mlp",
621
+ "frozen_anchor_sha256": {
622
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
623
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
624
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
625
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
626
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
627
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
628
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
629
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
630
+ },
631
+ "anchor_before_sha256": {
632
+ "mlp.gate_proj.weight": "98ca3a1f76218aabde9d2dfeb23e28d798f812a336974e190ebaea9076ad4554",
633
+ "mlp.up_proj.weight": "91405003b4d46ce3a325e27da1f747b7b268d7570d3f6dab4f714a73aae768e6",
634
+ "mlp.down_proj.weight": "2b6fe52a74f5b15de22764a2c9b51acdfc75070dac110580366d2dcd9d207e0f"
635
+ },
636
+ "source_post_transport_sha256": {
637
+ "self_attn.q_proj.weight": "3d50a07d21693613e0d831209868828215164c78606ad76bb5339d0093e2b167",
638
+ "self_attn.k_proj.weight": "055922b3d6d8ae628f8a4761be8273b2b35bd979a899e599e03a4aebc9b31b15",
639
+ "self_attn.v_proj.weight": "35d50fc9ef07106a763c826a6bed55f5f8de393edeac002703ab161116d8dead",
640
+ "self_attn.o_proj.weight": "a211c679b699b735e0587b7e0bab5610d182a4c54868438be766544a8f36b4eb",
641
+ "self_attn.q_norm.weight": "41ed057917753085abc49146d705c39743047800a2ac65dba3e227fb675ad494",
642
+ "self_attn.k_norm.weight": "f01c939b42b6e7b3a03519eadb0a08a563897458717fc05d98b7c7d158621f02",
643
+ "mlp.gate_proj.weight": "03eb425fe1ff0c465accdbd062fa76ec3b951f4c173d9f900657e922811eff2f",
644
+ "mlp.up_proj.weight": "f482573a958623f2511b60e6bfdb8ddf1b18a35942833a3cf2f6036131673c06",
645
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7",
646
+ "input_layernorm.weight": "2c7f7059994a701ae1bfd696bd109340fa7a22df9deee3bfd6c4afb890155523",
647
+ "post_attention_layernorm.weight": "d85cdb5cf77b8d6d42c74fbd6aff643661b72fcfbe4f343311c4d31db4afc67f"
648
+ },
649
+ "anchor_after_sha256": {
650
+ "mlp.gate_proj.weight": "03eb425fe1ff0c465accdbd062fa76ec3b951f4c173d9f900657e922811eff2f",
651
+ "mlp.up_proj.weight": "f482573a958623f2511b60e6bfdb8ddf1b18a35942833a3cf2f6036131673c06",
652
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7"
653
+ },
654
+ "norm_policy": "keep_Wa_including_QK_norms",
655
+ "source_mutated_by_merge": false,
656
+ "fisher_computed": false,
657
+ "fit": false,
658
+ "optimizer_steps": 0,
659
+ "backward_calls": 0
660
+ }
661
+ },
662
+ {
663
+ "cycle": 7,
664
+ "anchor": 12,
665
+ "removed_original_layer": 19,
666
+ "selection_policy": "fixed_our_span_13_22_anchor12",
667
+ "fit": false,
668
+ "lambda_left": 0.0,
669
+ "transport_matrix_sha256": "4b807a71a3f5c920f7bbe9842c8bc0c89de7ebf5b02893847374cb46eeebbaae",
670
+ "transport": {
671
+ "stats": {
672
+ "tokens": 65536,
673
+ "ridge_relative": 0.001,
674
+ "ridge_absolute": 6.060115993022919e-05,
675
+ "gram_mean_diagonal": 0.06060115993022919,
676
+ "calibration_nmse": 0.103606409701293,
677
+ "calibration_cosine": 0.9467810247760247,
678
+ "calibration_norm_ratio": 0.9459333354270779,
679
+ "transport_relative_identity_distance": 0.5275545120239258,
680
+ "enabled": true,
681
+ "batches": 32,
682
+ "coordinate_fit": "X_anchor @ T ~= X_source",
683
+ "weight_rewrite": [
684
+ "mlp.gate_proj.weight <- W_source @ T.T",
685
+ "mlp.up_proj.weight <- W_source @ T.T"
686
+ ],
687
+ "down_proj_transported": false,
688
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
689
+ },
690
+ "source_before_sha256": {
691
+ "self_attn.q_proj.weight": "d14bc25171528405c3db791fd017b4e0fe37d06a9b07a9878cb81c1f0eb98ae6",
692
+ "self_attn.k_proj.weight": "8911d7363eb8d7e35ff407ac925183a06d54d624a8d2bd0ff41db97423515a54",
693
+ "self_attn.v_proj.weight": "4781046a7d6224a77c3e34dda92a2ef5748eb777d9d554acf5621c4e5742be2a",
694
+ "self_attn.o_proj.weight": "90f47fc1bc507ddfad16299dfcecb78a6b4efac01e21d3a6402c6ef3eae56348",
695
+ "self_attn.q_norm.weight": "6915d87fcc2402518b382dee5f5929f5774006c5d82904db327d2f118d6a5c99",
696
+ "self_attn.k_norm.weight": "cb20faa93398541fe6b2fbda2a527ea3243337db753acebdfd045bf309cbc4ae",
697
+ "mlp.gate_proj.weight": "aaf6792caf14dc5a810bfa937c966c7989238e23b21080752c784428eedbf79c",
698
+ "mlp.up_proj.weight": "5a9cf857484fc35820ab3032e13383687631e54fc1a7c7ff0443ec36e962cf17",
699
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6",
700
+ "input_layernorm.weight": "316472831e20dec19263b56944811a059efb241cc842d8ace4fce706c98a8b11",
701
+ "post_attention_layernorm.weight": "7a462c4c15d73900fe1275d32448251905112e9530f615fe6776622c416f0f52"
702
+ },
703
+ "source_after_sha256": {
704
+ "self_attn.q_proj.weight": "d14bc25171528405c3db791fd017b4e0fe37d06a9b07a9878cb81c1f0eb98ae6",
705
+ "self_attn.k_proj.weight": "8911d7363eb8d7e35ff407ac925183a06d54d624a8d2bd0ff41db97423515a54",
706
+ "self_attn.v_proj.weight": "4781046a7d6224a77c3e34dda92a2ef5748eb777d9d554acf5621c4e5742be2a",
707
+ "self_attn.o_proj.weight": "90f47fc1bc507ddfad16299dfcecb78a6b4efac01e21d3a6402c6ef3eae56348",
708
+ "self_attn.q_norm.weight": "6915d87fcc2402518b382dee5f5929f5774006c5d82904db327d2f118d6a5c99",
709
+ "self_attn.k_norm.weight": "cb20faa93398541fe6b2fbda2a527ea3243337db753acebdfd045bf309cbc4ae",
710
+ "mlp.gate_proj.weight": "06d454e81788e8cfd28f613250c2c97f44fd78227c38bd35429f19915cdaeb51",
711
+ "mlp.up_proj.weight": "2c58e52893c9f2de1310538074a6ec2700403d256286f410d59a25064527f6c2",
712
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6",
713
+ "input_layernorm.weight": "316472831e20dec19263b56944811a059efb241cc842d8ace4fce706c98a8b11",
714
+ "post_attention_layernorm.weight": "7a462c4c15d73900fe1275d32448251905112e9530f615fe6776622c416f0f52"
715
+ },
716
+ "changed": [
717
+ "mlp.gate_proj.weight",
718
+ "mlp.up_proj.weight"
719
+ ]
720
+ },
721
+ "merge": {
722
+ "initializer": "wb",
723
+ "lambda_left": 0.0,
724
+ "lambda_right": 1.0,
725
+ "projection_names": [
726
+ "mlp.gate_proj.weight",
727
+ "mlp.up_proj.weight",
728
+ "mlp.down_proj.weight"
729
+ ],
730
+ "scope": "mlp",
731
+ "frozen_anchor_sha256": {
732
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
733
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
734
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
735
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
736
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
737
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
738
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
739
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
740
+ },
741
+ "anchor_before_sha256": {
742
+ "mlp.gate_proj.weight": "03eb425fe1ff0c465accdbd062fa76ec3b951f4c173d9f900657e922811eff2f",
743
+ "mlp.up_proj.weight": "f482573a958623f2511b60e6bfdb8ddf1b18a35942833a3cf2f6036131673c06",
744
+ "mlp.down_proj.weight": "b61bbddd0e5ee13e6679fb129a28885d063105955f6cb5176c39b0ac18fbfda7"
745
+ },
746
+ "source_post_transport_sha256": {
747
+ "self_attn.q_proj.weight": "d14bc25171528405c3db791fd017b4e0fe37d06a9b07a9878cb81c1f0eb98ae6",
748
+ "self_attn.k_proj.weight": "8911d7363eb8d7e35ff407ac925183a06d54d624a8d2bd0ff41db97423515a54",
749
+ "self_attn.v_proj.weight": "4781046a7d6224a77c3e34dda92a2ef5748eb777d9d554acf5621c4e5742be2a",
750
+ "self_attn.o_proj.weight": "90f47fc1bc507ddfad16299dfcecb78a6b4efac01e21d3a6402c6ef3eae56348",
751
+ "self_attn.q_norm.weight": "6915d87fcc2402518b382dee5f5929f5774006c5d82904db327d2f118d6a5c99",
752
+ "self_attn.k_norm.weight": "cb20faa93398541fe6b2fbda2a527ea3243337db753acebdfd045bf309cbc4ae",
753
+ "mlp.gate_proj.weight": "06d454e81788e8cfd28f613250c2c97f44fd78227c38bd35429f19915cdaeb51",
754
+ "mlp.up_proj.weight": "2c58e52893c9f2de1310538074a6ec2700403d256286f410d59a25064527f6c2",
755
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6",
756
+ "input_layernorm.weight": "316472831e20dec19263b56944811a059efb241cc842d8ace4fce706c98a8b11",
757
+ "post_attention_layernorm.weight": "7a462c4c15d73900fe1275d32448251905112e9530f615fe6776622c416f0f52"
758
+ },
759
+ "anchor_after_sha256": {
760
+ "mlp.gate_proj.weight": "06d454e81788e8cfd28f613250c2c97f44fd78227c38bd35429f19915cdaeb51",
761
+ "mlp.up_proj.weight": "2c58e52893c9f2de1310538074a6ec2700403d256286f410d59a25064527f6c2",
762
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6"
763
+ },
764
+ "norm_policy": "keep_Wa_including_QK_norms",
765
+ "source_mutated_by_merge": false,
766
+ "fisher_computed": false,
767
+ "fit": false,
768
+ "optimizer_steps": 0,
769
+ "backward_calls": 0
770
+ }
771
+ },
772
+ {
773
+ "cycle": 8,
774
+ "anchor": 12,
775
+ "removed_original_layer": 20,
776
+ "selection_policy": "fixed_our_span_13_22_anchor12",
777
+ "fit": false,
778
+ "lambda_left": 0.0,
779
+ "transport_matrix_sha256": "2c7b2775e51300a42d0d75c89a6c22bee3e7c935b89f0db3cf2b3fd9863b8fd6",
780
+ "transport": {
781
+ "stats": {
782
+ "tokens": 65536,
783
+ "ridge_relative": 0.001,
784
+ "ridge_absolute": 6.060115993022919e-05,
785
+ "gram_mean_diagonal": 0.06060115993022919,
786
+ "calibration_nmse": 0.10606533290714001,
787
+ "calibration_cosine": 0.9454815765850116,
788
+ "calibration_norm_ratio": 0.9446186925723196,
789
+ "transport_relative_identity_distance": 0.5891098976135254,
790
+ "enabled": true,
791
+ "batches": 32,
792
+ "coordinate_fit": "X_anchor @ T ~= X_source",
793
+ "weight_rewrite": [
794
+ "mlp.gate_proj.weight <- W_source @ T.T",
795
+ "mlp.up_proj.weight <- W_source @ T.T"
796
+ ],
797
+ "down_proj_transported": false,
798
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
799
+ },
800
+ "source_before_sha256": {
801
+ "self_attn.q_proj.weight": "6bdb1d9174c7bf6d06b12d5d55b3a7649f4f880714e3e2d5a6f90c1449ad1a50",
802
+ "self_attn.k_proj.weight": "e3a98bfec07bba4f0fc6aa01b510f13fce379d8a5fdce7a70ce0870da65a2e43",
803
+ "self_attn.v_proj.weight": "f250ec94ab67ea3d397297fa0c70e7e24c7f77ca609a3a83cc8f7e792e4bc608",
804
+ "self_attn.o_proj.weight": "18f0f0ec64b28cbc88f0937245cb010fd86dcf094de2d96d1bd2162b76020229",
805
+ "self_attn.q_norm.weight": "2172344fe2c1fda6f261ece920fbd07a4b03d2385d2c0848c497aae4f07e69b5",
806
+ "self_attn.k_norm.weight": "a2c8f7815e194c45bad87d1e291c9ff2ad3a36929b1201d024354ec501563a4e",
807
+ "mlp.gate_proj.weight": "8334c424ddf9edb282ccb34d6f90321e9530eff5e81b7881ba9b3d74417a9672",
808
+ "mlp.up_proj.weight": "db91586fd2907e8ecccb075f036e5c180641fa35f7cd899a3f81411caa9d10df",
809
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd",
810
+ "input_layernorm.weight": "96fb39db2f64c716ae6891acb4e4e7f2a1276921a97d0d9a50d746727e4bbcd0",
811
+ "post_attention_layernorm.weight": "cd331d158252933122eae174cda361e7f3eb260b867b079b375650b368a4ae06"
812
+ },
813
+ "source_after_sha256": {
814
+ "self_attn.q_proj.weight": "6bdb1d9174c7bf6d06b12d5d55b3a7649f4f880714e3e2d5a6f90c1449ad1a50",
815
+ "self_attn.k_proj.weight": "e3a98bfec07bba4f0fc6aa01b510f13fce379d8a5fdce7a70ce0870da65a2e43",
816
+ "self_attn.v_proj.weight": "f250ec94ab67ea3d397297fa0c70e7e24c7f77ca609a3a83cc8f7e792e4bc608",
817
+ "self_attn.o_proj.weight": "18f0f0ec64b28cbc88f0937245cb010fd86dcf094de2d96d1bd2162b76020229",
818
+ "self_attn.q_norm.weight": "2172344fe2c1fda6f261ece920fbd07a4b03d2385d2c0848c497aae4f07e69b5",
819
+ "self_attn.k_norm.weight": "a2c8f7815e194c45bad87d1e291c9ff2ad3a36929b1201d024354ec501563a4e",
820
+ "mlp.gate_proj.weight": "9f8d001778d2562d9f0deb7aa67ab4b374ee11bc56cf341dd3bbc2f89da978a9",
821
+ "mlp.up_proj.weight": "82d2d94c9a1082f87643386884771be030ad54381da7fbfda1931d886bff69bc",
822
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd",
823
+ "input_layernorm.weight": "96fb39db2f64c716ae6891acb4e4e7f2a1276921a97d0d9a50d746727e4bbcd0",
824
+ "post_attention_layernorm.weight": "cd331d158252933122eae174cda361e7f3eb260b867b079b375650b368a4ae06"
825
+ },
826
+ "changed": [
827
+ "mlp.gate_proj.weight",
828
+ "mlp.up_proj.weight"
829
+ ]
830
+ },
831
+ "merge": {
832
+ "initializer": "wb",
833
+ "lambda_left": 0.0,
834
+ "lambda_right": 1.0,
835
+ "projection_names": [
836
+ "mlp.gate_proj.weight",
837
+ "mlp.up_proj.weight",
838
+ "mlp.down_proj.weight"
839
+ ],
840
+ "scope": "mlp",
841
+ "frozen_anchor_sha256": {
842
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
843
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
844
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
845
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
846
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
847
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
848
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
849
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
850
+ },
851
+ "anchor_before_sha256": {
852
+ "mlp.gate_proj.weight": "06d454e81788e8cfd28f613250c2c97f44fd78227c38bd35429f19915cdaeb51",
853
+ "mlp.up_proj.weight": "2c58e52893c9f2de1310538074a6ec2700403d256286f410d59a25064527f6c2",
854
+ "mlp.down_proj.weight": "d65d2b30d50eb54acafa83fef24d9a0fa7d57b6cb6cc06a94e476c758f8812d6"
855
+ },
856
+ "source_post_transport_sha256": {
857
+ "self_attn.q_proj.weight": "6bdb1d9174c7bf6d06b12d5d55b3a7649f4f880714e3e2d5a6f90c1449ad1a50",
858
+ "self_attn.k_proj.weight": "e3a98bfec07bba4f0fc6aa01b510f13fce379d8a5fdce7a70ce0870da65a2e43",
859
+ "self_attn.v_proj.weight": "f250ec94ab67ea3d397297fa0c70e7e24c7f77ca609a3a83cc8f7e792e4bc608",
860
+ "self_attn.o_proj.weight": "18f0f0ec64b28cbc88f0937245cb010fd86dcf094de2d96d1bd2162b76020229",
861
+ "self_attn.q_norm.weight": "2172344fe2c1fda6f261ece920fbd07a4b03d2385d2c0848c497aae4f07e69b5",
862
+ "self_attn.k_norm.weight": "a2c8f7815e194c45bad87d1e291c9ff2ad3a36929b1201d024354ec501563a4e",
863
+ "mlp.gate_proj.weight": "9f8d001778d2562d9f0deb7aa67ab4b374ee11bc56cf341dd3bbc2f89da978a9",
864
+ "mlp.up_proj.weight": "82d2d94c9a1082f87643386884771be030ad54381da7fbfda1931d886bff69bc",
865
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd",
866
+ "input_layernorm.weight": "96fb39db2f64c716ae6891acb4e4e7f2a1276921a97d0d9a50d746727e4bbcd0",
867
+ "post_attention_layernorm.weight": "cd331d158252933122eae174cda361e7f3eb260b867b079b375650b368a4ae06"
868
+ },
869
+ "anchor_after_sha256": {
870
+ "mlp.gate_proj.weight": "9f8d001778d2562d9f0deb7aa67ab4b374ee11bc56cf341dd3bbc2f89da978a9",
871
+ "mlp.up_proj.weight": "82d2d94c9a1082f87643386884771be030ad54381da7fbfda1931d886bff69bc",
872
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd"
873
+ },
874
+ "norm_policy": "keep_Wa_including_QK_norms",
875
+ "source_mutated_by_merge": false,
876
+ "fisher_computed": false,
877
+ "fit": false,
878
+ "optimizer_steps": 0,
879
+ "backward_calls": 0
880
+ }
881
+ },
882
+ {
883
+ "cycle": 9,
884
+ "anchor": 12,
885
+ "removed_original_layer": 21,
886
+ "selection_policy": "fixed_our_span_13_22_anchor12",
887
+ "fit": false,
888
+ "lambda_left": 0.0,
889
+ "transport_matrix_sha256": "7ad34658a18ce5ffbab2f8af974892f191e7db80d7b5da8d19e347938544b107",
890
+ "transport": {
891
+ "stats": {
892
+ "tokens": 65536,
893
+ "ridge_relative": 0.001,
894
+ "ridge_absolute": 6.060115993022919e-05,
895
+ "gram_mean_diagonal": 0.06060115993022919,
896
+ "calibration_nmse": 0.13979247738453124,
897
+ "calibration_cosine": 0.927474114888108,
898
+ "calibration_norm_ratio": 0.9266308047370905,
899
+ "transport_relative_identity_distance": 0.6954833269119263,
900
+ "enabled": true,
901
+ "batches": 32,
902
+ "coordinate_fit": "X_anchor @ T ~= X_source",
903
+ "weight_rewrite": [
904
+ "mlp.gate_proj.weight <- W_source @ T.T",
905
+ "mlp.up_proj.weight <- W_source @ T.T"
906
+ ],
907
+ "down_proj_transported": false,
908
+ "fisher_order": "source transport first; same-anchor post-pruning contextual Fisher second"
909
+ },
910
+ "source_before_sha256": {
911
+ "self_attn.q_proj.weight": "1839858bb3153a7d2907bbc4837cab44494ea4f8f73db2dac5a973f1500537c0",
912
+ "self_attn.k_proj.weight": "34776759a30508b301e6eeb4c03e74afc6e315a0e4005b788772f03267fa6bad",
913
+ "self_attn.v_proj.weight": "25ed7a7bfff05b2a63a9489ed945f49ed624baa5ffa7f971c263e4d3aade1d04",
914
+ "self_attn.o_proj.weight": "a8c4e7b3c03654158c39ea33456a291809aee2893e9dde1fa2d530da216b313c",
915
+ "self_attn.q_norm.weight": "21aa357e3be95df8e0b87310db2cf759d951d8c9a706c9e1bee207de27cbb87f",
916
+ "self_attn.k_norm.weight": "0dfad6f8b52d3a2c224e7cd2b5c1fe87db29b927a7d7fb4161f231df6df2ac02",
917
+ "mlp.gate_proj.weight": "4d745750b386ff30e96c0fe5ac21229e0672de87a3c4d30b7a877c333f250622",
918
+ "mlp.up_proj.weight": "b0b002f9bd65d4a6b4b37b6cf06139deb86a51ebc96fc27b4ebcff016f3e450b",
919
+ "mlp.down_proj.weight": "279864f62a9b78fa49dde314b363ca78f22fda503fbf8e9f64437ea6644a084a",
920
+ "input_layernorm.weight": "2974f6d5be715ca00edf542f4e51e5eb5ced2a292277c1974a92f5f6fec44871",
921
+ "post_attention_layernorm.weight": "a00da323dd47889f5a6238369523374a092cab49267ad69f4716d7b1c3778d5f"
922
+ },
923
+ "source_after_sha256": {
924
+ "self_attn.q_proj.weight": "1839858bb3153a7d2907bbc4837cab44494ea4f8f73db2dac5a973f1500537c0",
925
+ "self_attn.k_proj.weight": "34776759a30508b301e6eeb4c03e74afc6e315a0e4005b788772f03267fa6bad",
926
+ "self_attn.v_proj.weight": "25ed7a7bfff05b2a63a9489ed945f49ed624baa5ffa7f971c263e4d3aade1d04",
927
+ "self_attn.o_proj.weight": "a8c4e7b3c03654158c39ea33456a291809aee2893e9dde1fa2d530da216b313c",
928
+ "self_attn.q_norm.weight": "21aa357e3be95df8e0b87310db2cf759d951d8c9a706c9e1bee207de27cbb87f",
929
+ "self_attn.k_norm.weight": "0dfad6f8b52d3a2c224e7cd2b5c1fe87db29b927a7d7fb4161f231df6df2ac02",
930
+ "mlp.gate_proj.weight": "6b132cf55ede8fb805c51a5b57c84cddd3ac2e84d4d94d13538a0f3eae146ba2",
931
+ "mlp.up_proj.weight": "d8ae064ab88056091a57a96a007959b9d01bb6c1f037cdab35d76d5f5694b3ae",
932
+ "mlp.down_proj.weight": "279864f62a9b78fa49dde314b363ca78f22fda503fbf8e9f64437ea6644a084a",
933
+ "input_layernorm.weight": "2974f6d5be715ca00edf542f4e51e5eb5ced2a292277c1974a92f5f6fec44871",
934
+ "post_attention_layernorm.weight": "a00da323dd47889f5a6238369523374a092cab49267ad69f4716d7b1c3778d5f"
935
+ },
936
+ "changed": [
937
+ "mlp.gate_proj.weight",
938
+ "mlp.up_proj.weight"
939
+ ]
940
+ },
941
+ "merge": {
942
+ "initializer": "wb",
943
+ "lambda_left": 0.0,
944
+ "lambda_right": 1.0,
945
+ "projection_names": [
946
+ "mlp.gate_proj.weight",
947
+ "mlp.up_proj.weight",
948
+ "mlp.down_proj.weight"
949
+ ],
950
+ "scope": "mlp",
951
+ "frozen_anchor_sha256": {
952
+ "self_attn.q_proj.weight": "1b6c758076acef0ff0bbf34e9ee7be3808252f432a10b0015a99b07a232ddf79",
953
+ "self_attn.k_proj.weight": "8d6f656be7538039543561a8c96dca260b3db7bdcb26946d9dca9a10101bb58f",
954
+ "self_attn.v_proj.weight": "ae85148c6da3808090619c005e94364db614bdec475df91ba4e312cb026fa377",
955
+ "self_attn.o_proj.weight": "e3c5cc19864068b28a406400c10d2704664356085511c7e44b587a1eab278d92",
956
+ "self_attn.q_norm.weight": "70223d2ee9393af355e7fa894d500b5c5bf032873b6b27cba6bb1f1b971cb904",
957
+ "self_attn.k_norm.weight": "df93c74989ee20de00c5875567ad98be1eb5d115d51bacb1dc615d22b15f488e",
958
+ "input_layernorm.weight": "f65024195899b2e5822f33d9c7d7c70442aaa262dd8bb1f4847d5c70f18d09e3",
959
+ "post_attention_layernorm.weight": "017c0603fff83a0a0231a2f3b9ae54ebe7f1d495c8d7092da5a10a87fadda049"
960
+ },
961
+ "anchor_before_sha256": {
962
+ "mlp.gate_proj.weight": "9f8d001778d2562d9f0deb7aa67ab4b374ee11bc56cf341dd3bbc2f89da978a9",
963
+ "mlp.up_proj.weight": "82d2d94c9a1082f87643386884771be030ad54381da7fbfda1931d886bff69bc",
964
+ "mlp.down_proj.weight": "4d5fefc568246a3abfa21725082f7fdf4dd62e7c580a1280aebe0ec60a2230cd"
965
+ },
966
+ "source_post_transport_sha256": {
967
+ "self_attn.q_proj.weight": "1839858bb3153a7d2907bbc4837cab44494ea4f8f73db2dac5a973f1500537c0",
968
+ "self_attn.k_proj.weight": "34776759a30508b301e6eeb4c03e74afc6e315a0e4005b788772f03267fa6bad",
969
+ "self_attn.v_proj.weight": "25ed7a7bfff05b2a63a9489ed945f49ed624baa5ffa7f971c263e4d3aade1d04",
970
+ "self_attn.o_proj.weight": "a8c4e7b3c03654158c39ea33456a291809aee2893e9dde1fa2d530da216b313c",
971
+ "self_attn.q_norm.weight": "21aa357e3be95df8e0b87310db2cf759d951d8c9a706c9e1bee207de27cbb87f",
972
+ "self_attn.k_norm.weight": "0dfad6f8b52d3a2c224e7cd2b5c1fe87db29b927a7d7fb4161f231df6df2ac02",
973
+ "mlp.gate_proj.weight": "6b132cf55ede8fb805c51a5b57c84cddd3ac2e84d4d94d13538a0f3eae146ba2",
974
+ "mlp.up_proj.weight": "d8ae064ab88056091a57a96a007959b9d01bb6c1f037cdab35d76d5f5694b3ae",
975
+ "mlp.down_proj.weight": "279864f62a9b78fa49dde314b363ca78f22fda503fbf8e9f64437ea6644a084a",
976
+ "input_layernorm.weight": "2974f6d5be715ca00edf542f4e51e5eb5ced2a292277c1974a92f5f6fec44871",
977
+ "post_attention_layernorm.weight": "a00da323dd47889f5a6238369523374a092cab49267ad69f4716d7b1c3778d5f"
978
+ },
979
+ "anchor_after_sha256": {
980
+ "mlp.gate_proj.weight": "6b132cf55ede8fb805c51a5b57c84cddd3ac2e84d4d94d13538a0f3eae146ba2",
981
+ "mlp.up_proj.weight": "d8ae064ab88056091a57a96a007959b9d01bb6c1f037cdab35d76d5f5694b3ae",
982
+ "mlp.down_proj.weight": "279864f62a9b78fa49dde314b363ca78f22fda503fbf8e9f64437ea6644a084a"
983
+ },
984
+ "norm_policy": "keep_Wa_including_QK_norms",
985
+ "source_mutated_by_merge": false,
986
+ "fisher_computed": false,
987
+ "fit": false,
988
+ "optimizer_steps": 0,
989
+ "backward_calls": 0
990
+ }
991
+ }
992
+ ]
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/2026-10-11_qwen3-base-nofit-merge4.md ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Qwen3 Base no FiT merge controls
2
+
3
+ Compare Wa, transported Wb, equal average, and corrected MKA initialization without FiT on our fixed nine-block Qwen3 Base span. Reuse the completed Fisher plus Transport no-FiT baseline. Report common-dense-teacher Local MSE, WikiText2 PPL, and Bench14 macro. MKA merges attention and MLP; the other four methods merge MLP only, so the MKA comparison also changes merge scope.
4
+
5
+ ## Resources and provenance
6
+
7
+ - Session alias: `vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011`.
8
+ - Branch: `codex/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011`; immutable execution commit recorded at launch and in each backup.
9
+ - Instance 55359231, offer 51341854, machine 117301, Mississippi US. Four A100 SXM4 40 GB, reported allocated RAM 515807 MiB, disk 120 GB. Total listed cost USD 2.7444444444444445 per hour including disk, traffic extra. Offer reliability 0.9847917, download 1767 Mbps, upload 1891.5 Mbps.
10
+ - Earlier instance 55357778, machine 149846, stalled in Vast container initialization with no SSH port. It never received code or started an experiment. Destroyed October 11 on user instruction to replace it; no experiment data lost.
11
+ - Image `pytorch/pytorch:2.9.1-cuda12.8-cudnn9-devel`; transformers 5.15.1, datasets 3.6.0, huggingface_hub 1.33.0, lm_eval 0.4.12, scipy, scikit-learn. BF16 model/evaluation; source transport solves in FP32.
12
+ - External engine: vendor base bundle 39e59afe, immutable three-file source overlay from Hub revision `61734e7b1a77fd279fe1e2584f7a0fdc26c175c2`, progressive-loader helpers and instruction-mask patch.
13
+
14
+ ## Inputs and merge rules
15
+
16
+ Model `Qwen/Qwen3-8B-Base`, revision `49e3418fbbbca6ecbdf9608b4d22e5a407081db4`. Keep original anchor 12 and progressively remove original layers 13 through 21, span `[13,22)`, depth 36 to 27. Never switch to native MKA pair selection.
17
+
18
+ Calibration is the historical non-streaming `DKYoon/SlimPajama-6B` shuffle, revision `b5f90f419b7489cdba26fdbc8c022fcb5562f968`, seed 42, 64 packed sequences of 1024 tokens, batch 2. Token SHA256 must equal `85a84b9a68cf0856fd363186d3a273860886b1c17f876cae145fd092454aff55`. This is not the concurrent mixed SlimPajama and MCQA-like experiment. Prepare and save exact token IDs once, share with all arms.
19
+
20
+ Existing source feature Transport remains ON, ridge relative 0.001. It rewrites source MLP gate/up input projections only; down and attention projections are not transported. Save each transport matrix and pre/post operand hashes. In every cycle initialize from the actual post-transport source, not a stale pre-transport copy.
21
+
22
+ Wa, Wb, Average merge the three MLP projection weights with respective left coefficients 1, 0, and 0.5. Attention, residual norms, and Q/K norms remain Wa. MKA merges all seven attention and MLP projection weights with the corrected local upstream coefficient, leaving all norms Wa. MKA geometry uses these same 64 calibration sequences, sequence mean pooling, sigma 8, alpha 0.5, two diffusion dimensions, five MI neighbors, 50 entropy neighbors, beta 1, MI seed 0, and is recomputed each stage before transport. This corrected local implementation is not an exact paper reproduction.
23
+
24
+ No FiT loader, optimizer, additive U, backward pass, Fisher calculation, head permutation, LoRA, or residual-scale fitting is permitted in the four new arms. The transport ridge solve is the retained coordinate-alignment step, not MSE parameter matching.
25
+
26
+ ## Evaluation and retention
27
+
28
+ Local MSE uses the same original dense teacher for every arm, including restored existing Fisher. Inputs are the first 64 packed 1024-token WikiText2 test windows under the HCHC full-stream packing. Capture dense layer12 input and layer21 output before final RMSNorm. Compare student anchor12 output with the dense output, verifying identical anchor inputs. Evaluate only; no optimization. Report squared difference sum divided by token count and hidden width, plus auxiliary energy-normalized MSE. BF16 eager activations, FP32 differences, FP64 aggregate. Exact evaluation input IDs and teacher-output hashes are retained.
29
+
30
+ WikiText PPL preserves existing HCHC packing, sequence length 2048, BF16 eager, expected 145 windows and 296815 predicted tokens; batch 1 to fit 40 GB. Bench14 uses the established OpenCompass-five and lm-eval-nine zero-shot protocols with strict local caches. AVG means unweighted 14-task macro; separately report ZS12, MMLU, CMMLU. Preserve existing RACE protocols and earlier results.
31
+
32
+ Existing Fisher scores are reused from `results/qwen3_8b_base_nofit_bench14_20261009/summary.json`, Transport ON row: PPL 15.585997450543665, ZS12 0.5125956256004165, MMLU 0.25630252100840334, CMMLU 0.2646347781039544, Bench14 0.4765774861655254. Restore its final anchor from immutable Hub revision `b2a437466b134a6311d3ab625b0b37f9aa1a96d6` and measure only new Local MSE. Do not confuse this no-FiT baseline with historical Fisher plus FiT.
33
+
34
+ Keep all nine compact anchor stages, original model pin, stage topology, calibration and evaluation token IDs, every transport matrix, MKA coefficients/geometry, metrics and code. This permits future evaluation against each previous-stage teacher without retraining. Upload each arm under `LJYAI/paper_revision/runs/SESSION/20261011-qwen3-base-nofit-merge4/ARM`, verify every payload at its immutable revision, commit results on the remote session branch and recover/push locally. Do not return the replacement server without further instruction.
35
+
36
+ ## Commands and status
37
+
38
+ Bootstrap: `bash scripts/bootstrap_qwen3_nofit_merge4.sh PROJECT EXTERNAL ROOT MODEL`.
39
+
40
+ Controller: `bash scripts/launch_qwen3_nofit_merge4.sh PROJECT EXTERNAL ROOT MODEL SESSION`.
41
+
42
+ GPU assignment: Wa 0, Wb 1, Average 2, MKA 3. Each must pass a two-stage smoke with all 64 calibration sequences before any production arm proceeds to nine stages, Local MSE, PPL, Bench14 and verified all-stage backup. Controller commands and PID provenance are recorded in `ROOT/execution.json`.
43
+
44
+ Exact merge tests passed: four cases covering Wa, Wb, Average and MKA, BF16 deployed values, unchanged source operands and correct frozen parameters. Local syntax compilation passed; local Python lacks torch, so these CPU-only tests ran in an isolated temporary directory using the existing server's environment without changing its project or GPU workload. Replacement instance is preparing; no new pruning has started at this checkpoint.
45
+
46
+ At 16:59 KST the replacement was running and SSH setup completed at `23.127.144.217:26556`; all four devices reported A100 SXM4 40 GB. Code commit `c5846595387bf856a3feb780d8c21d86feca194e` was sent by bundle to the isolated session branch. Bootstrap PID 576 and controller PID 577 launched at 07:59:48 UTC. The pinned evaluation archives were transferred and the controller is waiting on exact input preparation. At 17:00 KST dependencies were ready and model/corpus snapshots were downloading without failed markers.
47
+
48
+ Local monitor PID 56032 checks every 300 seconds, writing `C:/Users/CELL/orca/artifacts/paper_revision/qwen3-base-nofit-merge4-55359231-20261011-monitor/poll.log`; on complete it recovers the result commit and pushes from this computer. It is a status/recovery process, not an autonomous failure-repair agent. All-stage compact packaging and backup use hard links within the same experiment filesystem to retain every stage without storing three physical copies. Hub uploads still contain complete standalone stage files.
49
+
50
+ By 17:07 KST the historical calibration SHA256 matched exactly and all 131 local evaluation configurations validated without Hub requests. Common dense teacher input/output collection completed, and the restored Fisher anchor passed exact common-prefix-input equality; new evaluation-only Local MSE is 30.159363496315123, normalized MSE 0.5497266315473979. Teacher input IDs SHA256 is `3f1977a32c7a533356dbc14d142c64b470e67dc9942344ff2942e3b1f8b9e2a1`, layer12 input SHA256 `57378a13b898fd63fc40d2c0ccb209ec5d5b636026accc93521b928669200250`, layer21 output SHA256 `8c246a6cca66306de3cd208e8ec8ef5df8eb9d3e3976f16ad34329cb1216ab40`.
51
+
52
+ By 17:08 KST all four two-stage smokes passed scope, exact data, zero-FiT and topology verification. All four nine-stage production processes started. Wa/Wb/Average cycles took about 8.1 seconds; MKA about 19 seconds including per-stage geometry. Inspected GPU memory remained below 40 GB. Remote test total is eight passing tests, including the explicit hard-link retry/storage check and existing compact regressions. Source provenance includes subsequent note/test-only commits `e6faf799` and `5546ad91`; merge implementation remains commit `c5846595`. Final four-arm metrics and Hub receipts are pending; do not report the existing Fisher Local MSE as a newly completed four-arm comparison.
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/abprune_compact.py ADDED
@@ -0,0 +1,284 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Package and reconstruct compact ABPrune stage checkpoints.
2
+
3
+ ABPrune already writes ``fused_layer.pt`` for every cycle. This utility makes
4
+ those files portable by pairing them with an explicit, immutable stage record;
5
+ the dense base model plus that record is sufficient to reconstruct a student.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse, hashlib, json, shutil
10
+ from pathlib import Path
11
+ from typing import Any
12
+
13
+ import torch
14
+
15
+
16
+ def copy_stage_state(src: Path, dst: Path, *, hard_link: bool = False) -> None:
17
+ """Optionally share immutable stage bytes within one experiment filesystem."""
18
+ if not hard_link:
19
+ shutil.copy2(src, dst)
20
+ elif dst.exists():
21
+ if not src.samefile(dst):
22
+ raise FileExistsError(f"Refusing to replace existing non-linked stage: {dst}")
23
+ else:
24
+ # Fail instead of silently consuming space if cross-device linking is
25
+ # unavailable. The caller explicitly selected the storage strategy.
26
+ dst.hardlink_to(src)
27
+
28
+
29
+ def sha256(path: Path) -> str:
30
+ h = hashlib.sha256()
31
+ with path.open("rb") as f:
32
+ for chunk in iter(lambda: f.read(8 * 1024 * 1024), b""):
33
+ h.update(chunk)
34
+ return h.hexdigest()
35
+
36
+
37
+ def post_merge_scale(source_cycle: Path) -> dict | None:
38
+ """Return the deployable post-merge scale stored for a cycle, if present."""
39
+ metadata_path = source_cycle / "cycle_metadata.json"
40
+ if not metadata_path.is_file():
41
+ return None
42
+ metadata = json.loads(metadata_path.read_text(encoding="utf-8"))
43
+ distill = metadata.get("distill", {})
44
+ scale = distill.get("post_merge_nll_scale") or {}
45
+ source = "post_merge_nll"
46
+ if not scale.get("enabled"):
47
+ scale = (distill.get("reparam_stats") or {}).get("residual_scale") or {}
48
+ source = "scale_aware_fit"
49
+ if not scale.get("enabled"):
50
+ return None
51
+ gamma = scale["gamma"]
52
+ cumulative_gamma = scale["cumulative_gamma"]
53
+ if not isinstance(gamma, list):
54
+ gamma = float(gamma)
55
+ else:
56
+ gamma = [float(value) for value in gamma]
57
+ if not isinstance(cumulative_gamma, list):
58
+ cumulative_gamma = float(cumulative_gamma)
59
+ else:
60
+ cumulative_gamma = [float(value) for value in cumulative_gamma]
61
+ result = {
62
+ "enabled": True,
63
+ "mode": scale.get("mode", "residual"),
64
+ "scale_parameterization": scale.get("scale_parameterization", "scalar"),
65
+ "gamma": gamma,
66
+ "cumulative_gamma": cumulative_gamma,
67
+ "source": source,
68
+ }
69
+ for field in (
70
+ "optimization_mode",
71
+ "gamma_gradient_sources",
72
+ "theta_gradient_sources",
73
+ "nll_used",
74
+ ):
75
+ if field in scale:
76
+ result[field] = scale[field]
77
+ if "cumulative_gamma_statistics" in scale:
78
+ result["cumulative_gamma_statistics"] = scale["cumulative_gamma_statistics"]
79
+ if "raw" in scale and "ppl" in scale["raw"]:
80
+ result["calibration_raw_ppl"] = float(scale["raw"]["ppl"])
81
+ if "fitted" in scale and "ppl" in scale["fitted"]:
82
+ result["calibration_fitted_ppl"] = float(scale["fitted"]["ppl"])
83
+ return result
84
+
85
+
86
+ def read_compact_metadata(compact_stage: Path) -> dict[str, Any]:
87
+ return json.loads((compact_stage / "metadata.json").read_text(encoding="utf-8"))
88
+
89
+
90
+ def compact_scale_targets(metadata: dict[str, Any]) -> list[dict[str, Any]]:
91
+ """Return residual scales and current student indices for a compact stage."""
92
+ if metadata.get("format") == "abprune_compact_stage_v2":
93
+ active = [int(value) for value in metadata["active_original_layers"]]
94
+ current_index = {original: index for index, original in enumerate(active)}
95
+ targets = []
96
+ for state in metadata.get("retained_layer_states", []):
97
+ scale = state.get("post_merge_scale") or {}
98
+ if scale.get("enabled") and scale.get("mode") == "residual":
99
+ original = int(state["original_layer"])
100
+ targets.append(
101
+ {
102
+ "original_layer": original,
103
+ "student_index": current_index[original],
104
+ "scale": scale,
105
+ }
106
+ )
107
+ return targets
108
+
109
+ scale = metadata.get("post_merge_scale") or {}
110
+ if scale.get("enabled") and scale.get("mode") == "residual":
111
+ return [
112
+ {
113
+ "original_layer": int(metadata["anchor_index"]),
114
+ "student_index": int(metadata["anchor_index"]),
115
+ "scale": scale,
116
+ }
117
+ ]
118
+ return []
119
+
120
+
121
+ def _package_topology_aware(args, source: Path, out: Path, order: list[int]) -> None:
122
+ """Package cycles whose recipients may switch between pair boundaries."""
123
+ if int(getattr(args, "start_cycle", 1)) != 1:
124
+ raise ValueError("topology-aware compact packaging must start at cycle 1")
125
+
126
+ removed: set[int] = set()
127
+ latest_states: dict[int, dict[str, Any]] = {}
128
+ stages: list[dict[str, Any]] = []
129
+ original_layer_count: int | None = None
130
+
131
+ for cycle in range(1, args.cycles + 1):
132
+ source_cycle = source / f"cycle_{cycle}"
133
+ src = source_cycle / "fused_layer.pt"
134
+ if not src.is_file():
135
+ raise FileNotFoundError(src)
136
+ cycle_metadata_path = source_cycle / "cycle_metadata.json"
137
+ if not cycle_metadata_path.is_file():
138
+ raise FileNotFoundError(cycle_metadata_path)
139
+ cycle_metadata = json.loads(cycle_metadata_path.read_text(encoding="utf-8"))
140
+ recipient = int(cycle_metadata["recipient_original_layer"])
141
+ removed_original = int(cycle_metadata["removed_original_layer"])
142
+ recipient_side = str(cycle_metadata["recipient_side"])
143
+ if recipient_side not in {"left", "right"}:
144
+ raise ValueError(f"invalid recipient_side at cycle {cycle}: {recipient_side}")
145
+ if original_layer_count is None:
146
+ original_layer_count = int(cycle_metadata["num_layers_before"])
147
+ if removed_original in removed:
148
+ raise ValueError(f"original layer {removed_original} removed more than once")
149
+ if recipient in removed:
150
+ raise ValueError(f"cycle {cycle} selects removed recipient {recipient}")
151
+
152
+ removed.add(removed_original)
153
+ latest_states.pop(removed_original, None)
154
+ latest_states[recipient] = {
155
+ "original_layer": recipient,
156
+ "source_cycle": cycle,
157
+ "recipient_side": recipient_side,
158
+ "source_state": src,
159
+ "post_merge_scale": post_merge_scale(source_cycle),
160
+ }
161
+
162
+ stage_dir = out / f"stage_{cycle:02d}"
163
+ stage_dir.mkdir(exist_ok=True)
164
+ retained_states = []
165
+ for original, record in sorted(latest_states.items()):
166
+ state_name = f"layer_original_{original:04d}.pt"
167
+ state_path = stage_dir / state_name
168
+ copy_stage_state(record["source_state"], state_path, hard_link=bool(getattr(args, "hard_link", False)))
169
+ packaged = {
170
+ "original_layer": original,
171
+ "state_file": state_name,
172
+ "sha256": sha256(state_path),
173
+ "source_cycle": int(record["source_cycle"]),
174
+ "recipient_side": record["recipient_side"],
175
+ }
176
+ if record["post_merge_scale"] is not None:
177
+ packaged["post_merge_scale"] = record["post_merge_scale"]
178
+ retained_states.append(packaged)
179
+
180
+ assert original_layer_count is not None
181
+ active = [
182
+ original
183
+ for original in range(original_layer_count)
184
+ if original not in removed
185
+ ]
186
+ meta = {
187
+ "format": "abprune_compact_stage_v2",
188
+ "model": args.model,
189
+ "base_model_revision": args.base_revision,
190
+ "run_id": args.run_id,
191
+ "target_prune_count": args.cycles,
192
+ "stage": cycle,
193
+ "removed_count": len(removed),
194
+ "original_layer_count": original_layer_count,
195
+ "layer_order": order,
196
+ "latest_pair_index": order[cycle - 1],
197
+ "latest_recipient_side": recipient_side,
198
+ "latest_recipient_original_layer": recipient,
199
+ "latest_removed_original_layer": removed_original,
200
+ "removed_original_layers": sorted(removed),
201
+ "active_original_layers": active,
202
+ "retained_layer_states": retained_states,
203
+ "source_cycle": f"cycle_{cycle}",
204
+ }
205
+ (stage_dir / "metadata.json").write_text(
206
+ json.dumps(meta, indent=2) + "\n", encoding="utf-8"
207
+ )
208
+ stages.append(meta)
209
+
210
+ manifest = {
211
+ "format": "abprune_compact_manifest_v2",
212
+ "model": args.model,
213
+ "base_model_revision": args.base_revision,
214
+ "run_id": args.run_id,
215
+ "target_prune_count": args.cycles,
216
+ "original_layer_count": original_layer_count,
217
+ "layer_order": order,
218
+ "stages": stages,
219
+ }
220
+ (out / "manifest.json").write_text(
221
+ json.dumps(manifest, indent=2) + "\n", encoding="utf-8"
222
+ )
223
+
224
+
225
+ def package(args):
226
+ source = Path(args.run_root); out = Path(args.output_root); out.mkdir(parents=True, exist_ok=True)
227
+ order = [int(x) for x in args.layer_order.replace(',', ' ').split()]
228
+ start_cycle = int(getattr(args, "start_cycle", 1))
229
+ expected_order = args.cycles - start_cycle + 1
230
+ if not 1 <= start_cycle <= args.cycles:
231
+ raise ValueError("start_cycle must be between 1 and cycles")
232
+ if len(order) != expected_order:
233
+ raise ValueError("layer_order length must equal cycles - start_cycle + 1")
234
+ first_metadata_path = source / f"cycle_{start_cycle}" / "cycle_metadata.json"
235
+ if first_metadata_path.is_file():
236
+ first_metadata = json.loads(first_metadata_path.read_text(encoding="utf-8"))
237
+ topology_fields = {
238
+ "recipient_side",
239
+ "recipient_original_layer",
240
+ "removed_original_layer",
241
+ }
242
+ if topology_fields.issubset(first_metadata):
243
+ _package_topology_aware(args, source, out, order)
244
+ return
245
+ stages = []
246
+ for cycle in range(start_cycle, args.cycles + 1):
247
+ order_index = cycle - start_cycle
248
+ source_cycle = source / f"cycle_{cycle}"
249
+ src = source_cycle / "fused_layer.pt"
250
+ if not src.exists(): raise FileNotFoundError(src)
251
+ dst_dir = out / f"stage_{cycle:02d}"; dst_dir.mkdir(exist_ok=True)
252
+ dst = dst_dir / "anchor_layer.pt"; copy_stage_state(src, dst, hard_link=bool(getattr(args, "hard_link", False)))
253
+ meta = {
254
+ "format": "abprune_compact_stage_v1", "model": args.model,
255
+ "base_model_revision": args.base_revision, "run_id": args.run_id,
256
+ "target_prune_count": args.cycles, "stage": cycle,
257
+ "removed_count": cycle, "anchor_index": order[order_index],
258
+ "layer_order": order,
259
+ "packaged_stage_range": [start_cycle, args.cycles],
260
+ "removed_original_layers": list(range(order[order_index] + 1, order[order_index] + cycle + 1)),
261
+ "source_cycle": f"cycle_{cycle}", "anchor_state_file": "anchor_layer.pt",
262
+ "sha256": sha256(dst),
263
+ }
264
+ scale = post_merge_scale(source_cycle)
265
+ if scale is not None:
266
+ meta["post_merge_scale"] = scale
267
+ (dst_dir / "metadata.json").write_text(json.dumps(meta, indent=2) + "\n", encoding="utf-8")
268
+ stages.append(meta)
269
+ manifest = {"format": "abprune_compact_manifest_v1", "model": args.model,
270
+ "base_model_revision": args.base_revision, "run_id": args.run_id,
271
+ "target_prune_count": args.cycles, "layer_order": order, "stages": stages}
272
+ (out / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n", encoding="utf-8")
273
+
274
+
275
+ def main():
276
+ p = argparse.ArgumentParser(); p.add_argument("--run-root", required=True); p.add_argument("--output-root", required=True)
277
+ p.add_argument("--model", required=True); p.add_argument("--base-revision", required=True); p.add_argument("--run-id", required=True)
278
+ p.add_argument("--cycles", type=int, required=True); p.add_argument("--layer-order", required=True)
279
+ p.add_argument("--start-cycle", type=int, default=1)
280
+ p.add_argument("--hard-link", action="store_true", help="Hard-link immutable stage weights on the same filesystem")
281
+ package(p.parse_args())
282
+
283
+
284
+ if __name__ == "__main__": main()
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/abprune_stagewise_geometry.py ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Stage-wise activation geometry diagnostics for progressive ABPrune runs.
2
+
3
+ The ABPrune checkpoints are treated as black-box students. The dense model is
4
+ the fixed teacher and boundaries are aligned by the original depth represented
5
+ by the fused anchor (rather than by student layer index).
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse, gc, json, math
10
+ from pathlib import Path
11
+ from typing import Dict, Iterable
12
+
13
+ import torch
14
+
15
+ from .abprune_compact import read_compact_metadata
16
+ from .abprune_recoverability import capture_module_output, load_model
17
+ from .span_diagnostics import build_token_chunks, find_layers, get_dtype
18
+
19
+
20
+ def _layer_container(model):
21
+ for path in ("model.layers", "model.decoder.layers", "transformer.h", "transformer.blocks", "gpt_neox.layers"):
22
+ parent = model
23
+ parts = path.split('.')
24
+ for part in parts[:-1]:
25
+ if not hasattr(parent, part): break
26
+ parent = getattr(parent, part)
27
+ else:
28
+ if hasattr(parent, parts[-1]):
29
+ container = getattr(parent, parts[-1])
30
+ if isinstance(container, torch.nn.ModuleList): return container
31
+ raise ValueError("Could not locate a mutable decoder layer ModuleList")
32
+
33
+
34
+ def _reindex_layer_modules(layers) -> None:
35
+ """Align cache-facing layer indices with the compact decoder positions."""
36
+ for index, layer in enumerate(layers):
37
+ for module in layer.modules():
38
+ if hasattr(module, "layer_idx"):
39
+ module.layer_idx = index
40
+
41
+
42
+ def load_compact_model(
43
+ base_ref: str,
44
+ compact_stage: Path,
45
+ *,
46
+ cycle: int | None,
47
+ anchor: int | None,
48
+ dtype: torch.dtype,
49
+ device: torch.device,
50
+ attn: str,
51
+ revision: str | None = None,
52
+ ):
53
+ """Reconstruct legacy single-anchor or topology-aware compact stages."""
54
+ model = load_model(base_ref, dtype=dtype, device=device, attn=attn, revision=revision)
55
+ container = _layer_container(model)
56
+ layers = list(container)
57
+ metadata = read_compact_metadata(compact_stage)
58
+ if metadata.get("format") == "abprune_compact_stage_v2":
59
+ if cycle is not None and int(metadata["stage"]) != int(cycle):
60
+ raise ValueError(
61
+ f"compact stage mismatch: metadata={metadata['stage']} requested={cycle}"
62
+ )
63
+ removed = {int(value) for value in metadata["removed_original_layers"]}
64
+ expected_active = [int(value) for value in metadata["active_original_layers"]]
65
+ active = [index for index in range(len(layers)) if index not in removed]
66
+ if active != expected_active:
67
+ raise ValueError(
68
+ f"compact topology mismatch: computed={active} metadata={expected_active}"
69
+ )
70
+ for entry in metadata["retained_layer_states"]:
71
+ original = int(entry["original_layer"])
72
+ state_path = compact_stage / entry["state_file"]
73
+ if not state_path.is_file():
74
+ raise FileNotFoundError(state_path)
75
+ state = torch.load(state_path, map_location="cpu", weights_only=True)
76
+ layers[original].load_state_dict(state, strict=True)
77
+ layers = [layers[index] for index in active]
78
+ else:
79
+ if cycle is None or anchor is None:
80
+ raise ValueError("legacy compact stages require cycle and anchor")
81
+ active = [
82
+ index
83
+ for index in range(len(layers))
84
+ if index not in range(anchor + 1, anchor + 1 + cycle)
85
+ ]
86
+ state = torch.load(
87
+ compact_stage / "anchor_layer.pt", map_location="cpu", weights_only=True
88
+ )
89
+ layers[anchor].load_state_dict(state, strict=True)
90
+ del layers[anchor + 1: anchor + 1 + cycle]
91
+ for idx in range(len(container) - 1, -1, -1):
92
+ del container[idx]
93
+ container.extend(layers)
94
+ _reindex_layer_modules(container)
95
+ if hasattr(model.config, "num_hidden_layers"):
96
+ model.config.num_hidden_layers = len(layers)
97
+ if getattr(model.config, "layer_types", None) is not None:
98
+ model.config.layer_types = [
99
+ model.config.layer_types[index] for index in active
100
+ ]
101
+ return model
102
+
103
+
104
+ def _metric(student: torch.Tensor, teacher: torch.Tensor, mask: torch.Tensor) -> Dict[str, float]:
105
+ s = student.float().squeeze(0)[mask]
106
+ t = teacher.float().squeeze(0)[mask]
107
+ denom = t.square().sum().item()
108
+ sden = s.square().sum().item()
109
+ dot = (s * t).sum().item()
110
+ sn = s.norm(dim=-1).clamp_min(1e-12)
111
+ tn = t.norm(dim=-1).clamp_min(1e-12)
112
+ alpha = dot / max(sden, 1e-30)
113
+ return {
114
+ "nmse": float((s - t).square().sum().item() / max(denom, 1e-30)),
115
+ "scaled_nmse": float((alpha * s - t).square().sum().item() / max(denom, 1e-30)),
116
+ "cosine": float(((s * t).sum(dim=-1) / (sn * tn)).mean().item()),
117
+ "norm_ratio": float((sn / tn).mean().item()),
118
+ "optimal_alpha": float(alpha),
119
+ "tokens": int(s.shape[0]),
120
+ }
121
+
122
+
123
+ def _teacher_cache(model, chunks, boundaries: Iterable[int], device):
124
+ wanted = sorted(set(boundaries))
125
+ cache = {b: [] for b in wanted}
126
+ layers = find_layers(model)
127
+ with torch.inference_mode():
128
+ for i, chunk in enumerate(chunks):
129
+ ids = chunk[None].to(device)
130
+ out = model(input_ids=ids, use_cache=False, output_hidden_states=True)
131
+ for b in wanted:
132
+ if b < 0 or b >= len(layers):
133
+ raise ValueError(f"invalid teacher boundary {b}")
134
+ cache[b].append(out.hidden_states[b + 1].detach().cpu().half())
135
+ final_hidden = getattr(out, "last_hidden_state", None)
136
+ if final_hidden is None:
137
+ final_hidden = out.hidden_states[-1]
138
+ cache.setdefault("final", []).append(final_hidden.detach().cpu().half())
139
+ if (i + 1) % 4 == 0 or i + 1 == len(chunks):
140
+ print(f"[stagewise] teacher {i+1}/{len(chunks)}", flush=True)
141
+ return cache
142
+
143
+
144
+ def _student_stage(model, chunks, teacher, *, anchor, original_end, device):
145
+ layers = find_layers(model)
146
+ if anchor >= len(layers):
147
+ raise ValueError(f"anchor {anchor} not present in {len(layers)} student layers")
148
+ local, final = [], []
149
+ target_local = teacher[original_end]
150
+ with torch.inference_mode():
151
+ for i, chunk in enumerate(chunks):
152
+ ids = chunk[None].to(device)
153
+ with capture_module_output(layers[anchor]) as hook:
154
+ out = model(input_ids=ids, use_cache=False, output_hidden_states=True)
155
+ local.append(hook["output"].cpu().half())
156
+ final_hidden = getattr(out, "last_hidden_state", None)
157
+ if final_hidden is None:
158
+ final_hidden = out.hidden_states[-1]
159
+ final.append(final_hidden.detach().cpu().half())
160
+ return local, final
161
+
162
+
163
+ def run(args):
164
+ device = torch.device(args.device)
165
+ dtype = get_dtype(args.dtype)
166
+ from transformers import AutoTokenizer
167
+ tok = AutoTokenizer.from_pretrained(args.model)
168
+ chunks = build_token_chunks(tok, dataset_name="Salesforce/wikitext", dataset_config="wikitext-2-raw-v1",
169
+ split="test", text_field="text", seq_len=args.seq_len, num_sequences=args.num_sequences, seed=args.seed)
170
+ if len(chunks) != args.num_sequences:
171
+ raise RuntimeError(f"only built {len(chunks)} held-out chunks")
172
+ teacher_model = load_model(args.model, dtype=dtype, device=device, attn=args.attn)
173
+ depth = len(find_layers(teacher_model))
174
+ stages = list(args.stages) if args.stages else list(range(1, args.cycles + 1))
175
+ if not stages or any(stage < 1 or stage > args.cycles for stage in stages):
176
+ raise ValueError("--stages must contain values in [1, --cycles]")
177
+ boundaries = [args.anchor + stage for stage in stages]
178
+ teacher = _teacher_cache(teacher_model, chunks, boundaries, device)
179
+ # ``final`` is cached alongside the requested original block boundaries.
180
+ del teacher_model; gc.collect(); torch.cuda.empty_cache()
181
+ rows = []
182
+ for cycle in stages:
183
+ if args.compact_root:
184
+ ref = Path(args.compact_root) / f"stage_{cycle:02d}"
185
+ if not (ref / "metadata.json").exists(): raise FileNotFoundError(ref)
186
+ student = load_compact_model(args.model, ref, cycle=cycle, anchor=args.anchor,
187
+ dtype=dtype, device=device, attn=args.attn)
188
+ else:
189
+ ref = Path(args.student_root) / f"cycle_{cycle}" / "full_model"
190
+ if not (ref / "config.json").exists(): raise FileNotFoundError(ref)
191
+ student = load_model(str(ref), dtype=dtype, device=device, attn=args.attn)
192
+ local, final = _student_stage(student, chunks, teacher, anchor=args.anchor,
193
+ original_end=args.anchor + cycle, device=device)
194
+ for pos0_excluded in (True, False):
195
+ local_acc = {k: [] for k in ("nmse", "scaled_nmse", "cosine", "norm_ratio", "optimal_alpha")}
196
+ final_acc = {k: [] for k in local_acc}
197
+ for i in range(len(chunks)):
198
+ mask = torch.ones((args.seq_len,), dtype=torch.bool)
199
+ if pos0_excluded: mask[0] = False
200
+ lm = _metric(local[i], teacher[args.anchor + cycle][i], mask)
201
+ fm = _metric(final[i], teacher["final"][i], mask)
202
+ for k in local_acc: local_acc[k].append(lm[k]); final_acc[k].append(fm[k])
203
+ rows.append({"model": args.model, "target_prune_count": args.cycles, "stage": cycle,
204
+ "removed_count": cycle, "anchor": args.anchor, "merged_original_layers": list(range(args.anchor, args.anchor + cycle + 1)),
205
+ "teacher_boundary_index": args.anchor + cycle, "student_layer_index": args.anchor,
206
+ "position0_excluded": pos0_excluded,
207
+ "local": {k: float(sum(v)/len(v)) for k,v in local_acc.items()},
208
+ "final": {k: float(sum(v)/len(v)) for k,v in final_acc.items()},
209
+ "num_sequences": len(chunks), "seq_len": args.seq_len, "seed": args.seed})
210
+ print(f"[stagewise] completed cycle {cycle}/{args.cycles}", flush=True)
211
+ del student; gc.collect(); torch.cuda.empty_cache()
212
+ out = Path(args.output); out.parent.mkdir(parents=True, exist_ok=True)
213
+ out.write_text(json.dumps({"model": args.model, "anchor": args.anchor, "cycles": args.cycles, "rows": rows}, indent=2) + "\n")
214
+
215
+
216
+ def main():
217
+ p = argparse.ArgumentParser()
218
+ p.add_argument("--model", required=True); p.add_argument("--student-root", required=True); p.add_argument("--anchor", type=int, required=True)
219
+ p.add_argument("--cycles", type=int, required=True); p.add_argument("--output", required=True)
220
+ p.add_argument("--stages", type=int, nargs="*", default=None,
221
+ help="Optional subset of compact stages to analyze (default: every stage)")
222
+ p.add_argument("--compact-root", default=None, help="stage_XX/anchor_layer.pt package; overrides --student-root")
223
+ p.add_argument("--device", default="cuda"); p.add_argument("--dtype", default="bf16"); p.add_argument("--attn", default="eager")
224
+ p.add_argument("--num-sequences", type=int, default=16); p.add_argument("--seq-len", type=int, default=512); p.add_argument("--seed", type=int, default=12345)
225
+ args = p.parse_args(); run(args)
226
+
227
+ if __name__ == "__main__": main()
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/aggregate_transport_rho_fit_14bench.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Combine the OpenCompass-five and lm-eval-nine evaluation reports."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ from pathlib import Path
9
+
10
+
11
+ OPENCOMPASS_KEYS = {
12
+ "race_high": "race-high",
13
+ "race_middle": "race-middle",
14
+ "c3": "C3",
15
+ "cmnli": "cmnli",
16
+ "chid": "chid-dev",
17
+ }
18
+ LM_EVAL_KEYS = {
19
+ "piqa",
20
+ "winogrande",
21
+ "hellaswag",
22
+ "arc_challenge",
23
+ "arc_easy",
24
+ "openbookqa",
25
+ "sciq",
26
+ "mmlu",
27
+ "cmmlu",
28
+ }
29
+
30
+
31
+ def main() -> None:
32
+ parser = argparse.ArgumentParser()
33
+ parser.add_argument("run_root", type=Path)
34
+ args = parser.parse_args()
35
+
36
+ eval_dir = args.run_root / "eval"
37
+ opencompass = json.loads(
38
+ (eval_dir / "final_opencompass5.json").read_text(encoding="utf-8")
39
+ )
40
+ lm_eval = json.loads(
41
+ (eval_dir / "final_lmeval9.json").read_text(encoding="utf-8")
42
+ )
43
+ if set(lm_eval["task_scores"]) != LM_EVAL_KEYS:
44
+ raise RuntimeError(
45
+ f"unexpected lm-eval tasks: {sorted(lm_eval['task_scores'])}"
46
+ )
47
+
48
+ scores = {
49
+ name: opencompass["results"][source]["accuracy"]
50
+ for name, source in OPENCOMPASS_KEYS.items()
51
+ }
52
+ scores.update(lm_eval["task_scores"])
53
+ if len(scores) != 14 or any(not 0.0 <= float(value) <= 1.0 for value in scores.values()):
54
+ raise RuntimeError(f"invalid 14-task score set: {scores}")
55
+
56
+ report = {
57
+ "task_scores": scores,
58
+ "macro_mean_14": sum(scores.values()) / len(scores),
59
+ "tasks": list(scores),
60
+ "opencompass_protocol": opencompass["protocol"],
61
+ "lm_eval_num_fewshot": lm_eval["num_fewshot"],
62
+ }
63
+ output = eval_dir / "final_14bench.json"
64
+ output.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
65
+ (args.run_root / "BENCH14_COMPLETE").touch()
66
+ print(json.dumps(report, indent=2))
67
+
68
+
69
+ if __name__ == "__main__":
70
+ main()
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/bootstrap_qwen3_nofit_bench8.sh ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ project="$1"; root="$2"; model="$3"
4
+ export HF_HOME=/workspace/.hf_home HF_TOKEN_PATH=/root/.cache/huggingface/token
5
+ export HF_DATASETS_CACHE=/workspace/.hf_datasets36 PYTHONUNBUFFERED=1 OMP_NUM_THREADS=4
6
+ mkdir -p "$root"
7
+ trap 'rc=$?; if ((rc)); then touch "$root/BOOTSTRAP_FAILED"; fi' EXIT
8
+ python -m pip install 'transformers==5.15.1' 'datasets==3.6.0' 'huggingface_hub==1.33.0' \
9
+ 'lm_eval==0.4.12' accelerate scipy sentencepiece protobuf
10
+ python - "$root" "$model" <<'PY'
11
+ from concurrent.futures import ThreadPoolExecutor
12
+ from huggingface_hub import snapshot_download,hf_hub_download
13
+ from pathlib import Path
14
+ import hashlib,json,shutil,sys
15
+ r=Path(sys.argv[1])
16
+ prefix='runs/vast-paper_revision-qwen3-base-nofit-transport-zs6-54974094-20261009/20261009-qwen3-base-nofit-transport-zs6'
17
+ pins={'off':'71252a138f0f97349f29c743206160b77e45899e','on':'b2a437466b134a6311d3ab625b0b37f9aa1a96d6'}
18
+ def base():
19
+ return snapshot_download('Qwen/Qwen3-8B-Base',revision='49e3418fbbbca6ecbdf9608b4d22e5a407081db4',
20
+ local_dir=sys.argv[2],allow_patterns=['*.json','*.safetensors','tokenizer*','*.model','*.jinja'],max_workers=8)
21
+ def restore(arm):
22
+ rev=pins[arm]; path=f'{prefix}/{arm}'
23
+ manifest=json.loads(Path(hf_hub_download('LJYAI/paper_revision',f'{path}/manifest.json',revision=rev)).read_text())
24
+ out=r/'full'/arm; restored=[]
25
+ for item in manifest['files']:
26
+ rel=item['path']
27
+ if not (rel.startswith('compact/stage_09/') or rel=='eval/zs6.json'): continue
28
+ src=Path(hf_hub_download('LJYAI/paper_revision',f'{path}/{rel}',revision=rev))
29
+ assert src.stat().st_size==item['size']
30
+ assert hashlib.sha256(src.read_bytes()).hexdigest()==item['sha256']
31
+ dst=out/rel;dst.parent.mkdir(parents=True,exist_ok=True);shutil.copy2(src,dst);restored.append(item)
32
+ meta=json.loads((out/'compact/stage_09/metadata.json').read_text())
33
+ assert meta['anchor_index']==12 and meta['removed_original_layers']==list(range(13,22))
34
+ assert meta['stage']==9 and meta['format']=='abprune_compact_stage_v1'
35
+ assert (out/'eval/zs6.json').is_file() and len(list((out/'compact/stage_09').glob('*.pt')))==1
36
+ receipt={'arm':arm,'repository':'LJYAI/paper_revision','path':path,'revision':rev,
37
+ 'restored_files':restored,'all_restored_hashes_match':True}
38
+ (out/'restore_receipt.json').write_text(json.dumps(receipt,indent=2)+'\n')
39
+ return receipt
40
+ with ThreadPoolExecutor(max_workers=3) as p:
41
+ futures=[p.submit(base),p.submit(restore,'off'),p.submit(restore,'on')]
42
+ for f in futures: print('PINNED_INPUT_READY',f.result(),flush=True)
43
+ (r/'BASE_READY').touch()
44
+ PY
45
+ while [[ ! -f "$root/EVAL_ASSETS_READY" ]]; do sleep 3; done
46
+ python - "$root" <<'PY'
47
+ from pathlib import Path
48
+ import hashlib,sys
49
+ r=Path(sys.argv[1])
50
+ for name,expected in [('opencompass5-data.tar.gz','b49605cc272cee94ddc177d2350e06d70f0f610926a2abf20c8ccd35ad8cd353'),
51
+ ('lmeval-cache-131.tar.gz','e5a319ed00b52181df3d80e47e4939e78fddd393803c29a9bcb63c2dd8a6d468')]:
52
+ assert hashlib.sha256((r/name).read_bytes()).hexdigest()==expected
53
+ print('EVALUATION_ARCHIVE_HASHES_VERIFIED',flush=True)
54
+ PY
55
+ mkdir -p "$root/eval_data"
56
+ tar -xzf "$root/opencompass5-data.tar.gz" -C "$root/eval_data"
57
+ tar -xzf "$root/lmeval-cache-131.tar.gz" -C "$root"
58
+ HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 python "$project/scripts/prepare_lmeval9_local_cache.py" "$root/lmeval_cache" --validate-local
59
+ touch "$root/EVAL_READY" "$root/BOOTSTRAP_COMPLETE"
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/bootstrap_qwen3_nofit_merge4.sh ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ project="$1"; external="$2"; root="$3"; model="$4"
4
+ export HF_HOME=/workspace/.hf_home HF_TOKEN_PATH=/root/.cache/huggingface/token
5
+ export HF_DATASETS_CACHE=/workspace/.hf_datasets36 PYTHONUNBUFFERED=1
6
+ export PYTHONPATH="$external/src:$project/src:$project" TOKENIZERS_PARALLELISM=false OMP_NUM_THREADS=4
7
+ mkdir -p "$root"
8
+ trap 'rc=$?; if ((rc)); then touch "$root/BOOTSTRAP_FAILED"; fi' EXIT
9
+ # Pinned engine + dense model + the original non-streaming SlimPajama cache.
10
+ # One download/cache preparation is shared by all four GPU workers.
11
+ bash "$project/scripts/bootstrap_qwen3_8b_mergeinit_fit2.sh" "$project" "$external" "$root" "$model"
12
+ python -m pytest -q "$project/tests/test_nofit_merge_control.py" > "$root/unit_tests.log" 2>&1
13
+ python "$project/scripts/prepare_qwen3_nofit_merge_inputs.py" --external-root "$external" \
14
+ --model "$model" --output "$root/inputs" > "$root/data_prepare.log" 2>&1
15
+ touch "$root/DATA_READY"
16
+ python - "$root" <<'PY'
17
+ from pathlib import Path
18
+ from huggingface_hub import hf_hub_download
19
+ from datasets import load_dataset
20
+ import hashlib,json,shutil,sys
21
+ r=Path(sys.argv[1]); prefix='runs/vast-paper_revision-qwen3-base-nofit-transport-zs6-54974094-20261009/20261009-qwen3-base-nofit-transport-zs6/on'
22
+ revision='b2a437466b134a6311d3ab625b0b37f9aa1a96d6'
23
+ manifest=json.loads(Path(hf_hub_download('LJYAI/paper_revision',prefix+'/manifest.json',revision=revision)).read_text())
24
+ restored=[]
25
+ for item in manifest['files']:
26
+ if not item['path'].startswith('compact/stage_09/'): continue
27
+ src=Path(hf_hub_download('LJYAI/paper_revision',prefix+'/'+item['path'],revision=revision))
28
+ assert src.stat().st_size==item['size'] and hashlib.sha256(src.read_bytes()).hexdigest()==item['sha256']
29
+ dst=r/'fisher_reference'/item['path'];dst.parent.mkdir(parents=True,exist_ok=True);shutil.copy2(src,dst);restored.append(item)
30
+ assert len(restored)==2
31
+ (r/'fisher_reference/restore_receipt.json').write_text(json.dumps(dict(repo='LJYAI/paper_revision',path=prefix,revision=revision,files=restored,verified=True),indent=2)+'\n')
32
+ load_dataset('Salesforce/wikitext','wikitext-2-raw-v1')
33
+ PY
34
+ python "$project/scripts/prepare_offline_ppl_cache.py" "$root"
35
+ while [[ ! -f "$root/EVAL_ASSETS_READY" ]]; do sleep 3; done
36
+ python - "$root" <<'PY'
37
+ import hashlib,sys
38
+ from pathlib import Path
39
+ r=Path(sys.argv[1])
40
+ for name,h in [('opencompass5-data.tar.gz','b49605cc272cee94ddc177d2350e06d70f0f610926a2abf20c8ccd35ad8cd353'),('lmeval-cache-131.tar.gz','e5a319ed00b52181df3d80e47e4939e78fddd393803c29a9bcb63c2dd8a6d468')]:
41
+ assert hashlib.sha256((r/name).read_bytes()).hexdigest()==h
42
+ PY
43
+ mkdir -p "$root/eval_data"
44
+ tar -xzf "$root/opencompass5-data.tar.gz" -C "$root/eval_data"
45
+ tar -xzf "$root/lmeval-cache-131.tar.gz" -C "$root"
46
+ HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 python "$project/scripts/prepare_lmeval9_local_cache.py" "$root/lmeval_cache" --validate-local
47
+ touch "$root/EVAL_READY"
48
+ CUDA_VISIBLE_DEVICES=0 HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
49
+ python "$project/scripts/qwen3_nofit_local_mse.py" --model "$model" --cache "$root/local_mse_reference" \
50
+ --wikitext-cache "$root/wikitext2_cache" --prepare > "$root/local_mse_prepare.log" 2>&1
51
+ touch "$root/COMMON_TEACHER_READY"
52
+ CUDA_VISIBLE_DEVICES=0 HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
53
+ python "$project/scripts/qwen3_nofit_local_mse.py" --model "$model" --cache "$root/local_mse_reference" \
54
+ --compact-stage "$root/fisher_reference/compact/stage_09" --output "$root/fisher_reference/local_mse.json" > "$root/fisher_mse.log" 2>&1
55
+ touch "$root/INPUTS_READY"
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/common_lm_data.py ADDED
@@ -0,0 +1,651 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Shared LM dataset helpers for fair cross-method comparisons."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import dataclass
7
+ from typing import Dict, Iterable, Iterator, List, Optional, Tuple
8
+
9
+ import torch
10
+
11
+ from dm500_rows import configured_indices, dataset_revision_kwargs, select_exact_rows
12
+
13
+ try:
14
+ from datasets import load_dataset
15
+ from datasets import Dataset as HFDataset
16
+ except Exception: # pragma: no cover - optional dependency
17
+ load_dataset = None
18
+ HFDataset = None
19
+
20
+
21
+ def _normalize_config(config: Optional[str]) -> Optional[str]:
22
+ if config is None:
23
+ return None
24
+ if config.strip().lower() in {"none", "null", "-"}:
25
+ return None
26
+ return config
27
+
28
+
29
+ def guess_text_field(dataset) -> str:
30
+ if hasattr(dataset, "column_names") and dataset.column_names:
31
+ if "text" in dataset.column_names:
32
+ return "text"
33
+ return dataset.column_names[0]
34
+ if hasattr(dataset, "features"):
35
+ names = list(dataset.features.keys())
36
+ if "text" in names:
37
+ return "text"
38
+ if names:
39
+ return names[0]
40
+ return "text"
41
+
42
+
43
+ def normalize_dataset_name(name: str) -> str:
44
+ normalized = name.strip().lower()
45
+ aliases = {
46
+ "bookcorpus": "bookcorpus",
47
+ "boockcorpus": "bookcorpus",
48
+ "slimpajama": "slimpajama",
49
+ "dkyoon/slimpajama-6b": "slimpajama",
50
+ "slimorca": "slimorca",
51
+ "orca": "slimorca",
52
+ "open-orca/slimorca": "slimorca",
53
+ "fineweb": "fineweb",
54
+ "huggingfacefw/fineweb": "fineweb",
55
+ }
56
+ if normalized not in aliases:
57
+ raise ValueError(f"Unsupported dataset: {name}")
58
+ return aliases[normalized]
59
+
60
+
61
+ def resolve_dataset_spec(
62
+ name: str,
63
+ config: Optional[str] = None,
64
+ split: str = "train",
65
+ ) -> Tuple[str, Optional[str], str]:
66
+ normalized = normalize_dataset_name(name)
67
+ if normalized == "bookcorpus":
68
+ return "bookcorpus", _normalize_config(config), split
69
+ if normalized == "slimpajama":
70
+ return "DKYoon/SlimPajama-6B", _normalize_config(config), split
71
+ if normalized == "slimorca":
72
+ return "Open-Orca/SlimOrca", _normalize_config(config), split
73
+ if normalized == "fineweb":
74
+ return "HuggingFaceFW/fineweb", _normalize_config(config), split
75
+ raise ValueError(f"Unsupported dataset: {name}")
76
+
77
+
78
+ def is_instruction_dataset(name: str) -> bool:
79
+ return normalize_dataset_name(name) == "slimorca"
80
+
81
+
82
+ def should_stream_dataset(name: str) -> bool:
83
+ return normalize_dataset_name(name) == "fineweb"
84
+
85
+
86
+ def load_resolved_dataset(
87
+ dataset_name: str,
88
+ hf_name: str,
89
+ hf_config: Optional[str],
90
+ hf_split: str,
91
+ ):
92
+ kwargs = {
93
+ "split": hf_split,
94
+ **dataset_revision_kwargs(),
95
+ }
96
+ if should_stream_dataset(dataset_name):
97
+ kwargs["streaming"] = True
98
+ return load_dataset(hf_name, hf_config, **kwargs)
99
+
100
+
101
+ def _build_messages_text(messages: List[Dict[str, str]]) -> str:
102
+ chunks: List[str] = []
103
+ for message in messages:
104
+ role = str(message.get("role", "")).strip().title() or "User"
105
+ content = str(message.get("content", "")).strip()
106
+ if content:
107
+ chunks.append(f"{role}: {content}")
108
+ return "\n\n".join(chunks)
109
+
110
+
111
+ def _build_slimorca_text(row: Dict[str, object]) -> Optional[str]:
112
+ conversations = row.get("conversations")
113
+ if not isinstance(conversations, list) or len(conversations) < 2:
114
+ return None
115
+
116
+ start_idx = 0
117
+ if str(conversations[0].get("from", "")).strip().lower() != "human":
118
+ start_idx = 1
119
+ if start_idx + 1 >= len(conversations):
120
+ return None
121
+
122
+ user_turn = conversations[start_idx]
123
+ assistant_turn = conversations[start_idx + 1]
124
+ if (
125
+ str(user_turn.get("from", "")).strip().lower() != "human"
126
+ or str(assistant_turn.get("from", "")).strip().lower() != "gpt"
127
+ ):
128
+ return None
129
+
130
+ user_content = str(user_turn.get("value", "")).strip()
131
+ assistant_content = str(assistant_turn.get("value", "")).strip()
132
+ if not user_content or not assistant_content:
133
+ return None
134
+
135
+ messages = [
136
+ {"role": "user", "content": user_content},
137
+ {"role": "assistant", "content": assistant_content},
138
+ ]
139
+ return _build_messages_text(messages)
140
+
141
+
142
+ def _build_slimorca_record(row: Dict[str, object]) -> Optional[Dict[str, object]]:
143
+ conversations = row.get("conversations")
144
+ if not isinstance(conversations, list) or len(conversations) < 2:
145
+ return None
146
+
147
+ start_idx = 0
148
+ if str(conversations[0].get("from", "")).strip().lower() != "human":
149
+ start_idx = 1
150
+ if start_idx + 1 >= len(conversations):
151
+ return None
152
+
153
+ user_turn = conversations[start_idx]
154
+ assistant_turn = conversations[start_idx + 1]
155
+ if (
156
+ str(user_turn.get("from", "")).strip().lower() != "human"
157
+ or str(assistant_turn.get("from", "")).strip().lower() != "gpt"
158
+ ):
159
+ return None
160
+
161
+ user_content = str(user_turn.get("value", "")).strip()
162
+ assistant_content = str(assistant_turn.get("value", "")).strip()
163
+ if not user_content or not assistant_content:
164
+ return None
165
+
166
+ messages = [
167
+ {"role": "user", "content": user_content},
168
+ {"role": "assistant", "content": assistant_content},
169
+ ]
170
+ return {"messages": messages, "text": _build_messages_text(messages)}
171
+
172
+
173
+ def _tokenize_instruction_record(record: Dict[str, object], tokenizer) -> List[int]:
174
+ chat_template = getattr(tokenizer, "chat_template", None)
175
+ if (
176
+ "messages" in record
177
+ and hasattr(tokenizer, "apply_chat_template")
178
+ and chat_template
179
+ ):
180
+ ids = tokenizer.apply_chat_template(
181
+ record["messages"],
182
+ tokenize=True,
183
+ add_generation_prompt=False,
184
+ )
185
+ else:
186
+ ids = tokenizer.encode(str(record.get("text", "")), add_special_tokens=False)
187
+
188
+ if hasattr(ids, "input_ids"):
189
+ ids = ids.input_ids
190
+ if isinstance(ids, torch.Tensor):
191
+ return ids.tolist()
192
+ if isinstance(ids, list):
193
+ return ids
194
+ return list(ids)
195
+
196
+
197
+ def _round_up_to_multiple(value: int, multiple: int) -> int:
198
+ if multiple <= 1:
199
+ return value
200
+ return ((value + multiple - 1) // multiple) * multiple
201
+
202
+
203
+ def _sample_dataset_rows(dataset, target: int, seed: int) -> List[Dict[str, object]]:
204
+ if target <= 0:
205
+ return []
206
+ exact = select_exact_rows(dataset, target)
207
+ if exact is not None:
208
+ return [row for row in exact]
209
+ try:
210
+ dataset = dataset.shuffle(seed=seed)
211
+ except Exception:
212
+ pass
213
+
214
+ if hasattr(dataset, "__len__"):
215
+ limit = min(target, len(dataset))
216
+ dataset = dataset.select(range(limit))
217
+ return [row for row in dataset]
218
+
219
+ rows = []
220
+ for row in dataset:
221
+ rows.append(row)
222
+ if len(rows) >= target:
223
+ break
224
+ return rows
225
+
226
+
227
+ def _iter_dataset_rows(dataset, seed: int) -> Iterator[Dict[str, object]]:
228
+ exact = select_exact_rows(dataset)
229
+ if exact is not None:
230
+ for row in exact:
231
+ yield row
232
+ return
233
+ try:
234
+ dataset = dataset.shuffle(seed=seed)
235
+ except Exception:
236
+ pass
237
+ for row in dataset:
238
+ yield row
239
+
240
+
241
+ def load_named_texts(
242
+ dataset_name: str,
243
+ *,
244
+ config: Optional[str] = None,
245
+ split: str = "train",
246
+ text_field: Optional[str] = None,
247
+ num_samples: int = 0,
248
+ seed: int = 0,
249
+ ) -> List[str]:
250
+ if load_dataset is None:
251
+ raise SystemExit("datasets is required for shared LM dataloaders")
252
+
253
+ hf_name, hf_config, hf_split = resolve_dataset_spec(dataset_name, config, split)
254
+ dataset = load_resolved_dataset(dataset_name, hf_name, hf_config, hf_split)
255
+ rows = dataset if num_samples <= 0 else _sample_dataset_rows(dataset, num_samples, seed)
256
+ field = text_field or guess_text_field(dataset)
257
+
258
+ texts: List[str] = []
259
+ for row in rows:
260
+ if not isinstance(row, dict):
261
+ continue
262
+ if is_instruction_dataset(dataset_name):
263
+ value = _build_slimorca_text(row)
264
+ else:
265
+ value = row.get(field, None)
266
+ if isinstance(value, str) and value.strip():
267
+ texts.append(value)
268
+ return texts
269
+
270
+
271
+ def build_token_chunks_from_rows(
272
+ rows: Iterable[Dict[str, object]],
273
+ *,
274
+ dataset_name: Optional[str] = None,
275
+ text_field: str,
276
+ tokenizer,
277
+ seq_len: int,
278
+ num_sequences: int = 0,
279
+ add_bos: bool = False,
280
+ max_rows: int = 0,
281
+ ) -> List[torch.Tensor]:
282
+ chunks: List[torch.Tensor] = []
283
+ buffer: List[int] = []
284
+ limit = None if num_sequences <= 0 else num_sequences
285
+ rows_seen = 0
286
+
287
+ for row in rows:
288
+ if max_rows > 0 and rows_seen >= max_rows:
289
+ break
290
+ rows_seen += 1
291
+
292
+ if not isinstance(row, dict):
293
+ continue
294
+ if dataset_name is not None and is_instruction_dataset(dataset_name):
295
+ value = _build_slimorca_text(row)
296
+ else:
297
+ value = row.get(text_field, None)
298
+ if not isinstance(value, str) or not value.strip():
299
+ continue
300
+
301
+ ids = tokenizer.encode(value, add_special_tokens=False)
302
+ if add_bos and tokenizer.bos_token_id is not None:
303
+ ids = [tokenizer.bos_token_id] + ids
304
+ if not ids:
305
+ continue
306
+
307
+ buffer.extend(ids)
308
+ while len(buffer) >= seq_len and (limit is None or len(chunks) < limit):
309
+ chunk = buffer[:seq_len]
310
+ buffer = buffer[seq_len:]
311
+ chunks.append(torch.tensor(chunk, dtype=torch.long))
312
+ if limit is not None and len(chunks) >= limit:
313
+ break
314
+
315
+ return chunks
316
+
317
+
318
+ def collect_texts_from_rows(
319
+ rows: Iterable[Dict[str, object]],
320
+ *,
321
+ dataset_name: Optional[str] = None,
322
+ text_field: str,
323
+ tokenizer,
324
+ target_tokens: int = 0,
325
+ add_bos: bool = False,
326
+ max_rows: int = 0,
327
+ ) -> List[str]:
328
+ texts: List[str] = []
329
+ token_count = 0
330
+ rows_seen = 0
331
+
332
+ for row in rows:
333
+ if max_rows > 0 and rows_seen >= max_rows:
334
+ break
335
+ rows_seen += 1
336
+
337
+ if not isinstance(row, dict):
338
+ continue
339
+ if dataset_name is not None and is_instruction_dataset(dataset_name):
340
+ value = _build_slimorca_text(row)
341
+ else:
342
+ value = row.get(text_field, None)
343
+ if not isinstance(value, str) or not value.strip():
344
+ continue
345
+
346
+ texts.append(value)
347
+ if target_tokens > 0:
348
+ ids = tokenizer.encode(value, add_special_tokens=False)
349
+ if add_bos and tokenizer.bos_token_id is not None:
350
+ ids = [tokenizer.bos_token_id] + ids
351
+ token_count += len(ids)
352
+ if token_count >= target_tokens:
353
+ break
354
+
355
+ return texts
356
+
357
+
358
+ def build_token_chunks(
359
+ texts: Iterable[str],
360
+ tokenizer,
361
+ seq_len: int,
362
+ num_sequences: int = 0,
363
+ add_bos: bool = False,
364
+ ) -> List[torch.Tensor]:
365
+ chunks: List[torch.Tensor] = []
366
+ buffer: List[int] = []
367
+ limit = None if num_sequences <= 0 else num_sequences
368
+
369
+ for text in texts:
370
+ ids = tokenizer.encode(text, add_special_tokens=False)
371
+ if add_bos and tokenizer.bos_token_id is not None:
372
+ ids = [tokenizer.bos_token_id] + ids
373
+ if not ids:
374
+ continue
375
+
376
+ buffer.extend(ids)
377
+ while len(buffer) >= seq_len and (limit is None or len(chunks) < limit):
378
+ chunk = buffer[:seq_len]
379
+ buffer = buffer[seq_len:]
380
+ chunks.append(torch.tensor(chunk, dtype=torch.long))
381
+ if limit is not None and len(chunks) >= limit:
382
+ break
383
+
384
+ return chunks
385
+
386
+
387
+ class TokenChunkDataset(torch.utils.data.Dataset):
388
+ def __init__(self, chunks: List[torch.Tensor]) -> None:
389
+ self.chunks = chunks
390
+
391
+ def __len__(self) -> int:
392
+ return len(self.chunks)
393
+
394
+ def __getitem__(self, idx: int) -> Dict[str, torch.Tensor]:
395
+ input_ids = self.chunks[idx]
396
+ attention_mask = torch.ones_like(input_ids)
397
+ return {
398
+ "input_ids": input_ids,
399
+ "attention_mask": attention_mask,
400
+ "labels": input_ids.clone(),
401
+ }
402
+
403
+
404
+ class TokenOnlyDataset(torch.utils.data.Dataset):
405
+ def __init__(self, chunks: List[torch.Tensor]) -> None:
406
+ self.chunks = chunks
407
+
408
+ def __len__(self) -> int:
409
+ return len(self.chunks)
410
+
411
+ def __getitem__(self, idx: int) -> torch.Tensor:
412
+ return self.chunks[idx]
413
+
414
+
415
+ class TokenInputMaskDataset(torch.utils.data.Dataset):
416
+ def __init__(self, chunks: List[torch.Tensor]) -> None:
417
+ self.chunks = chunks
418
+
419
+ def __len__(self) -> int:
420
+ return len(self.chunks)
421
+
422
+ def __getitem__(self, idx: int) -> Dict[str, torch.Tensor]:
423
+ input_ids = self.chunks[idx]
424
+ return {
425
+ "input_ids": input_ids,
426
+ "attention_mask": torch.ones_like(input_ids),
427
+ }
428
+
429
+
430
+ @dataclass
431
+ class SharedLMDataSpec:
432
+ dataset: str
433
+ config: Optional[str] = None
434
+ split: str = "train"
435
+ text_field: Optional[str] = None
436
+ num_samples: int = 0
437
+ seq_len: int = 2048
438
+ num_sequences: int = 0
439
+ target_tokens: int = 0
440
+ batch_size: int = 1
441
+ shuffle: bool = False
442
+ num_workers: int = 0
443
+ seed: int = 0
444
+ add_bos: bool = False
445
+
446
+
447
+ def build_chunks(spec: SharedLMDataSpec, tokenizer) -> List[torch.Tensor]:
448
+ if load_dataset is None:
449
+ raise SystemExit("datasets is required for shared LM dataloaders")
450
+
451
+ hf_name, hf_config, hf_split = resolve_dataset_spec(spec.dataset, spec.config, spec.split)
452
+ dataset = load_resolved_dataset(spec.dataset, hf_name, hf_config, hf_split)
453
+
454
+ target_sequences = spec.num_sequences
455
+ if spec.target_tokens > 0:
456
+ token_sequences = (spec.target_tokens + spec.seq_len - 1) // spec.seq_len
457
+ target_sequences = max(target_sequences, token_sequences)
458
+ row_limit = spec.num_samples if target_sequences <= 0 else 0
459
+
460
+ rows = _iter_dataset_rows(dataset, spec.seed)
461
+ text_field = spec.text_field or guess_text_field(dataset)
462
+ chunks = build_token_chunks_from_rows(
463
+ rows,
464
+ dataset_name=spec.dataset,
465
+ text_field=text_field,
466
+ tokenizer=tokenizer,
467
+ seq_len=spec.seq_len,
468
+ num_sequences=target_sequences,
469
+ add_bos=spec.add_bos,
470
+ max_rows=row_limit,
471
+ )
472
+ return chunks
473
+
474
+
475
+ def build_dataloader(spec: SharedLMDataSpec, tokenizer) -> torch.utils.data.DataLoader:
476
+ chunks = build_chunks(spec, tokenizer)
477
+ dataset = TokenChunkDataset(chunks)
478
+ return torch.utils.data.DataLoader(
479
+ dataset,
480
+ batch_size=spec.batch_size,
481
+ shuffle=spec.shuffle,
482
+ num_workers=spec.num_workers,
483
+ )
484
+
485
+
486
+ def build_text_dataloader(spec: SharedLMDataSpec, tokenizer) -> torch.utils.data.DataLoader:
487
+ if load_dataset is None:
488
+ raise SystemExit("datasets is required for shared LM dataloaders")
489
+
490
+ hf_name, hf_config, hf_split = resolve_dataset_spec(spec.dataset, spec.config, spec.split)
491
+ dataset = load_resolved_dataset(spec.dataset, hf_name, hf_config, hf_split)
492
+ rows = _iter_dataset_rows(dataset, spec.seed)
493
+ text_field = spec.text_field or guess_text_field(dataset)
494
+ row_limit = spec.num_samples
495
+ texts = collect_texts_from_rows(
496
+ rows,
497
+ dataset_name=spec.dataset,
498
+ text_field=text_field,
499
+ tokenizer=tokenizer,
500
+ target_tokens=spec.target_tokens,
501
+ add_bos=spec.add_bos,
502
+ max_rows=row_limit,
503
+ )
504
+ return torch.utils.data.DataLoader(
505
+ texts,
506
+ batch_size=spec.batch_size,
507
+ shuffle=spec.shuffle,
508
+ num_workers=spec.num_workers,
509
+ drop_last=True,
510
+ )
511
+
512
+
513
+ def build_uidl_post_train_dataloader(
514
+ spec: SharedLMDataSpec,
515
+ tokenizer,
516
+ ) -> torch.utils.data.DataLoader:
517
+ dataset = TokenChunkDataset(build_chunks(spec, tokenizer))
518
+ return torch.utils.data.DataLoader(
519
+ dataset,
520
+ batch_size=spec.batch_size,
521
+ shuffle=spec.shuffle,
522
+ num_workers=spec.num_workers,
523
+ )
524
+
525
+
526
+ def build_uidl_similarity_dataloader(
527
+ spec: SharedLMDataSpec,
528
+ tokenizer,
529
+ ) -> torch.utils.data.DataLoader:
530
+ dataset = TokenInputMaskDataset(build_chunks(spec, tokenizer))
531
+ return torch.utils.data.DataLoader(
532
+ dataset,
533
+ batch_size=spec.batch_size,
534
+ shuffle=spec.shuffle,
535
+ num_workers=spec.num_workers,
536
+ )
537
+
538
+
539
+ def build_shortened_llm_dataloader(
540
+ spec: SharedLMDataSpec,
541
+ tokenizer,
542
+ ) -> torch.utils.data.DataLoader:
543
+ dataset = TokenOnlyDataset(build_chunks(spec, tokenizer))
544
+ return torch.utils.data.DataLoader(
545
+ dataset,
546
+ batch_size=spec.batch_size,
547
+ shuffle=spec.shuffle,
548
+ num_workers=spec.num_workers,
549
+ )
550
+
551
+
552
+ def build_shortened_llm_examples(spec: SharedLMDataSpec, tokenizer) -> torch.Tensor:
553
+ chunks = build_chunks(spec, tokenizer)
554
+ if not chunks:
555
+ return torch.empty((0, spec.seq_len), dtype=torch.long)
556
+ return torch.stack(chunks, dim=0)
557
+
558
+
559
+ def build_llmpruner_examples(spec: SharedLMDataSpec, tokenizer) -> torch.Tensor:
560
+ chunks = build_chunks(spec, tokenizer)
561
+ if not chunks:
562
+ return torch.empty((0, spec.seq_len), dtype=torch.long)
563
+ return torch.stack(chunks, dim=0)
564
+
565
+
566
+ def build_replaceme_dataloader(
567
+ spec: SharedLMDataSpec,
568
+ tokenizer,
569
+ ) -> torch.utils.data.DataLoader:
570
+ return build_text_dataloader(spec, tokenizer)
571
+
572
+
573
+ def build_hf_causal_dataset(spec: SharedLMDataSpec, tokenizer):
574
+ if HFDataset is None:
575
+ raise SystemExit("datasets is required for shared LM dataloaders")
576
+
577
+ if is_instruction_dataset(spec.dataset):
578
+ if load_dataset is None:
579
+ raise SystemExit("datasets is required for shared LM dataloaders")
580
+
581
+ hf_name, hf_config, hf_split = resolve_dataset_spec(spec.dataset, spec.config, spec.split)
582
+ dataset = load_resolved_dataset(spec.dataset, hf_name, hf_config, hf_split)
583
+ rows = dataset if spec.num_samples <= 0 else _sample_dataset_rows(dataset, spec.num_samples, spec.seed)
584
+
585
+ records: List[Dict[str, object]] = []
586
+ tokenized_records: List[List[int]] = []
587
+ max_observed_len = 0
588
+ for row in rows:
589
+ if not isinstance(row, dict):
590
+ continue
591
+ record = _build_slimorca_record(row)
592
+ if record is None:
593
+ continue
594
+ ids = _tokenize_instruction_record(record, tokenizer)
595
+ if not ids:
596
+ continue
597
+ ids = ids[: spec.seq_len]
598
+ if not ids:
599
+ continue
600
+ records.append(record)
601
+ tokenized_records.append(ids)
602
+ max_observed_len = max(max_observed_len, len(ids))
603
+
604
+ if not tokenized_records:
605
+ raise SystemExit(
606
+ f"No instruction samples built for dataset={spec.dataset} split={spec.split}."
607
+ )
608
+
609
+ if configured_indices() is not None:
610
+ effective_max_len = spec.seq_len
611
+ else:
612
+ effective_max_len = min(spec.seq_len, max_observed_len)
613
+ effective_max_len = min(spec.seq_len, _round_up_to_multiple(effective_max_len, 8))
614
+ print(
615
+ "[common_lm_data] "
616
+ f"dataset={spec.dataset} split={spec.split} samples={len(tokenized_records)} "
617
+ f"max_observed_len={max_observed_len} effective_max_len={effective_max_len}"
618
+ )
619
+ pad_id = tokenizer.pad_token_id
620
+ if pad_id is None:
621
+ pad_id = tokenizer.eos_token_id or 0
622
+
623
+ input_ids_payload: List[List[int]] = []
624
+ attention_masks_payload: List[List[int]] = []
625
+ labels_payload: List[List[int]] = []
626
+ for ids in tokenized_records:
627
+ ids = ids[:effective_max_len]
628
+ attention_mask = [1] * len(ids)
629
+ if len(ids) < effective_max_len:
630
+ pad_len = effective_max_len - len(ids)
631
+ ids = ids + [pad_id] * pad_len
632
+ attention_mask = attention_mask + [0] * pad_len
633
+ input_ids_payload.append(ids)
634
+ attention_masks_payload.append(attention_mask)
635
+ labels_payload.append(list(ids))
636
+
637
+ return HFDataset.from_dict(
638
+ {
639
+ "input_ids": input_ids_payload,
640
+ "attention_mask": attention_masks_payload,
641
+ "labels": labels_payload,
642
+ }
643
+ )
644
+
645
+ chunks = build_chunks(spec, tokenizer)
646
+ payload = {
647
+ "input_ids": [chunk.tolist() for chunk in chunks],
648
+ "attention_mask": [torch.ones_like(chunk).tolist() for chunk in chunks],
649
+ "labels": [chunk.tolist() for chunk in chunks],
650
+ }
651
+ return HFDataset.from_dict(payload)
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/dm500_rows.py ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Shared exact-row selection for data-matched experiments."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import os
7
+ import hashlib
8
+ from pathlib import Path
9
+ from typing import Any, Optional
10
+
11
+
12
+ def _manifest_canonical_row(value: Any) -> Any:
13
+ """Canonicalize rows for manifest hash validation.
14
+
15
+ Hugging Face datasets may materialize nullable struct fields that were absent
16
+ when a manifest was generated. SlimOrca's `conversations[*].weight: null` is
17
+ such a schema-only field and is not consumed by the ABPrune/ReplaceMe text
18
+ builders. Dropping only null `weight` fields preserves text identity while
19
+ keeping manifest validation strict for actual content changes.
20
+ """
21
+
22
+ if isinstance(value, dict):
23
+ return {
24
+ key: _manifest_canonical_row(child)
25
+ for key, child in value.items()
26
+ if not (key == "weight" and child is None)
27
+ }
28
+ if isinstance(value, list):
29
+ return [_manifest_canonical_row(child) for child in value]
30
+ return value
31
+
32
+
33
+ def _json_hash(row: Any) -> str:
34
+ payload = json.dumps(
35
+ row,
36
+ ensure_ascii=False,
37
+ sort_keys=True,
38
+ separators=(",", ":"),
39
+ ).encode("utf-8")
40
+ return hashlib.sha256(payload).hexdigest()
41
+
42
+
43
+ def _canonical_hash(row: Any) -> str:
44
+ return _json_hash(_manifest_canonical_row(row))
45
+
46
+
47
+ def _load_manifest(path: str) -> tuple[list[int], dict[int, str]]:
48
+ payload = json.loads(Path(path).read_text(encoding="utf-8"))
49
+ values = payload.get("indices") if isinstance(payload, dict) else payload
50
+ if not isinstance(values, list) or not values:
51
+ raise ValueError(f"indices manifest is empty or invalid: {path}")
52
+ indices = [int(value) for value in values]
53
+ if len(indices) != len(set(indices)) or min(indices) < 0:
54
+ raise ValueError(f"indices manifest has duplicates or negative values: {path}")
55
+ expected_hashes: dict[int, str] = {}
56
+ if isinstance(payload, dict):
57
+ records = payload.get("records")
58
+ if isinstance(records, list):
59
+ for record in records:
60
+ if not isinstance(record, dict):
61
+ continue
62
+ raw_index = record.get("raw_index")
63
+ content_sha256 = record.get("content_sha256")
64
+ if raw_index is None or not content_sha256:
65
+ continue
66
+ expected_hashes[int(raw_index)] = str(content_sha256)
67
+ return indices, expected_hashes
68
+
69
+
70
+ def _configured_path(manifest_env_var: str) -> str:
71
+ path = os.getenv(manifest_env_var, "").strip()
72
+ if not path and manifest_env_var != "ABPRUNE_DATA_INDICES_FILE":
73
+ path = os.getenv("ABPRUNE_DATA_INDICES_FILE", "").strip()
74
+ return path
75
+
76
+
77
+ def configured_indices(
78
+ manifest_env_var: str = "ABPRUNE_DATA_INDICES_FILE",
79
+ ) -> Optional[list[int]]:
80
+ path = _configured_path(manifest_env_var)
81
+ if not path:
82
+ return None
83
+ return _load_manifest(path)[0]
84
+
85
+
86
+ def select_rows_from_manifest(dataset, manifest_path: str, target: int = 0):
87
+ indices, expected_hashes = _load_manifest(manifest_path)
88
+ if target > 0:
89
+ if target > len(indices):
90
+ raise ValueError(
91
+ f"requested {target} rows but manifest contains {len(indices)}"
92
+ )
93
+ indices = indices[:target]
94
+ if hasattr(dataset, "__len__") and indices and max(indices) >= len(dataset):
95
+ raise ValueError(
96
+ f"manifest index {max(indices)} exceeds dataset length {len(dataset)}"
97
+ )
98
+ if not hasattr(dataset, "select"):
99
+ raise TypeError("exact DM500 row selection requires a dataset.select implementation")
100
+ selected = dataset.select(indices)
101
+ if expected_hashes:
102
+ for raw_index, row in zip(indices, selected):
103
+ expected = expected_hashes.get(raw_index)
104
+ if expected is None:
105
+ continue
106
+ raw_actual = _json_hash(row)
107
+ canonical_actual = _canonical_hash(row)
108
+ if expected not in {raw_actual, canonical_actual}:
109
+ raise ValueError(
110
+ "manifest content hash mismatch for raw_index "
111
+ f"{raw_index}: expected {expected}, got raw={raw_actual}, "
112
+ f"canonical={canonical_actual}"
113
+ )
114
+ return selected
115
+
116
+
117
+ def select_exact_rows(
118
+ dataset,
119
+ target: int = 0,
120
+ manifest_env_var: str = "ABPRUNE_DATA_INDICES_FILE",
121
+ ):
122
+ path = _configured_path(manifest_env_var)
123
+ if not path:
124
+ return None
125
+ return select_rows_from_manifest(dataset, path, target=target)
126
+
127
+
128
+ def dataset_revision_kwargs() -> dict[str, str]:
129
+ revision = os.getenv("ABPRUNE_DATASET_REVISION", "").strip()
130
+ return {"revision": revision} if revision else {}
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/eval_llama31_8b_12bench.py ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Evaluate the lm-eval portion of the requested Llama benchmark suite.
3
+
4
+ RACE-H/M, C3, CMNLI, and CHID are evaluated with their canonical OpenCompass
5
+ PPL task definitions by the companion launcher. This script handles the
6
+ remaining eight tasks plus full zero-shot MMLU and CMMLU.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import argparse
12
+ import json
13
+ import os
14
+ from pathlib import Path
15
+ from typing import Any
16
+
17
+ import torch
18
+ from transformers import AutoModelForCausalLM, AutoTokenizer
19
+
20
+
21
+ TASKS = (
22
+ "piqa",
23
+ "winogrande",
24
+ "hellaswag",
25
+ "arc_challenge",
26
+ "arc_easy",
27
+ "openbookqa",
28
+ "sciq",
29
+ "mmlu",
30
+ "cmmlu",
31
+ )
32
+
33
+ # Use normalized accuracy where the standard harness exposes it. The
34
+ # extraction code falls back to plain accuracy for tasks/versions without it.
35
+ PREFERRED_METRICS = {
36
+ "piqa": "acc_norm,none",
37
+ "hellaswag": "acc_norm,none",
38
+ "arc_challenge": "acc_norm,none",
39
+ "arc_easy": "acc_norm,none",
40
+ "openbookqa": "acc_norm,none",
41
+ "sciq": "acc_norm,none",
42
+ }
43
+
44
+
45
+ def _score(task: str, result: dict[str, Any]) -> tuple[str, float]:
46
+ preferred = PREFERRED_METRICS.get(task, "acc,none")
47
+ candidates = (preferred, "acc_norm,none", "acc,none")
48
+ for metric in candidates:
49
+ value = result.get(metric)
50
+ if value is not None:
51
+ return metric, float(value)
52
+ available = sorted(key for key in result if "," in key and not key.endswith("_stderr,none"))
53
+ raise KeyError(f"No supported accuracy metric for {task}; available={available}")
54
+
55
+
56
+ def _load_model(args: argparse.Namespace):
57
+ if args.compact_stage is None:
58
+ model = AutoModelForCausalLM.from_pretrained(
59
+ args.model,
60
+ revision=args.revision,
61
+ torch_dtype=torch.bfloat16,
62
+ attn_implementation="eager",
63
+ local_files_only=args.local_files_only,
64
+ ).cuda().eval()
65
+ tokenizer = AutoTokenizer.from_pretrained(
66
+ args.model,
67
+ revision=args.revision,
68
+ local_files_only=args.local_files_only,
69
+ )
70
+ return model, tokenizer
71
+
72
+ if args.cycle is None or args.anchor is None:
73
+ raise ValueError("--compact-stage requires --cycle and --anchor")
74
+ from fusegpt.abprune_stagewise_geometry import load_compact_model
75
+
76
+ model = load_compact_model(
77
+ args.model,
78
+ args.compact_stage,
79
+ cycle=args.cycle,
80
+ anchor=args.anchor,
81
+ dtype=torch.bfloat16,
82
+ device=torch.device("cuda"),
83
+ attn="eager",
84
+ revision=args.revision,
85
+ )
86
+ tokenizer = AutoTokenizer.from_pretrained(
87
+ args.model, revision=args.revision, local_files_only=args.local_files_only)
88
+ return model, tokenizer
89
+
90
+
91
+ def main() -> None:
92
+ parser = argparse.ArgumentParser()
93
+ parser.add_argument("--model", required=True)
94
+ parser.add_argument("--revision", default=None)
95
+ parser.add_argument("--local-files-only", action="store_true")
96
+ parser.add_argument("--compact-stage", type=Path, default=None)
97
+ parser.add_argument("--cycle", type=int, default=None)
98
+ parser.add_argument("--anchor", type=int, default=None)
99
+ parser.add_argument("--batch-size", default="auto:4")
100
+ parser.add_argument("--limit", type=float, default=None)
101
+ parser.add_argument("--output", type=Path, required=True)
102
+ parser.add_argument("--dataset-cache", type=Path, default=None)
103
+ parser.add_argument("--tasks", nargs="+", choices=TASKS, default=list(TASKS),
104
+ help="Evaluate a subset without repeating already scored tasks")
105
+ args = parser.parse_args()
106
+ if len(set(args.tasks)) != len(args.tasks):
107
+ parser.error("--tasks must not contain duplicates")
108
+
109
+ # CMMLU is still distributed through a Hugging Face dataset loading
110
+ # script. Opt in explicitly so non-interactive experiment jobs do not
111
+ # stop at the datasets trust prompt.
112
+ os.environ.setdefault("HF_DATASETS_TRUST_REMOTE_CODE", "1")
113
+
114
+ from lm_eval import evaluator
115
+ from lm_eval.models.huggingface import HFLM
116
+
117
+ if args.dataset_cache is not None:
118
+ from prepare_lmeval9_local_cache import install_local_loader
119
+ install_local_loader(args.dataset_cache)
120
+
121
+ model, tokenizer = _load_model(args)
122
+ model.config.use_cache = False
123
+ if getattr(model, "generation_config", None) is not None:
124
+ model.generation_config.use_cache = False
125
+ for layer_idx, layer in enumerate(model.model.layers):
126
+ if hasattr(layer, "self_attn") and hasattr(layer.self_attn, "layer_idx"):
127
+ layer.self_attn.layer_idx = layer_idx
128
+
129
+ lm = HFLM(
130
+ pretrained=model,
131
+ tokenizer=tokenizer,
132
+ backend="causal",
133
+ batch_size=args.batch_size,
134
+ )
135
+ raw = evaluator.simple_evaluate(
136
+ model=lm,
137
+ tasks=args.tasks,
138
+ num_fewshot=0,
139
+ batch_size=args.batch_size,
140
+ random_seed=0,
141
+ numpy_random_seed=1234,
142
+ torch_random_seed=1234,
143
+ fewshot_random_seed=1234,
144
+ bootstrap_iters=0,
145
+ limit=args.limit,
146
+ )
147
+
148
+ scores: dict[str, float] = {}
149
+ metrics: dict[str, str] = {}
150
+ for task in args.tasks:
151
+ source = raw.get("groups", {}) if task in {"mmlu", "cmmlu"} else raw["results"]
152
+ if task not in source:
153
+ raise KeyError(
154
+ f"Requested task {task!r} missing from lm-eval results: "
155
+ f"results={sorted(raw['results'])}, groups={sorted(raw.get('groups', {}))}"
156
+ )
157
+ metric, value = _score(task, source[task])
158
+ metrics[task] = metric
159
+ scores[task] = value
160
+
161
+ report = {
162
+ "model": args.model,
163
+ "revision": args.revision,
164
+ "compact_stage": str(args.compact_stage) if args.compact_stage else None,
165
+ "cycle": args.cycle,
166
+ "anchor": args.anchor,
167
+ "tasks": args.tasks,
168
+ "num_fewshot": 0,
169
+ "batch_size": args.batch_size,
170
+ "limit": args.limit,
171
+ "dataset_cache": str(args.dataset_cache) if args.dataset_cache else None,
172
+ "preferred_metrics": metrics,
173
+ "task_scores": scores,
174
+ "macro_mean_all_rows": sum(scores.values()) / len(scores),
175
+ "lm_eval_results": raw["results"],
176
+ "lm_eval_groups": raw.get("groups"),
177
+ "lm_eval_versions": raw.get("versions"),
178
+ "lm_eval_config": raw.get("config"),
179
+ }
180
+ args.output.parent.mkdir(parents=True, exist_ok=True)
181
+ args.output.write_text(
182
+ json.dumps(report, indent=2, ensure_ascii=False, default=str) + "\n",
183
+ encoding="utf-8",
184
+ )
185
+ print(
186
+ json.dumps(
187
+ {"task_scores": scores, "macro_mean_all_rows": report["macro_mean_all_rows"]},
188
+ indent=2,
189
+ )
190
+ )
191
+
192
+
193
+ if __name__ == "__main__":
194
+ main()
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/eval_llama31_fit_ablation_one.sh ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ project="$1"; root="$2"; model="$3"; data="$4"; python="$5"
4
+ anchor="$6"; cycles="$7"; gpu="$8"
5
+ stage="$root/compact/stage_$(printf '%02d' "$cycles")"
6
+ export HF_HOME=/workspace/.hf_home HF_TOKEN_PATH=/root/.cache/huggingface/token
7
+ export HF_DATASETS_CACHE=/workspace/.hf_datasets36 HF_DATASETS_TRUST_REMOTE_CODE=1
8
+ export TOKENIZERS_PARALLELISM=false PYTHONUNBUFFERED=1 PYTHONPATH="$project/src"
9
+ revision="${MODEL_REVISION:-49e3418fbbbca6ecbdf9608b4d22e5a407081db4}"
10
+ if [[ -n "${LMEVAL_LOCAL_CACHE:-}" ]]; then
11
+ export HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1
12
+ [[ -d "$model" ]] || { echo 'Offline bench requires a local model directory'; exit 1; }
13
+ "$python" "$project/scripts/prepare_lmeval9_local_cache.py" "$LMEVAL_LOCAL_CACHE" --validate-local
14
+ for file in race/test/high.jsonl race/test/middle.jsonl CLUE/C3/dev_0.json CLUE/cmnli/cmnli_public/dev.json FewCLUE/chid/dev_few_all.json; do
15
+ [[ -s "$data/$file" ]] || { echo "Offline OpenCompass input missing: $file"; exit 1; }
16
+ done
17
+ echo 'STRICT_OFFLINE_BENCH_PREFLIGHT_OK'
18
+ fi
19
+ opencompass_gpu="$gpu"; lmeval_gpu="${9:-$gpu}"
20
+ if [[ -f "$root/eval/gpu_assignment.json" ]]; then
21
+ read -r opencompass_gpu lmeval_gpu < <("$python" - "$root/eval/gpu_assignment.json" <<'PY'
22
+ import json, sys
23
+ assignment = json.load(open(sys.argv[1]))
24
+ values = [assignment[key] for key in ("opencompass_gpu", "lmeval_gpu")]
25
+ assert all(type(value) is int and value >= 0 for value in values)
26
+ print(*values)
27
+ PY
28
+ )
29
+ fi
30
+ run_opencompass() {
31
+ [[ -f "$root/eval/final_opencompass5.json" ]] && return 0
32
+ CUDA_VISIBLE_DEVICES="$opencompass_gpu" "$python" "$project/scripts/eval_opencompass_ppl_fast.py" \
33
+ --model "$model" --revision "$revision" --tokenizer "$model" \
34
+ --compact-stage "$stage" --cycle "$cycles" --anchor "$anchor" \
35
+ --data-root "$data" --max-batch 32 --token-budget 8192 \
36
+ --output "$root/eval/final_opencompass5.json"
37
+ }
38
+ run_lmeval() {
39
+ [[ -f "$root/eval/final_lmeval9.json" ]] && return 0
40
+ local cache_args=()
41
+ if [[ -n "${LMEVAL_LOCAL_CACHE:-}" ]]; then
42
+ [[ -f "$LMEVAL_LOCAL_CACHE/manifest.json" ]] || return 1
43
+ cache_args=(--dataset-cache "$LMEVAL_LOCAL_CACHE" --local-files-only)
44
+ export HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1
45
+ fi
46
+ CUDA_VISIBLE_DEVICES="$lmeval_gpu" "$python" "$project/scripts/eval_llama31_8b_12bench.py" \
47
+ --model "$model" --revision "$revision" --compact-stage "$stage" \
48
+ --cycle "$cycles" --anchor "$anchor" --batch-size auto:4 \
49
+ --output "$root/eval/final_lmeval9.json" "${cache_args[@]}"
50
+ }
51
+ if [[ "$opencompass_gpu" != "$lmeval_gpu" ]]; then
52
+ echo "Parallel evaluation: OpenCompass GPU=$opencompass_gpu; lm-eval GPU=$lmeval_gpu"
53
+ run_opencompass >> "$root/logs/eval_opencompass.log" 2>&1 & oc_pid=$!
54
+ run_lmeval >> "$root/logs/eval_lmeval.log" 2>&1 & lm_pid=$!
55
+ status=0
56
+ wait "$oc_pid" || status=1
57
+ wait "$lm_pid" || status=1
58
+ if ((status)); then exit 1; fi
59
+ else
60
+ run_opencompass >> "$root/logs/eval14.log" 2>&1
61
+ run_lmeval >> "$root/logs/eval14.log" 2>&1
62
+ fi
63
+ "$python" "$project/scripts/aggregate_transport_rho_fit_14bench.py" "$root"
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/eval_opencompass_ppl_fast.py ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Fast, equivalent evaluator for selected OpenCompass zero-shot PPL tasks.
3
+
4
+ The prompts, labels, split choices, full-prompt mean-CE scoring, and lowest-PPL
5
+ decision rule mirror OpenCompass 0.5.4's canonical configs for RACE, C3,
6
+ CMNLI, and CHID. Unlike the stock runner, this evaluator disables KV cache
7
+ and length-batches all choices, which matters substantially on 40 GB GPUs.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import argparse
13
+ import json
14
+ from pathlib import Path
15
+ from typing import Iterable
16
+
17
+ import torch
18
+ import torch.nn.functional as F
19
+ from transformers import AutoModelForCausalLM, AutoTokenizer
20
+
21
+
22
+ def read_jsonl(path: Path) -> Iterable[dict]:
23
+ with path.open("r", encoding="utf-8") as stream:
24
+ for line in stream:
25
+ yield json.loads(line)
26
+
27
+
28
+ def race(path: Path) -> tuple[list[list[str]], list[int]]:
29
+ prompts, golds = [], []
30
+ for row in read_jsonl(path):
31
+ human = (
32
+ "Read the article, and answer the question by replying A, B, C or D.\n\n"
33
+ f"Article:\n{row['article']}\n\nQ: {row['question']}\n\n"
34
+ f"A. {row['options'][0]}\nB. {row['options'][1]}\n"
35
+ f"C. {row['options'][2]}\nD. {row['options'][3]}"
36
+ )
37
+ prompts.append([human + "\n" + f"A: {answer}" for answer in "ABCD"])
38
+ golds.append("ABCD".index(row["answer"]))
39
+ return prompts, golds
40
+
41
+
42
+ def c3(path: Path) -> tuple[list[list[str]], list[int]]:
43
+ prompts, golds = [], []
44
+ rows = json.loads(path.read_text(encoding="utf-8"))
45
+ for row in rows:
46
+ content = " ".join("".join(paragraph) for paragraph in row[0])
47
+ for question in row[1]:
48
+ choices = list(question["choice"])
49
+ golds.append(choices.index(question["answer"]))
50
+ while len(choices) < 4:
51
+ choices.append(choices[0])
52
+ human = f"文章:{content}\n问题:{question['question']}"
53
+ prompts.append([human + "\n" + f"答案:{choice}" for choice in choices[:4]])
54
+ return prompts, golds
55
+
56
+
57
+ def cmnli(path: Path) -> tuple[list[list[str]], list[int]]:
58
+ labels = ("contradiction", "entailment", "neutral")
59
+ verbalizers = ("矛盾", "蕴含", "无关")
60
+ prompts, golds = [], []
61
+ for row in read_jsonl(path):
62
+ if row["label"] == "-":
63
+ continue
64
+ human = (
65
+ f"语句一:“{row['sentence1']}”\n语句二:“{row['sentence2']}”\n"
66
+ "请问这两句话是什么关系?"
67
+ )
68
+ prompts.append([human + "\n" + word for word in verbalizers])
69
+ golds.append(labels.index(row["label"]))
70
+ return prompts, golds
71
+
72
+
73
+ def chid(path: Path) -> tuple[list[list[str]], list[int]]:
74
+ prompts, golds = [], []
75
+ for row in read_jsonl(path):
76
+ candidates = [row["content"].replace("#idiom#", candidate) for candidate in row["candidates"]]
77
+ prompts.append([
78
+ f"以下句子是否通顺?\n{content}\n这个句子是通顺的。" for content in candidates
79
+ ])
80
+ golds.append(int(row["answer"]))
81
+ return prompts, golds
82
+
83
+
84
+ def score_task(model, tokenizer, choices: list[list[str]], golds: list[int], max_batch: int,
85
+ token_budget: int) -> dict:
86
+ flat = [(sample_idx, choice_idx, prompt)
87
+ for sample_idx, row in enumerate(choices)
88
+ for choice_idx, prompt in enumerate(row)]
89
+ encoded = tokenizer(
90
+ [item[2] for item in flat],
91
+ add_special_tokens=True,
92
+ padding=False,
93
+ truncation=True,
94
+ max_length=model.config.max_position_embeddings,
95
+ )["input_ids"]
96
+ order = sorted(range(len(flat)), key=lambda idx: len(encoded[idx]), reverse=True)
97
+ losses = [0.0] * len(flat)
98
+ cursor = 0
99
+ while cursor < len(order):
100
+ longest = len(encoded[order[cursor]])
101
+ batch_size = min(max_batch, max(1, token_budget // longest), len(order) - cursor)
102
+ while True:
103
+ batch_indices = order[cursor:cursor + batch_size]
104
+ max_len = max(len(encoded[idx]) for idx in batch_indices)
105
+ input_ids = torch.full(
106
+ (batch_size, max_len), tokenizer.pad_token_id, dtype=torch.long, device="cuda"
107
+ )
108
+ attention = torch.zeros((batch_size, max_len), dtype=torch.long, device="cuda")
109
+ for row_idx, flat_idx in enumerate(batch_indices):
110
+ values = torch.tensor(encoded[flat_idx], dtype=torch.long, device="cuda")
111
+ input_ids[row_idx, : len(values)] = values
112
+ attention[row_idx, : len(values)] = 1
113
+ try:
114
+ with torch.inference_mode():
115
+ logits = model(input_ids=input_ids, attention_mask=attention, use_cache=False).logits
116
+ token_loss = F.cross_entropy(
117
+ logits[:, :-1].float().reshape(-1, logits.shape[-1]),
118
+ input_ids[:, 1:].reshape(-1),
119
+ reduction="none",
120
+ ).view(batch_size, -1)
121
+ # OpenCompass divides by the number of non-padding input
122
+ # tokens (including BOS), while scoring shifted labels.
123
+ sequence_loss = (
124
+ token_loss * attention[:, 1:]
125
+ ).sum(dim=1) / attention.sum(dim=1)
126
+ break
127
+ except torch.OutOfMemoryError:
128
+ del input_ids, attention
129
+ torch.cuda.empty_cache()
130
+ if batch_size == 1:
131
+ raise
132
+ batch_size = max(1, batch_size // 2)
133
+ for flat_idx, value in zip(batch_indices, sequence_loss.tolist()):
134
+ losses[flat_idx] = value
135
+ cursor += batch_size
136
+ if cursor % 1000 < batch_size or cursor == len(order):
137
+ print(f"choices={cursor}/{len(order)}", flush=True)
138
+
139
+ score_rows = [[0.0] * len(row) for row in choices]
140
+ for flat_idx, (sample_idx, choice_idx, _) in enumerate(flat):
141
+ score_rows[sample_idx][choice_idx] = losses[flat_idx]
142
+ predictions = [min(range(len(row)), key=row.__getitem__) for row in score_rows]
143
+ correct = sum(prediction == gold for prediction, gold in zip(predictions, golds))
144
+ return {
145
+ "accuracy": correct / len(golds),
146
+ "correct": correct,
147
+ "samples": len(golds),
148
+ "choices": len(flat),
149
+ }
150
+
151
+
152
+ def main() -> None:
153
+ parser = argparse.ArgumentParser()
154
+ parser.add_argument("--model", required=True)
155
+ parser.add_argument("--revision", default=None)
156
+ parser.add_argument("--tokenizer", required=True)
157
+ parser.add_argument("--compact-stage", type=Path, default=None)
158
+ parser.add_argument("--cycle", type=int, default=None)
159
+ parser.add_argument("--anchor", type=int, default=None)
160
+ parser.add_argument("--data-root", type=Path, required=True)
161
+ parser.add_argument("--output", type=Path, required=True)
162
+ parser.add_argument("--max-batch", type=int, default=32)
163
+ parser.add_argument("--token-budget", type=int, default=8192)
164
+ parser.add_argument("--limit", type=int, default=None)
165
+ args = parser.parse_args()
166
+
167
+ tokenizer = AutoTokenizer.from_pretrained(args.tokenizer, local_files_only=True)
168
+ if tokenizer.pad_token_id is None:
169
+ tokenizer.pad_token_id = tokenizer.eos_token_id
170
+ tokenizer.padding_side = "right"
171
+ if args.compact_stage is None:
172
+ model = AutoModelForCausalLM.from_pretrained(
173
+ args.model,
174
+ revision=args.revision,
175
+ torch_dtype=torch.bfloat16,
176
+ attn_implementation="sdpa",
177
+ local_files_only=True,
178
+ ).cuda().eval()
179
+ else:
180
+ if args.cycle is None or args.anchor is None:
181
+ raise ValueError("--compact-stage requires --cycle and --anchor")
182
+ from fusegpt.abprune_stagewise_geometry import load_compact_model
183
+
184
+ model = load_compact_model(
185
+ args.model,
186
+ args.compact_stage,
187
+ cycle=args.cycle,
188
+ anchor=args.anchor,
189
+ dtype=torch.bfloat16,
190
+ device=torch.device("cuda"),
191
+ attn="sdpa",
192
+ revision=args.revision,
193
+ )
194
+ model.config.use_cache = False
195
+
196
+ datasets = {
197
+ "race-middle": race(args.data_root / "race/test/middle.jsonl"),
198
+ "race-high": race(args.data_root / "race/test/high.jsonl"),
199
+ "C3": c3(args.data_root / "CLUE/C3/dev_0.json"),
200
+ "cmnli": cmnli(args.data_root / "CLUE/cmnli/cmnli_public/dev.json"),
201
+ "chid-dev": chid(args.data_root / "FewCLUE/chid/dev_few_all.json"),
202
+ }
203
+ results = {}
204
+ for name, (choices, golds) in datasets.items():
205
+ if args.limit is not None:
206
+ choices, golds = choices[: args.limit], golds[: args.limit]
207
+ print(f"task={name} samples={len(golds)}", flush=True)
208
+ results[name] = score_task(
209
+ model, tokenizer, choices, golds, args.max_batch, args.token_budget
210
+ )
211
+ print(json.dumps({name: results[name]}, ensure_ascii=False), flush=True)
212
+
213
+ report = {
214
+ "model": args.model,
215
+ "revision": args.revision,
216
+ "compact_stage": str(args.compact_stage) if args.compact_stage else None,
217
+ "cycle": args.cycle,
218
+ "anchor": args.anchor,
219
+ "tokenizer": args.tokenizer,
220
+ "protocol": "OpenCompass 0.5.4 canonical PPL prompts; full-prompt mean CE; lowest PPL",
221
+ "max_batch": args.max_batch,
222
+ "token_budget": args.token_budget,
223
+ "limit": args.limit,
224
+ "results": results,
225
+ }
226
+ args.output.parent.mkdir(parents=True, exist_ok=True)
227
+ args.output.write_text(json.dumps(report, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
228
+
229
+
230
+ if __name__ == "__main__":
231
+ main()
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/evaluate_abprune_compact_ppl.py ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Evaluate an unscaled or residual-scaled compact ABPrune checkpoint."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ from contextlib import ExitStack
9
+ from pathlib import Path
10
+ import sys
11
+
12
+ from offline_eval_policy import apply_run_offline_policy
13
+
14
+ OFFLINE_POLICY = apply_run_offline_policy(sys.argv)
15
+
16
+ import torch
17
+
18
+ from evaluate_hchc_wikitext2_ppl import evaluate_perplexity, packed_wikitext_tokens
19
+ from fusegpt.abprune_residual_scale import residual_scale_hook
20
+ from fusegpt.abprune_compact import compact_scale_targets, read_compact_metadata
21
+ from fusegpt.abprune_stagewise_geometry import load_compact_model
22
+ from fusegpt.hadamard_channel_fusion import linear_patch_hook
23
+
24
+
25
+ def main() -> None:
26
+ parser = argparse.ArgumentParser()
27
+ parser.add_argument("--model", required=True)
28
+ parser.add_argument("--revision", required=True)
29
+ parser.add_argument("--compact-stage", type=Path, required=True)
30
+ parser.add_argument("--output", type=Path, required=True)
31
+ parser.add_argument("--anchor", type=int, default=None)
32
+ parser.add_argument("--cycles", type=int, required=True)
33
+ parser.add_argument("--original-layers", type=int, required=True)
34
+ parser.add_argument("--seq-len", type=int, default=2048)
35
+ parser.add_argument("--batch-size", type=int, default=4)
36
+ parser.add_argument("--device", default="cuda")
37
+ parser.add_argument("--apply-post-merge-scale", action="store_true")
38
+ parser.add_argument("--linear-patch", type=Path, default=None)
39
+ args = parser.parse_args()
40
+
41
+ # Long training supervisors may be asked to stop after model construction.
42
+ # A run-local marker makes that request durable without killing training.
43
+ run_root = args.output.parent.parent
44
+ if (run_root / "DEFER_EVAL").exists():
45
+ print(f"[eval] deferred by {run_root / 'DEFER_EVAL'}", flush=True)
46
+ raise SystemExit(75)
47
+
48
+ device = torch.device(args.device)
49
+ model = load_compact_model(
50
+ args.model,
51
+ args.compact_stage,
52
+ cycle=args.cycles,
53
+ anchor=args.anchor,
54
+ dtype=torch.bfloat16,
55
+ device=device,
56
+ attn="eager",
57
+ revision=args.revision,
58
+ )
59
+ model.eval()
60
+ expected_depth = args.original_layers - args.cycles
61
+ if len(model.model.layers) != expected_depth:
62
+ raise RuntimeError(
63
+ f"Unexpected decoder depth: {len(model.model.layers)} != {expected_depth}"
64
+ )
65
+
66
+ from transformers import AutoTokenizer
67
+
68
+ if OFFLINE_POLICY and not Path(args.model).is_dir():
69
+ raise ValueError('Strict offline PPL requires a local model directory')
70
+ tokenizer = AutoTokenizer.from_pretrained(
71
+ args.model, revision=args.revision, local_files_only=bool(OFFLINE_POLICY))
72
+ applied_scales = []
73
+ scale_stack = ExitStack()
74
+ linear_patch = None
75
+ if args.apply_post_merge_scale:
76
+ metadata = read_compact_metadata(args.compact_stage)
77
+ targets = compact_scale_targets(metadata)
78
+ if not targets:
79
+ raise RuntimeError(
80
+ "--apply-post-merge-scale requires enabled residual scale metadata"
81
+ )
82
+ for target in targets:
83
+ stored_scale = target["scale"]["cumulative_gamma"]
84
+ applied = (
85
+ torch.tensor(stored_scale, device=device, dtype=torch.float32)
86
+ if isinstance(stored_scale, list)
87
+ else float(stored_scale)
88
+ )
89
+ scale_stack.enter_context(
90
+ residual_scale_hook(model, int(target["student_index"]), applied)
91
+ )
92
+ applied_scales.append(
93
+ {
94
+ "original_layer": int(target["original_layer"]),
95
+ "student_index": int(target["student_index"]),
96
+ "value": applied,
97
+ }
98
+ )
99
+ if args.linear_patch is not None:
100
+ linear_patch = json.loads(args.linear_patch.read_text(encoding="utf-8"))
101
+ patch_scale = torch.tensor(
102
+ linear_patch["scale"], device=device, dtype=torch.float32
103
+ )
104
+ patch_anchor = int(linear_patch["anchor_student_index"])
105
+ scale_stack.enter_context(
106
+ linear_patch_hook(
107
+ model.model.layers[patch_anchor],
108
+ patch_scale,
109
+ hadamard=linear_patch["mode"] == "hadamard",
110
+ )
111
+ )
112
+
113
+ with scale_stack:
114
+ tokens = packed_wikitext_tokens(
115
+ tokenizer, "test", dataset_cache=(
116
+ Path(OFFLINE_POLICY['wikitext_cache']) if OFFLINE_POLICY else None))
117
+ metrics = evaluate_perplexity(
118
+ model=model,
119
+ tokens=tokens,
120
+ sequence_length=args.seq_len,
121
+ batch_size=args.batch_size,
122
+ )
123
+
124
+ report = {
125
+ "model": args.model,
126
+ "revision": args.revision,
127
+ "compact_stage": str(args.compact_stage),
128
+ "dataset": "Salesforce/wikitext:wikitext-2-raw-v1:test",
129
+ "offline_policy": OFFLINE_POLICY,
130
+ "protocol": (
131
+ "HCHC experiment.py: filter empty rows, join with double newline, "
132
+ "then tokenize the complete stream once"
133
+ ),
134
+ "sequence_length": args.seq_len,
135
+ "batch_size": args.batch_size,
136
+ "dtype": "bfloat16",
137
+ "metrics": metrics,
138
+ "anchor": args.anchor,
139
+ "cycles": args.cycles,
140
+ "original_layers": args.original_layers,
141
+ "decoder_layers": len(model.model.layers),
142
+ "post_merge_residual_scale": (
143
+ applied_scales[0]["value"].tolist()
144
+ if len(applied_scales) == 1
145
+ and torch.is_tensor(applied_scales[0]["value"])
146
+ else (
147
+ applied_scales[0]["value"]
148
+ if len(applied_scales) == 1
149
+ else None
150
+ )
151
+ ),
152
+ "post_merge_residual_scales": [
153
+ {
154
+ "original_layer": item["original_layer"],
155
+ "student_index": item["student_index"],
156
+ "parameterization": (
157
+ "vector" if torch.is_tensor(item["value"]) else "scalar"
158
+ ),
159
+ "value": (
160
+ item["value"].tolist()
161
+ if torch.is_tensor(item["value"])
162
+ else item["value"]
163
+ ),
164
+ }
165
+ for item in applied_scales
166
+ ],
167
+ "parameterization": (
168
+ "X_interface <- X_interface H D H.T"
169
+ if linear_patch and linear_patch["mode"] == "hadamard"
170
+ else (
171
+ "X_interface <- X_interface D"
172
+ if linear_patch
173
+ else (
174
+ "h_out = h_in + gamma * (block(h_in) - h_in)"
175
+ if applied_scales else "unscaled compact ABPrune"
176
+ )
177
+ )
178
+ ),
179
+ "linear_patch": linear_patch,
180
+ }
181
+ args.output.parent.mkdir(parents=True, exist_ok=True)
182
+ args.output.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
183
+ print(json.dumps(report, indent=2), flush=True)
184
+
185
+
186
+ if __name__ == "__main__":
187
+ main()
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/evaluate_hchc_wikitext2_ppl.py ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Evaluate a saved causal LM with the HCHC WikiText-2 PPL protocol."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ import math
9
+ from pathlib import Path
10
+ from typing import Any
11
+
12
+ import torch
13
+ from datasets import load_dataset, load_from_disk
14
+
15
+
16
+ def primary(output: Any) -> torch.Tensor:
17
+ if torch.is_tensor(output):
18
+ return output
19
+ if isinstance(output, (tuple, list)) and output and torch.is_tensor(output[0]):
20
+ return output[0]
21
+ raise TypeError(f"Unsupported decoder-layer output type: {type(output)!r}")
22
+
23
+
24
+ def replace_primary(output: Any, hidden: torch.Tensor) -> Any:
25
+ if torch.is_tensor(output):
26
+ return hidden
27
+ if isinstance(output, tuple):
28
+ return (hidden, *output[1:])
29
+ if isinstance(output, list):
30
+ return [hidden, *output[1:]]
31
+ raise TypeError(f"Unsupported decoder-layer output type: {type(output)!r}")
32
+
33
+
34
+ def register_residual_scale_hook(layer, gamma: float):
35
+ """Install h_out = h_in + gamma * (block(h_in) - h_in)."""
36
+ scale = torch.tensor(gamma, device=next(layer.parameters()).device)
37
+
38
+ def hook(_module, inputs, output):
39
+ if not inputs or not torch.is_tensor(inputs[0]):
40
+ raise RuntimeError("Could not capture decoder-layer residual input")
41
+ layer_input = inputs[0]
42
+ corrected = layer_input + scale * (primary(output) - layer_input)
43
+ return replace_primary(output, corrected)
44
+
45
+ return layer.register_forward_hook(hook)
46
+
47
+
48
+ def packed_wikitext_tokens(tokenizer, split: str, *, dataset_cache: Path | None = None) -> torch.Tensor:
49
+ """Reproduce the canonical HCHC WikiText-2 packing protocol."""
50
+ if dataset_cache is not None:
51
+ dataset = load_from_disk(str(dataset_cache))[split]
52
+ else:
53
+ dataset = load_dataset(
54
+ "Salesforce/wikitext", "wikitext-2-raw-v1", split=split
55
+ )
56
+ text = "\n\n".join(row for row in dataset["text"] if row.strip())
57
+ return tokenizer(
58
+ text, add_special_tokens=False, return_tensors="pt"
59
+ ).input_ids[0]
60
+
61
+
62
+ @torch.no_grad()
63
+ def evaluate_perplexity(
64
+ model,
65
+ tokens: torch.Tensor,
66
+ sequence_length: int,
67
+ batch_size: int,
68
+ ) -> dict[str, float | int]:
69
+ num_sequences = tokens.numel() // sequence_length
70
+ ids = tokens[: num_sequences * sequence_length].view(num_sequences, sequence_length)
71
+ total_nll = 0.0
72
+ total_predicted_tokens = 0
73
+ model.eval()
74
+ for start in range(0, num_sequences, batch_size):
75
+ batch = ids[start : start + batch_size].to("cuda")
76
+ output = model(input_ids=batch, labels=batch, use_cache=False)
77
+ predicted = batch.shape[0] * (batch.shape[1] - 1)
78
+ total_nll += output.loss.float().item() * predicted
79
+ total_predicted_tokens += predicted
80
+ mean_nll = total_nll / total_predicted_tokens
81
+ return {
82
+ "nll": mean_nll,
83
+ "perplexity": math.exp(mean_nll),
84
+ "tokens": total_predicted_tokens,
85
+ "sequences": num_sequences,
86
+ "source_tokens": int(tokens.numel()),
87
+ }
88
+
89
+
90
+ def main() -> None:
91
+ parser = argparse.ArgumentParser()
92
+ parser.add_argument("--model", type=Path, required=True)
93
+ parser.add_argument("--output", type=Path, required=True)
94
+ parser.add_argument("--sequence-length", type=int, default=2048)
95
+ parser.add_argument("--batch-size", type=int, default=8)
96
+ parser.add_argument("--residual-anchor", type=int)
97
+ parser.add_argument("--residual-gamma", type=float)
98
+ args = parser.parse_args()
99
+
100
+ if (args.residual_anchor is None) != (args.residual_gamma is None):
101
+ parser.error("--residual-anchor and --residual-gamma must be supplied together")
102
+
103
+ from transformers import AutoModelForCausalLM, AutoTokenizer
104
+
105
+ tokenizer = AutoTokenizer.from_pretrained(args.model, local_files_only=True)
106
+ model = AutoModelForCausalLM.from_pretrained(
107
+ args.model,
108
+ torch_dtype=torch.bfloat16,
109
+ local_files_only=True,
110
+ low_cpu_mem_usage=True,
111
+ attn_implementation="sdpa",
112
+ ).to("cuda")
113
+ model.config.use_cache = False
114
+
115
+ handle = None
116
+ if args.residual_gamma is not None:
117
+ if args.residual_anchor >= len(model.model.layers):
118
+ raise ValueError(
119
+ f"Residual anchor {args.residual_anchor} is outside decoder depth "
120
+ f"{len(model.model.layers)}"
121
+ )
122
+ handle = register_residual_scale_hook(
123
+ model.model.layers[args.residual_anchor], args.residual_gamma
124
+ )
125
+
126
+ tokens = packed_wikitext_tokens(tokenizer, "test")
127
+ try:
128
+ metrics = evaluate_perplexity(
129
+ model, tokens, args.sequence_length, args.batch_size
130
+ )
131
+ finally:
132
+ if handle is not None:
133
+ handle.remove()
134
+
135
+ report = {
136
+ "model": str(args.model),
137
+ "dataset": "Salesforce/wikitext:wikitext-2-raw-v1:test",
138
+ "protocol": "HCHC experiment.py: non-empty rows joined with double newline before one-shot tokenization",
139
+ "sequence_length": args.sequence_length,
140
+ "batch_size": args.batch_size,
141
+ "dtype": "bfloat16",
142
+ "residual_anchor": args.residual_anchor,
143
+ "residual_gamma": args.residual_gamma,
144
+ "metrics": metrics,
145
+ }
146
+ args.output.parent.mkdir(parents=True, exist_ok=True)
147
+ args.output.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
148
+ print(json.dumps(report, indent=2), flush=True)
149
+
150
+
151
+ if __name__ == "__main__":
152
+ main()
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/fit_ablation_mka.py ADDED
@@ -0,0 +1,482 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Corrected MKA variant: adjacent NPIB selection, upstream lambda, real fusion.
2
+
3
+ Not an exact reproduction of the paper: use sequence-level pooled activations,
4
+ recompute geometry after every merge, and resolve NPIB ties back-to-front.
5
+ The seven projection weights are fused; residual and Q/K norms stay at anchor.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import hashlib
11
+ import math
12
+ import random
13
+ from collections.abc import Callable, Iterable, Sequence
14
+ from dataclasses import asdict, dataclass
15
+
16
+ import numpy as np
17
+ import torch
18
+ from scipy.linalg import eigh
19
+ from scipy.spatial.distance import pdist, squareform
20
+ from sklearn.feature_selection import mutual_info_regression
21
+ from sklearn.neighbors import NearestNeighbors
22
+ from torch import Tensor, nn
23
+
24
+ PROJECTION_WEIGHTS = (
25
+ "mlp.down_proj.weight",
26
+ "mlp.up_proj.weight",
27
+ "mlp.gate_proj.weight",
28
+ "self_attn.k_proj.weight",
29
+ "self_attn.o_proj.weight",
30
+ "self_attn.q_proj.weight",
31
+ "self_attn.v_proj.weight",
32
+ )
33
+ UPSTREAM = "https://github.com/SempraETY/Pruning-via-Merging"
34
+ UPSTREAM_COMMIT = "3b60b002a0963266e2f4ca78f133b4e091bc607a"
35
+
36
+
37
+ @dataclass(frozen=True)
38
+ class GeometryConfig:
39
+ sigma: float = 8.0
40
+ alpha: float = 0.5
41
+ dimensions: int = 2
42
+ mi_neighbors: int = 5
43
+ entropy_neighbors: int = 50
44
+ beta: float = 1.0
45
+ seed: int = 0
46
+ pooling: str = "mean"
47
+
48
+ def validate(self) -> None:
49
+ if not math.isfinite(self.sigma) or self.sigma <= 0:
50
+ raise ValueError("sigma must be positive and finite")
51
+ if not math.isfinite(self.alpha) or not 0 <= self.alpha <= 1:
52
+ raise ValueError("alpha must be finite and in [0, 1]")
53
+ if self.dimensions < 1 or min(self.mi_neighbors, self.entropy_neighbors) < 1:
54
+ raise ValueError("dimensions and neighbor counts must be positive")
55
+ if not math.isfinite(self.beta) or self.beta < 0:
56
+ raise ValueError("beta must be non-negative and finite")
57
+ if self.pooling not in {"mean", "last"}:
58
+ raise ValueError("pooling must be 'mean' or 'last'")
59
+
60
+
61
+ def sample_slimpajama(
62
+ tokenizer,
63
+ *,
64
+ samples: int = 100,
65
+ sequence_length: int = 512,
66
+ seed: int = 0,
67
+ revision: str = "b5f90f419b7489cdba26fdbc8c022fcb5562f968",
68
+ shuffle_buffer: int = 10000,
69
+ max_documents: int = 100000,
70
+ documents: Iterable[dict] | None = None,
71
+ ) -> tuple[list[dict[str, Tensor]], dict]:
72
+ """Exactly one random fixed-length, no-BOS window from each distinct document.
73
+
74
+ Unlike CoMe's row-packing loader, ``samples`` is the number of sequences.
75
+ Persist returned IDs and provenance; do not sample again between stages.
76
+ """
77
+ if min(samples, sequence_length, shuffle_buffer, max_documents) < 1:
78
+ raise ValueError("sampling counts, length and buffer must be positive")
79
+ if documents is None:
80
+ from datasets import load_dataset
81
+
82
+ documents = load_dataset(
83
+ "DKYoon/SlimPajama-6B", revision=revision, split="train", streaming=True
84
+ ).shuffle(seed=seed, buffer_size=shuffle_buffer)
85
+ rng = random.Random(seed)
86
+ batches, records, seen = [], [], set()
87
+ iterator = iter(documents)
88
+ try:
89
+ for row_index, row in enumerate(iterator):
90
+ if row_index >= max_documents:
91
+ break
92
+ text = row.get("text")
93
+ if not isinstance(text, str) or not text.strip():
94
+ continue
95
+ digest = hashlib.sha256(text.encode("utf-8")).hexdigest()
96
+ if digest in seen:
97
+ continue
98
+ seen.add(digest)
99
+ ids = tokenizer.encode(text, add_special_tokens=False)
100
+ if len(ids) < sequence_length:
101
+ continue
102
+ start = rng.randrange(len(ids) - sequence_length + 1)
103
+ tensor = torch.tensor(
104
+ ids[start : start + sequence_length], dtype=torch.long
105
+ )[None, :]
106
+ batches.append(
107
+ {"input_ids": tensor, "attention_mask": torch.ones_like(tensor)}
108
+ )
109
+ records.append(
110
+ {
111
+ "stream_row": row_index,
112
+ "document_sha256": digest,
113
+ "document_tokens": len(ids),
114
+ "window_start": start,
115
+ }
116
+ )
117
+ if len(batches) == samples:
118
+ break
119
+ finally:
120
+ close = getattr(iterator, "close", None)
121
+ if close is not None:
122
+ close()
123
+ if len(batches) != samples:
124
+ raise RuntimeError(
125
+ f"Only found {len(batches)}/{samples} distinct sufficiently long documents"
126
+ )
127
+ checksum = hashlib.sha256()
128
+ for batch in batches:
129
+ checksum.update(batch["input_ids"].numpy().astype("<i8").tobytes())
130
+ metadata = {
131
+ "dataset": "DKYoon/SlimPajama-6B",
132
+ "revision": revision,
133
+ "split": "train",
134
+ "samples": samples,
135
+ "sequence_length": sequence_length,
136
+ "seed": seed,
137
+ "shuffle_buffer": shuffle_buffer,
138
+ "add_special_tokens": False,
139
+ "sampling": "one random window per distinct document",
140
+ "input_ids_sha256": checksum.hexdigest(),
141
+ "records": records,
142
+ }
143
+ return batches, metadata
144
+
145
+
146
+ @torch.inference_mode()
147
+ def collect_features(
148
+ model: nn.Module, batches: Sequence[dict[str, Tensor]], *, pooling: str = "mean"
149
+ ) -> list[np.ndarray]:
150
+ """One backbone forward per batch; block hooks avoid hidden-state off-by-one.
151
+
152
+ Collect outputs *before* the final backbone norm, including the final block.
153
+ Pool only valid tokens; activations are CPU float32 after pooling.
154
+ """
155
+ if pooling not in {"mean", "last"} or not batches:
156
+ raise ValueError("valid pooling and nonempty calibration batches are required")
157
+ layers = model.model.layers
158
+ features: list[list[Tensor]] = [[] for _ in layers]
159
+ current_mask: Tensor | None = None
160
+
161
+ def hook(index):
162
+ def capture(module, inputs, output):
163
+ hidden = output[0] if isinstance(output, (tuple, list)) else output
164
+ mask = current_mask.to(hidden.device, dtype=torch.bool)
165
+ if hidden.shape[:2] != mask.shape or (mask.sum(-1) == 0).any():
166
+ raise ValueError("block output and valid-token mask do not match")
167
+ if pooling == "mean":
168
+ value = (hidden.float() * mask[:, :, None]).sum(1) / mask.sum(1)[
169
+ :, None
170
+ ]
171
+ else:
172
+ positions = torch.arange(mask.shape[1], device=mask.device)[None, :]
173
+ last = positions.expand_as(mask).masked_fill(~mask, -1).max(1).values
174
+ value = hidden[
175
+ torch.arange(hidden.shape[0], device=hidden.device), last
176
+ ].float()
177
+ if not torch.isfinite(value).all():
178
+ raise FloatingPointError(f"nonfinite activation in block {index}")
179
+ features[index].append(value.cpu())
180
+
181
+ return capture
182
+
183
+ handles = [layer.register_forward_hook(hook(i)) for i, layer in enumerate(layers)]
184
+ was_training = model.training
185
+ model.eval()
186
+ try:
187
+ device = model.get_input_embeddings().weight.device
188
+ for batch in batches:
189
+ prepared = {key: value.to(device) for key, value in batch.items()}
190
+ current_mask = prepared.get(
191
+ "attention_mask", torch.ones_like(prepared["input_ids"])
192
+ )
193
+ model.model(**prepared, use_cache=False, return_dict=True)
194
+ finally:
195
+ for handle in handles:
196
+ handle.remove()
197
+ model.train(was_training)
198
+ expected = sum(batch["input_ids"].shape[0] for batch in batches)
199
+ arrays = [torch.cat(parts, dim=0).numpy() for parts in features]
200
+ if any(array.shape[0] != expected for array in arrays):
201
+ raise RuntimeError("not all calibration examples reached each decoder block")
202
+ return arrays
203
+
204
+
205
+ def diffusion_embedding(
206
+ features: np.ndarray, config: GeometryConfig
207
+ ) -> tuple[np.ndarray, dict]:
208
+ """Correctly shaped sample-by-sample diffusion kernel, following upstream SVD geometry."""
209
+ config.validate()
210
+ x = np.asarray(features, dtype=np.float64)
211
+ if x.ndim != 2 or not np.isfinite(x).all() or len(x) <= config.dimensions + 1:
212
+ raise ValueError(
213
+ "features must be finite [samples, features], samples > dimensions + 1"
214
+ )
215
+ distance = squareform(pdist(x, metric="euclidean"))
216
+ if distance.max() <= np.finfo(float).eps:
217
+ raise ValueError(
218
+ "constant calibration features: cannot estimate manifold geometry"
219
+ )
220
+ kernel = np.exp(-np.sqrt(distance / config.sigma))
221
+ p = kernel.sum(0)
222
+ normalized = kernel / np.outer(p, p) ** config.alpha
223
+ v = np.sqrt(normalized.sum(0))
224
+ operator = normalized / np.outer(v, v)
225
+ condition = float(np.linalg.cond(operator))
226
+ regularization = 1e-6 if not math.isfinite(condition) or condition > 1e12 else 0.0
227
+ if regularization:
228
+ operator += regularization * np.eye(len(x))
229
+ values, vectors = eigh(
230
+ operator, subset_by_index=(len(x) - config.dimensions - 1, len(x) - 1)
231
+ )
232
+ values, vectors = values[::-1], vectors[:, ::-1]
233
+ # Fix arbitrary eigenvector signs; the leading vector of this positive kernel is positive.
234
+ for dim in range(vectors.shape[1]):
235
+ if vectors[np.argmax(np.abs(vectors[:, dim])), dim] < 0:
236
+ vectors[:, dim] *= -1
237
+ if np.any(np.abs(vectors[:, 0]) < 1e-12):
238
+ raise FloatingPointError(
239
+ "diffusion normalization has a near-zero leading eigenvector"
240
+ )
241
+ embedding = vectors[:, 1:] / vectors[:, :1]
242
+ if not np.isfinite(embedding).all():
243
+ raise FloatingPointError("nonfinite diffusion embedding")
244
+ # Upstream uses per-axis rank normalization before its KNN estimators.
245
+ embedding = np.argsort(
246
+ np.argsort(embedding, axis=0, kind="stable"), axis=0, kind="stable"
247
+ ) / len(x)
248
+ return embedding, {
249
+ "samples": len(x),
250
+ "condition_number": condition if math.isfinite(condition) else None,
251
+ "regularization": regularization,
252
+ "eigenvalues": values.tolist(),
253
+ }
254
+
255
+
256
+ def entropy_knn(x: np.ndarray, neighbors: int) -> float:
257
+ """Upstream differential-entropy estimator, evaluated in log space."""
258
+ n, dimensions = x.shape
259
+ k = min(neighbors, n - 1)
260
+ distances = NearestNeighbors(n_neighbors=k + 1).fit(x).kneighbors(x)[0][:, -1]
261
+ if np.any(distances <= 0) or not np.isfinite(distances).all():
262
+ raise FloatingPointError(
263
+ "duplicate/degenerate manifold points in entropy estimator"
264
+ )
265
+ return float(math.log(n / k) + dimensions * np.log(distances).mean())
266
+
267
+
268
+ def npib_matrix(
269
+ embeddings: Sequence[np.ndarray], config: GeometryConfig
270
+ ) -> tuple[np.ndarray, list[float]]:
271
+ """Match upstream axis-wise MI average and symmetric sqrt(H_i*H_j) normalization.
272
+
273
+ Differential entropies can be negative. Preserve upstream's formula when
274
+ their product is positive; fail clearly for zero/negative products or NaNs.
275
+ This estimator is a heuristic, not a guaranteed [0, 1] similarity.
276
+ """
277
+ config.validate()
278
+ if not embeddings or len({x.shape for x in embeddings}) != 1:
279
+ raise ValueError("embeddings must have identical sample/coordinate shapes")
280
+ n = len(embeddings[0])
281
+ if n < 3 or any(not np.isfinite(x).all() for x in embeddings):
282
+ raise ValueError("need at least three finite manifold points")
283
+ entropies = [entropy_knn(x, config.entropy_neighbors) for x in embeddings]
284
+ scores = np.empty((len(embeddings), len(embeddings)), dtype=np.float64)
285
+ for i, left in enumerate(embeddings):
286
+ for j in range(i, len(embeddings)):
287
+ right = embeddings[j]
288
+ product = entropies[i] * entropies[j]
289
+ if not math.isfinite(product) or product <= 1e-12:
290
+ raise FloatingPointError(
291
+ f"invalid entropy product at ({i}, {j}): {entropies[i]}, {entropies[j]}"
292
+ )
293
+ mi = np.mean(
294
+ [
295
+ np.mean(
296
+ mutual_info_regression(
297
+ left,
298
+ right[:, dim],
299
+ n_neighbors=min(config.mi_neighbors, n - 1),
300
+ random_state=config.seed,
301
+ )
302
+ )
303
+ for dim in range(right.shape[1])
304
+ ]
305
+ )
306
+ scores[i, j] = scores[j, i] = mi / math.sqrt(product)
307
+ if not np.isfinite(scores).all():
308
+ raise FloatingPointError("NPIB contains nonfinite scores")
309
+ return scores, entropies
310
+
311
+
312
+ def upstream_lambda(
313
+ scores: np.ndarray, left: int, right: int, beta: float = 1.0
314
+ ) -> float:
315
+ """Exactly upstream's sigmoid(beta * row_mean_i / (row_mean_i + row_mean_j))."""
316
+ means = np.mean(scores[[left, right]], axis=1)
317
+ total = float(means.sum())
318
+ if not np.isfinite(means).all() or (means < 0).any() or total <= 1e-12:
319
+ raise FloatingPointError(
320
+ "cannot compute upstream lambda from nonpositive/nonfinite row means"
321
+ )
322
+ if not math.isfinite(beta) or beta < 0:
323
+ raise ValueError("beta must be non-negative and finite")
324
+ value = beta * float(means[0]) / total
325
+ return 1.0 / (1.0 + math.exp(-value))
326
+
327
+
328
+ def select_pair(
329
+ scores: np.ndarray,
330
+ *,
331
+ selection: str = "npib",
332
+ protected_first: int = 0,
333
+ protected_last: int = 0,
334
+ ) -> int:
335
+ """Adjacent pairs only; NPIB descending, and deeper pair wins exact ties."""
336
+ n = len(scores)
337
+ if scores.shape != (n, n) or not np.isfinite(scores).all():
338
+ raise ValueError("scores must be a finite square matrix")
339
+ if min(protected_first, protected_last) < 0:
340
+ raise ValueError("protected layer counts must be non-negative")
341
+ candidates = range(protected_first, n - protected_last - 1)
342
+ if not candidates:
343
+ raise ValueError("no eligible adjacent pair remains")
344
+ if selection == "back-to-front":
345
+ return candidates[-1]
346
+ if selection != "npib":
347
+ raise ValueError("selection must be 'npib' or 'back-to-front'")
348
+ return max(candidates, key=lambda i: (float(scores[i, i + 1]), i))
349
+
350
+
351
+ @torch.inference_mode()
352
+ def merge_pair(model: nn.Module, left: int, ratio: float) -> int:
353
+ """FP32 weighted sum copied into real parameters, then delete the right block."""
354
+ layers = model.model.layers
355
+ if (
356
+ not 0 <= left < len(layers) - 1
357
+ or not math.isfinite(ratio)
358
+ or not 0 <= ratio <= 1
359
+ ):
360
+ raise ValueError("invalid adjacent pair or merge ratio")
361
+ destination, source = layers[left], layers[left + 1]
362
+ pairs = []
363
+ for name in PROJECTION_WEIGHTS:
364
+ pairs.append((destination.get_parameter(name), source.get_parameter(name)))
365
+ # Qwen2.5 has Q/K/V biases. Fuse them with the same coefficient;
366
+ # Llama and Qwen3 (bias-free projections) retain their existing behavior.
367
+ module_name = name.rsplit('.', 1)[0]
368
+ a_bias = getattr(destination.get_submodule(module_name), 'bias', None)
369
+ b_bias = getattr(source.get_submodule(module_name), 'bias', None)
370
+ if (a_bias is None) != (b_bias is None):
371
+ raise ValueError('projection bias presence differs between merge layers')
372
+ if a_bias is not None:
373
+ pairs.append((a_bias, b_bias))
374
+ # Validate all shapes/values/config before any model mutation.
375
+ if any(a.shape != b.shape for a, b in pairs):
376
+ raise ValueError("projection shapes differ between merge layers")
377
+ if any(not torch.isfinite(p).all() for pair in pairs for p in pair):
378
+ raise FloatingPointError("nonfinite source weight")
379
+ configs = [model.config, model.model.config]
380
+ for config in configs:
381
+ types = getattr(config, "layer_types", None)
382
+ if types is not None and len(types) != len(layers):
383
+ raise ValueError("config.layer_types length does not match decoder depth")
384
+ changed = 0
385
+ for target, other in pairs:
386
+ merged = torch.lerp(
387
+ other.detach().to(target.device, dtype=torch.float32), target.float(), ratio
388
+ )
389
+ merged = merged.to(target.dtype)
390
+ if not torch.isfinite(merged).all():
391
+ raise FloatingPointError("merge overflow after conversion to model dtype")
392
+ changed += int(not torch.equal(target, merged))
393
+ target.copy_(merged)
394
+ del layers[left + 1]
395
+ handled = set()
396
+ for config in configs:
397
+ if id(config) in handled:
398
+ continue
399
+ handled.add(id(config))
400
+ config.num_hidden_layers = len(layers)
401
+ if getattr(config, "layer_types", None) is not None:
402
+ config.layer_types = list(config.layer_types[: left + 1]) + list(
403
+ config.layer_types[left + 2 :]
404
+ )
405
+ for index, layer in enumerate(layers):
406
+ if hasattr(layer.self_attn, "layer_idx"):
407
+ layer.self_attn.layer_idx = index
408
+ return changed
409
+
410
+
411
+ def progressive_prune(
412
+ model: nn.Module,
413
+ batches: Sequence[dict[str, Tensor]],
414
+ *,
415
+ target_layers: int,
416
+ geometry: GeometryConfig | None = None,
417
+ selection: str = "npib",
418
+ protected_first: int = 0,
419
+ protected_last: int = 0,
420
+ on_stage: Callable[[nn.Module, dict], None] | None = None,
421
+ ) -> list[dict]:
422
+ """Recompute activations/manifolds/NPIB on fixed data after every accepted merge.
423
+
424
+ No threshold or forced fallbacks; stop at the requested exact depth. Repeated
425
+ merging of a previously merged block is allowed and recorded in its lineage.
426
+ """
427
+ geometry = geometry or GeometryConfig()
428
+ geometry.validate()
429
+ depth = len(model.model.layers)
430
+ if min(protected_first, protected_last) < 0 or not 1 <= target_layers <= depth:
431
+ raise ValueError("invalid target depth or protected counts")
432
+ if target_layers < protected_first + protected_last + 1:
433
+ raise ValueError("target depth would remove protected layers")
434
+ if selection not in {"npib", "back-to-front"}:
435
+ raise ValueError("invalid selection mode")
436
+ lineage = [[i] for i in range(depth)]
437
+ records = []
438
+ model.eval()
439
+ while len(model.model.layers) > target_layers:
440
+ step = len(records) + 1
441
+ print(
442
+ f"MKA stage {step}: collecting features for {len(lineage)} layers",
443
+ flush=True,
444
+ )
445
+ features = collect_features(model, batches, pooling=geometry.pooling)
446
+ results = [diffusion_embedding(x, geometry) for x in features]
447
+ del features
448
+ scores, entropies = npib_matrix([x[0] for x in results], geometry)
449
+ left = select_pair(
450
+ scores,
451
+ selection=selection,
452
+ protected_first=protected_first,
453
+ protected_last=protected_last,
454
+ )
455
+ ratio = upstream_lambda(scores, left, left + 1, geometry.beta)
456
+ record = {
457
+ "step": step,
458
+ "selection": selection,
459
+ "left_index": left,
460
+ "source_layers": [lineage[left][:], lineage[left + 1][:]],
461
+ "pair_npib": float(scores[left, left + 1]),
462
+ "lambda_left": ratio,
463
+ "lambda_right": 1 - ratio,
464
+ "row_means": scores.mean(1).tolist(),
465
+ "npib_matrix": scores.tolist(),
466
+ "entropies": entropies,
467
+ "geometry": asdict(geometry),
468
+ "manifolds": [x[1] for x in results],
469
+ }
470
+ record["changed_parameter_tensors"] = merge_pair(model, left, ratio)
471
+ lineage[left] += lineage.pop(left + 1)
472
+ record["lineage_after"] = [x[:] for x in lineage]
473
+ record["remaining_layers"] = len(lineage)
474
+ records.append(record)
475
+ print(
476
+ f"MKA stage {step}: merge {left}/{left + 1}, NPIB={record['pair_npib']:.6g}, "
477
+ f"lambda={ratio:.6g}, remaining={len(lineage)}",
478
+ flush=True,
479
+ )
480
+ if on_stage is not None:
481
+ on_stage(model, record)
482
+ return records
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/fixed_span_merge_init.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """MLP-only merge rules; fixed topology and feature transport belong to caller.
2
+
3
+ CoMe importance/neuron scores and MKA manifold scores are measured on the
4
+ previous-cycle teacher, on the same calibration data. This helper consumes the
5
+ actual post-transport operands. No selector, attention merge, norm merge, or
6
+ teacher mutation is allowed here. These are hybrid controls, not native methods.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import copy
11
+ import hashlib
12
+ from types import SimpleNamespace
13
+
14
+ import torch
15
+
16
+ MLP_NAMES = ("mlp.gate_proj.weight", "mlp.up_proj.weight", "mlp.down_proj.weight")
17
+
18
+
19
+ def tensor_hash(value):
20
+ raw = value.detach().cpu().contiguous().view(torch.uint8).numpy().tobytes()
21
+ return hashlib.sha256(raw).hexdigest()
22
+
23
+
24
+ def frozen_hashes(layer):
25
+ return {n: tensor_hash(p) for n, p in layer.named_parameters() if n not in MLP_NAMES}
26
+
27
+
28
+ def build_initialization(a, transported_b, method, payload):
29
+ before_a, before_b = frozen_hashes(a), frozen_hashes(transported_b)
30
+ a_mlp = {n: tensor_hash(a.get_parameter(n)) for n in MLP_NAMES}
31
+ b_mlp = {n: tensor_hash(transported_b.get_parameter(n)) for n in MLP_NAMES}
32
+ if method == "come":
33
+ from fusegpt.come import merge_mlp
34
+ # Copy only the two MLPs, not the entire blocks/models. Preserve native
35
+ # channel concatenation order and BF16 rounding of the CoMe helper.
36
+ pair = [SimpleNamespace(mlp=copy.deepcopy(layer.mlp).cpu()) for layer in (a, transported_b)]
37
+ counts = merge_mlp(pair, payload["ratios"], payload["neuron_scores"])
38
+ result = {"mlp." + n: p.detach().float().clone() for n, p in pair[0].mlp.named_parameters()}
39
+ detail = {"retention_ratios": payload["ratios"], "retained_mlp_neurons": counts}
40
+ del pair
41
+ elif method == "mka":
42
+ ratio = float(payload["lambda_left"])
43
+ if not 0 <= ratio <= 1:
44
+ raise ValueError("Invalid MKA merge coefficient")
45
+ result = {n: torch.lerp(transported_b.get_parameter(n).detach().float(),
46
+ a.get_parameter(n).detach().float(), ratio) for n in MLP_NAMES}
47
+ detail = {"lambda_left": ratio, "lambda_right": 1 - ratio}
48
+ else:
49
+ raise ValueError(method)
50
+ assert set(result) == set(MLP_NAMES)
51
+ assert frozen_hashes(a) == before_a and frozen_hashes(transported_b) == before_b
52
+ assert {n: tensor_hash(a.get_parameter(n)) for n in MLP_NAMES} == a_mlp
53
+ assert {n: tensor_hash(transported_b.get_parameter(n)) for n in MLP_NAMES} == b_mlp
54
+ assert all(torch.isfinite(v).all() for v in result.values())
55
+ return result, {**detail, "source_weights": "post_feature_transport",
56
+ "scoring_context": "previous_cycle_teacher_before_transport",
57
+ "anchor_mlp_sha256": a_mlp, "transported_source_mlp_sha256": b_mlp,
58
+ "initial_mlp_sha256": {n: tensor_hash(v) for n, v in result.items()},
59
+ "frozen_anchor_sha256": before_a, "operands_unchanged_by_initializer": True}
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/fuse_layers.py ADDED
The diff for this file is too large to render. See raw diff
 
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/fuse_layers_distill.py ADDED
The diff for this file is too large to render. See raw diff
 
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/launch_qwen3_nofit_bench8.sh ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ project="$1"; root="$2"; model="$3"; alias="$4"
4
+ export HF_HOME=/workspace/.hf_home HF_TOKEN_PATH=/root/.cache/huggingface/token
5
+ export HF_DATASETS_CACHE=/workspace/.hf_datasets36 HF_DATASETS_TRUST_REMOTE_CODE=1
6
+ export PYTHONUNBUFFERED=1 TOKENIZERS_PARALLELISM=false OMP_NUM_THREADS=4 PYTHONPATH="$project/src"
7
+ mkdir -p "$root"
8
+ trap 'rc=$?; if ((rc)); then touch "$root/FAILED"; fi' EXIT
9
+ while [[ ! -f "$root/EVAL_READY" ]]; do [[ ! -f "$root/BOOTSTRAP_FAILED" ]] || exit 1; sleep 3; done
10
+ export HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1
11
+ run_arm() (
12
+ arm="$1"; export CUDA_VISIBLE_DEVICES="$2"; out="$root/full/$arm"; stage="$out/compact/stage_09"
13
+ trap 'rc=$?; if ((rc)); then touch "$root/${arm}_FAILED"; fi' EXIT
14
+ mkdir -p "$out/logs"
15
+ if [[ ! -f "$out/eval/final_opencompass5.json" ]]; then
16
+ python "$project/scripts/eval_opencompass_ppl_fast.py" --model "$model" --tokenizer "$model" \
17
+ --revision 49e3418fbbbca6ecbdf9608b4d22e5a407081db4 --compact-stage "$stage" --cycle 9 --anchor 12 \
18
+ --data-root "$root/eval_data/data" --max-batch 32 --token-budget 8192 \
19
+ --output "$out/eval/final_opencompass5.json" > "$out/logs/opencompass.log" 2>&1
20
+ fi
21
+ if [[ ! -f "$out/eval/new_lmeval3.json" ]]; then
22
+ python "$project/scripts/eval_llama31_8b_12bench.py" --model "$model" \
23
+ --revision 49e3418fbbbca6ecbdf9608b4d22e5a407081db4 --compact-stage "$stage" --cycle 9 --anchor 12 \
24
+ --batch-size auto:4 --tasks sciq mmlu cmmlu --dataset-cache "$root/lmeval_cache" --local-files-only \
25
+ --output "$out/eval/new_lmeval3.json" > "$out/logs/lmeval3.log" 2>&1
26
+ fi
27
+ python "$project/scripts/merge_nofit_existing_zs6.py" "$out/eval/zs6.json" "$out/eval/new_lmeval3.json" "$out/eval/final_lmeval9.json"
28
+ python "$project/scripts/aggregate_transport_rho_fit_14bench.py" "$out" > "$out/logs/aggregate.log"
29
+ touch "$out/EVAL_COMPLETE"
30
+ )
31
+ run_arm off 0 > "$root/off_pipeline.log" 2>&1 & off_pid=$!
32
+ run_arm on 1 > "$root/on_pipeline.log" 2>&1 & on_pid=$!
33
+ failed=0;for pid in "$off_pid" "$on_pid";do wait "$pid" || failed=1;done
34
+ ((failed==0)) || exit 1
35
+ python - "$root" "$project" <<'PY'
36
+ import json,shutil,subprocess,sys
37
+ from pathlib import Path
38
+ r,project=map(Path,sys.argv[1:]); backup=r/'backup';backup.mkdir(exist_ok=True)
39
+ old=json.loads((project/'results/qwen3_8b_base_nofit_transport_zs6_20261009/summary_with_ppl.json').read_text())
40
+ rows=[]
41
+ for row in old['rows']:
42
+ arm=row['transport'];out=r/'full'/arm
43
+ report=json.loads((out/'eval/final_14bench.json').read_text());scores=report['task_scores']
44
+ assert len(scores)==14
45
+ assert all(scores[k]==v for k,v in row['task_scores'].items())
46
+ row.update(task_scores=scores,zs12_avg=sum(v for k,v in scores.items() if k not in {'mmlu','cmmlu'})/12,
47
+ mmlu=scores['mmlu'],cmmlu=scores['cmmlu'],bench14_avg=report['macro_mean_14'],
48
+ zs6_preserved=True,new_task_count=8,weight_restore=json.loads((out/'restore_receipt.json').read_text()))
49
+ rows.append(row)
50
+ target=backup/arm;target.mkdir(exist_ok=True)
51
+ shutil.copytree(out/'eval',target/'eval',dirs_exist_ok=True)
52
+ shutil.copytree(out/'logs',target/'logs',dirs_exist_ok=True)
53
+ shutil.copy2(out/'restore_receipt.json',target/'restore_receipt.json')
54
+ summary={'rows':rows,'source_commit':subprocess.check_output(['git','-C',str(project),'rev-parse','HEAD'],text=True).strip(),
55
+ 'protocol':'Unchanged legacy OpenCompass5 + lm-eval9, BF16 eager, zero-shot; immutable existing ZS6 retained; only missing eight newly evaluated'}
56
+ (r/'summary.json').write_text(json.dumps(summary,indent=2)+'\n');shutil.copy2(r/'summary.json',backup/'summary.json')
57
+ code=backup/'code';code.mkdir(exist_ok=True)
58
+ for name in ['bootstrap_qwen3_nofit_bench8.sh','launch_qwen3_nofit_bench8.sh','merge_nofit_existing_zs6.py',
59
+ 'eval_llama31_8b_12bench.py','eval_opencompass_ppl_fast.py','aggregate_transport_rho_fit_14bench.py']:
60
+ shutil.copy2(project/'scripts'/name,code/name)
61
+ shutil.copy2(project/'exp_md/2026-10-09_qwen3-base-nofit-bench14-supplement.md',backup/'protocol.md')
62
+ PY
63
+ python "$project/scripts/write_tree_manifest.py" "$root/backup"
64
+ HF_HUB_OFFLINE=0 HF_DATASETS_OFFLINE=0 TRANSFORMERS_OFFLINE=0 \
65
+ python "$project/scripts/upload_verified_hf_tree.py" "$root/backup" --repo-id LJYAI/paper_revision \
66
+ --path-in-repo "runs/$alias/20261009-qwen3-base-nofit-bench14-supplement" --verify-all-files \
67
+ --commit-message 'Qwen3 Base Fisher Transport OFF ON no-FiT remaining eight tasks, existing ZS6 preserved' > "$root/backup.json"
68
+ touch "$root/COMPLETE"
69
+ echo 'COMPLETE: results backed up; instance retained by explicit user request.'
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/launch_qwen3_nofit_merge4.sh ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ project="$1"; external="$2"; root="$3"; model="$4"; alias="$5"
4
+ export HF_HOME=/workspace/.hf_home HF_TOKEN_PATH=/root/.cache/huggingface/token
5
+ export HF_DATASETS_CACHE=/workspace/.hf_datasets36 PYTHONUNBUFFERED=1 TOKENIZERS_PARALLELISM=false OMP_NUM_THREADS=4
6
+ export PYTHONPATH="$external/src:$project/src:$project"
7
+ export HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1
8
+ revision=49e3418fbbbca6ecbdf9608b4d22e5a407081db4
9
+ trap 'rc=$?; if ((rc)); then touch "$root/FAILED"; fi' EXIT
10
+ while [[ ! -f "$root/INPUTS_READY" ]]; do [[ ! -f "$root/BOOTSTRAP_FAILED" ]] || exit 1; sleep 3; done
11
+ run_prune() {
12
+ local arm="$1" gpu="$2" out="$3" cycles="$4"
13
+ mkdir -p "$out/logs" "$out/audit" "$out/eval"
14
+ CUDA_VISIBLE_DEVICES="$gpu" python "$project/scripts/run_qwen3_nofit_merge_control.py" \
15
+ --external-root "$external" --inputs "$root/inputs" --audit-root "$out/audit" --initializer "$arm" \
16
+ --model "$model" --output_dir "$out/run" --layer 12 --num_progressive "$cycles" \
17
+ --dataset slimpajama --dataset_config none --num_samples 64 --seed 42 --seq_len 1024 --batch_size 2 \
18
+ --skip_distill --norm_policy copy_n1_n2 --fisher_mode param --eps 0 \
19
+ --no_head_permute_merge --no_head_permute_select --source_feature_transport \
20
+ --source_feature_transport_ridge_relative 1e-3 --dtype bfloat16 --eval_dtype bfloat16 \
21
+ --lora_epochs 0 --skip_eval --skip_final_model_save > "$out/logs/prune.log" 2>&1
22
+ python -m fusegpt.abprune_compact --run-root "$out/run" --output-root "$out/compact" \
23
+ --model Qwen/Qwen3-8B-Base --base-revision "$revision" --run-id "qwen3_base_nofit_merge_${arm}_20261011" \
24
+ --cycles "$cycles" --hard-link --layer-order "$(python -c "print(' '.join(['12']*$cycles))")"
25
+ python "$project/scripts/verify_qwen3_nofit_merge.py" "$out" "$arm" "$cycles"
26
+ touch "$out/PRUNE_COMPLETE"
27
+ }
28
+ job() (
29
+ arm="$1"; gpu="$2"; out="$root/full/$arm"; smoke="$root/smoke/$arm"
30
+ trap 'rc=$?; if ((rc)); then touch "$root/${arm}_FAILED"; fi' EXIT
31
+ [[ -f "$smoke/PRUNE_COMPLETE" ]] || run_prune "$arm" "$gpu" "$smoke" 2
32
+ for other in wa wb average mka; do
33
+ while [[ ! -f "$root/smoke/$other/PRUNE_COMPLETE" ]]; do
34
+ [[ ! -f "$root/${other}_FAILED" ]] || exit 1; sleep 3
35
+ done
36
+ done
37
+ [[ -f "$out/PRUNE_COMPLETE" ]] || run_prune "$arm" "$gpu" "$out" 9
38
+ cp "$root/full/base/offline_eval.json" "$out/offline_eval.json"
39
+ [[ -f "$out/eval/local_mse.json" ]] || CUDA_VISIBLE_DEVICES="$gpu" python "$project/scripts/qwen3_nofit_local_mse.py" \
40
+ --model "$model" --cache "$root/local_mse_reference" --compact-stage "$out/compact/stage_09" \
41
+ --output "$out/eval/local_mse.json" > "$out/logs/local_mse.log" 2>&1
42
+ [[ -f "$out/eval/final_ppl.json" ]] || CUDA_VISIBLE_DEVICES="$gpu" python "$project/scripts/evaluate_abprune_compact_ppl.py" \
43
+ --model "$model" --revision "$revision" --compact-stage "$out/compact/stage_09" --anchor 12 --cycles 9 \
44
+ --original-layers 36 --seq-len 2048 --batch-size 1 --output "$out/eval/final_ppl.json" > "$out/logs/ppl.log" 2>&1
45
+ MODEL_REVISION="$revision" LMEVAL_LOCAL_CACHE="$root/lmeval_cache" \
46
+ bash "$project/scripts/eval_llama31_fit_ablation_one.sh" "$project" "$out" "$model" "$root/eval_data/data" "$(command -v python)" 12 9 "$gpu"
47
+ touch "$out/EVAL_COMPLETE"
48
+ backup="$root/backup/$arm"
49
+ python "$project/scripts/package_qwen3_nofit_merge_backup.py" "$out" "$backup" "$project" "$external" "$root"
50
+ python "$project/scripts/write_tree_manifest.py" "$backup"
51
+ HF_HUB_OFFLINE=0 HF_DATASETS_OFFLINE=0 TRANSFORMERS_OFFLINE=0 python "$project/scripts/upload_verified_hf_tree.py" \
52
+ "$backup" --repo-id LJYAI/paper_revision --path-in-repo "runs/$alias/20261011-qwen3-base-nofit-merge4/$arm" \
53
+ --verify-all-files --commit-message "Qwen3 base no-FiT merge control $arm; all9 stages" > "$root/${arm}_backup.json"
54
+ touch "$out/BACKUP_COMPLETE"
55
+ )
56
+ pids=(); gpu=0
57
+ for arm in wa wb average mka; do job "$arm" "$gpu" > "$root/${arm}_pipeline.log" 2>&1 & pids+=("$!"); gpu=$((gpu+1)); done
58
+ failed=0; for pid in "${pids[@]}"; do wait "$pid" || failed=1; done
59
+ ((failed==0)) || exit 1
60
+ python "$project/scripts/summarize_qwen3_nofit_merge.py" "$root" "$project"
61
+ git -C "$project" add results/qwen3_base_nofit_merge4_20261011
62
+ git -C "$project" commit -m 'Record four Qwen3 no-FiT transported merge controls and verified all-stage backups'
63
+ touch "$root/COMPLETE" "$root/RECORDS_COMMITTED"
64
+ echo 'Complete; retain instance until explicitly authorized to return.'
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/launch_qwen3_nofit_transport_zs6.sh ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ project="$1"; external="$2"; root="$3"; model="$4"; alias="$5"
4
+ source "$project/scripts/qwen3_nofit_transport_config.sh"
5
+ export HF_HOME=/workspace/.hf_home HF_TOKEN_PATH=/root/.cache/huggingface/token
6
+ export HF_DATASETS_CACHE=/workspace/.hf_datasets36 PYTHONUNBUFFERED=1
7
+ export PYTHONPATH="$project/src:$external/src:$project"
8
+ trap 'rc=$?; if ((rc)); then touch "$root/FAILED"; fi' EXIT
9
+ prepare_eval() (
10
+ trap 'rc=$?; if ((rc)); then touch "$root/EVAL_FAILED"; fi' EXIT
11
+ while [[ ! -f "$root/DEPS_READY" || ! -f "$root/EVAL_ASSETS_READY" ]]; do [[ ! -f "$root/BOOTSTRAP_FAILED" ]] || exit 1; sleep 3; done
12
+ tar -xzf "$root/lmeval-cache-131.tar.gz" -C "$root"
13
+ HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 python "$project/scripts/prepare_lmeval9_local_cache.py" "$root/lmeval_cache" --validate-local
14
+ touch "$root/EVAL_READY"
15
+ )
16
+ prepare_eval > "$root/eval_prepare.log" 2>&1 & eval_pid=$!
17
+ verify() {
18
+ python - "$1" "$2" "$3" <<'PY'
19
+ import json,sys,os
20
+ from pathlib import Path
21
+ r=Path(sys.argv[1]); arm=sys.argv[2]; cycles=int(sys.argv[3])
22
+ anchor=int(os.environ['NOFIT_ANCHOR'])
23
+ for c in range(1,cycles+1):
24
+ m=json.loads((r/f'run/cycle_{c}/cycle_metadata.json').read_text())
25
+ f=json.loads((r/f'audit/cycle_{c:02d}_fit.json').read_text())
26
+ assert m['layer_merged']==anchor and m['num_layers_after']==36-c
27
+ assert m['fisher_num_batches']==32
28
+ assert m['distill']['reparam_skip_train'] and not m['distill']['reparam_stats']['trained']
29
+ assert f['attention_norm_unchanged'] and f['stats']['epochs']==0
30
+ assert bool(m['source_feature_transport'])==(arm=='on')
31
+ assert not m['lora']['enabled'] and not (m['comm'] or {}).get('enabled',False)
32
+ meta=json.loads((r/f'compact/stage_{cycles:02d}/metadata.json').read_text())
33
+ assert meta['removed_original_layers']==list(range(anchor+1,anchor+1+cycles))
34
+ assert meta['model']==os.environ['NOFIT_MODEL_ID'] and meta['base_model_revision']==os.environ['NOFIT_MODEL_REVISION']
35
+ if meta['format']=='abprune_compact_stage_v2':
36
+ assert meta['active_original_layers']==list(range(anchor+1))+list(range(anchor+1+cycles,36))
37
+ else:
38
+ assert meta['anchor_index']==anchor and meta['removed_count']==cycles
39
+ print('MATCHED_FISHER_NO_FIT_VERIFIED',arm,cycles,flush=True)
40
+ PY
41
+ }
42
+ job() (
43
+ arm="$1"; gpu="$2"
44
+ trap 'rc=$?; if ((rc)); then touch "$root/${arm}_FAILED"; fi' EXIT
45
+ while [[ ! -f "$root/BASE_READY" ]]; do [[ ! -f "$root/BOOTSTRAP_FAILED" ]] || exit 1; sleep 3; done
46
+ smoke="$root/smoke/$arm"; out="$root/full/$arm"
47
+ if [[ ! -f "$smoke/VERIFIED" ]]; then
48
+ if [[ ! -f "$smoke/PRUNE_COMPLETE" ]]; then
49
+ bash "$project/scripts/run_qwen3_nofit_transport_arm.sh" "$project" "$external" "$smoke" "$model" "$arm" "$gpu" 2
50
+ fi
51
+ verify "$smoke" "$arm" 2; touch "$smoke/VERIFIED"
52
+ fi
53
+ while [[ ! -f "$root/smoke/off/VERIFIED" || ! -f "$root/smoke/on/VERIFIED" ]]; do
54
+ [[ ! -f "$root/off_FAILED" && ! -f "$root/on_FAILED" ]] || exit 1; sleep 2
55
+ done
56
+ python - "$root" <<'PY'
57
+ import json,sys
58
+ from pathlib import Path
59
+ r=Path(sys.argv[1])
60
+ assert json.loads((r/'smoke/off/audit/data_fingerprints.json').read_text())==json.loads((r/'smoke/on/audit/data_fingerprints.json').read_text())
61
+ print('PAIRED_SMOKE_DATA_IDENTICAL',flush=True)
62
+ PY
63
+ if [[ ! -f "$out/PRUNE_COMPLETE" ]]; then
64
+ bash "$project/scripts/run_qwen3_nofit_transport_arm.sh" "$project" "$external" "$out" "$model" "$arm" "$gpu" 9
65
+ fi
66
+ verify "$out" "$arm" 9
67
+ while [[ ! -f "$root/EVAL_READY" ]]; do [[ ! -f "$root/EVAL_FAILED" ]] || exit 1; sleep 3; done
68
+ if [[ ! -f "$out/eval/zs6.json" ]]; then
69
+ CUDA_VISIBLE_DEVICES="$gpu" HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
70
+ python "$project/scripts/eval_abprune_compact_zeroshot.py" --model "$model" \
71
+ --revision "$NOFIT_MODEL_REVISION" --compact-stage "$out/compact/stage_09" \
72
+ --cycle 9 --anchor "$NOFIT_ANCHOR" --batch-size 8 --dataset-cache "$root/lmeval_cache" --output "$out/eval/zs6.json" > "$out/logs/zs6.log" 2>&1
73
+ fi
74
+ if [[ "$NOFIT_MEASURE_PPL" == 1 && ! -f "$out/eval/final_ppl.json" ]]; then
75
+ CUDA_VISIBLE_DEVICES="$gpu" HF_HUB_OFFLINE=1 HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
76
+ python "$project/scripts/evaluate_abprune_compact_ppl.py" --model "$model" --revision "$NOFIT_MODEL_REVISION" \
77
+ --compact-stage "$out/compact/stage_09" --anchor "$NOFIT_ANCHOR" --cycles 9 --original-layers 36 \
78
+ --seq-len 2048 --batch-size 4 --output "$out/eval/final_ppl.json" > "$out/logs/ppl.log" 2>&1
79
+ fi
80
+ touch "$out/EVAL_COMPLETE"
81
+ backup="$root/backup/$arm"
82
+ if [[ ! -d "$backup" ]]; then
83
+ python "$project/scripts/package_final_fit_backup.py" "$out" "$backup" "$project" "$external" \
84
+ --protocol "$NOFIT_PROTOCOL" --cycles 9 --original-layers 36
85
+ cp "$project/scripts/run_qwen3_nofit_transport_control.py" "$project/scripts/run_qwen3_nofit_transport_arm.sh" \
86
+ "$project/scripts/launch_qwen3_nofit_transport_zs6.sh" "$project/scripts/qwen3_nofit_transport_config.sh" \
87
+ "$project/scripts/eval_abprune_compact_zeroshot.py" "$backup/code/"
88
+ git -C "$project" rev-parse HEAD > "$backup/code/project_commit.txt"
89
+ python "$project/scripts/write_tree_manifest.py" "$backup"
90
+ fi
91
+ HF_HUB_OFFLINE=0 HF_DATASETS_OFFLINE=0 TRANSFORMERS_OFFLINE=0 \
92
+ python "$project/scripts/upload_verified_hf_tree.py" "$backup" --repo-id LJYAI/paper_revision \
93
+ --path-in-repo "runs/$alias/$NOFIT_RUN_SLUG/$arm" --verify-all-files \
94
+ --commit-message "Qwen3 ${QWEN_NOFIT_VARIANT:-base} matched Fisher transport $arm no FiT" > "$root/${arm}_backup.json"
95
+ touch "$out/BACKUP_COMPLETE"
96
+ )
97
+ job off 0 > "$root/off_pipeline.log" 2>&1 & off_pid=$!
98
+ job on 1 > "$root/on_pipeline.log" 2>&1 & on_pid=$!
99
+ failed=0; for pid in "$off_pid" "$on_pid" "$eval_pid"; do wait "$pid" || failed=1; done
100
+ ((failed==0)) || exit 1
101
+ python - "$root" <<'PY'
102
+ import json,sys,os
103
+ from pathlib import Path
104
+ r=Path(sys.argv[1]); rows=[]; fingerprints=[]
105
+ anchor=int(os.environ['NOFIT_ANCHOR'])
106
+ for arm in ['off','on']:
107
+ out=r/'full'/arm; result=json.loads((out/'eval/zs6.json').read_text())
108
+ fp=json.loads((out/'audit/data_fingerprints.json').read_text()); fingerprints.append(fp)
109
+ rows.append(dict(model=os.environ['NOFIT_MODEL_ID'],model_revision=os.environ['NOFIT_MODEL_REVISION'],removed_blocks=9,anchor=anchor,removed_original_layers=list(range(anchor+1,anchor+10)),
110
+ transport=arm,fit=False,fisher='same_anchor_contextual',task_scores=result['task_scores'],
111
+ zs6=result['six_task_mean'],backup=json.loads((r/f'{arm}_backup.json').read_text())))
112
+ if os.environ['NOFIT_MEASURE_PPL']=='1':
113
+ ppl=json.loads((out/'eval/final_ppl.json').read_text())
114
+ assert ppl['metrics']['sequences']==145 and ppl['metrics']['tokens']==296815
115
+ rows[-1]['ppl']=ppl['metrics']['perplexity']
116
+ assert fingerprints[0]==fingerprints[1]
117
+ (r/'summary.json').write_text(json.dumps(rows,indent=2)+'\n')
118
+ PY
119
+ touch "$root/COMPLETE"
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/monitor_qwen3_nofit_bench8.ps1 ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ param(
2
+ [string]$HostAlias='vast-paper_revision-qwen3-base-nofit-bench8-54984557-20261009',
3
+ [string]$LogDirectory='C:\Users\CELL\orca\artifacts\paper_revision\qwen3-base-nofit-bench8-20261009-monitor',
4
+ [ValidatePattern('^/workspace/artifacts/[A-Za-z0-9._-]+$')]
5
+ [string]$RemoteRoot='/workspace/artifacts/qwen3-base-nofit-bench8-20261009',
6
+ [ValidateRange(30,3600)][int]$IntervalSeconds=180
7
+ )
8
+ $ErrorActionPreference='Stop'
9
+ New-Item -ItemType Directory -Force -Path $LogDirectory | Out-Null
10
+ $poll=@'
11
+ from pathlib import Path
12
+ import json,re,time,subprocess
13
+ r=Path('__ROOT__')
14
+ def tail(p):
15
+ return [re.sub(r'https?://\S+','[URL omitted]',s)[-500:] for s in p.read_text(errors='replace').splitlines()[-2:]] if p.exists() else []
16
+ arms={}
17
+ for arm in ['off','on']:
18
+ d=r/'full'/arm
19
+ arms[arm]={'markers':[m for m in ['EVAL_COMPLETE','BENCH14_COMPLETE'] if (d/m).exists()],
20
+ 'logs':{n:tail(d/'logs'/n) for n in ['opencompass.log','lmeval3.log']},
21
+ 'results':[p.name for p in (d/'eval').glob('*.json')]}
22
+ print('SNAPSHOT_JSON='+json.dumps({'utc':time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime()),
23
+ 'failed':any((r/m).exists() for m in ['FAILED','BOOTSTRAP_FAILED','off_FAILED','on_FAILED']),
24
+ 'complete':(r/'COMPLETE').exists(),'markers':[m for m in ['BASE_READY','EVAL_ASSETS_READY','EVAL_READY','BOOTSTRAP_COMPLETE'] if (r/m).exists()],
25
+ 'arms':arms,'logs':{n:tail(r/n) for n in ['bootstrap.log','controller.log','off_pipeline.log','on_pipeline.log']}}))
26
+ print(subprocess.check_output(['nvidia-smi','--query-gpu=index,utilization.gpu,memory.used','--format=csv,noheader'],text=True))
27
+ '@
28
+ $poll=$poll.Replace('__ROOT__',$RemoteRoot)
29
+ $payload=[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($poll.Replace("`r`n","`n")))
30
+ while($true){
31
+ $lines=@(& ssh -o BatchMode=yes -o ConnectTimeout=15 -o ServerAliveInterval=15 -o ServerAliveCountMax=2 $HostAlias "printf %s $payload | base64 -d | python")
32
+ $code=$LASTEXITCODE
33
+ Add-Content -LiteralPath (Join-Path $LogDirectory 'poll.log') -Value (@((Get-Date -Format o))+$lines) -Encoding UTF8
34
+ $line=$lines | Where-Object {$_ -like 'SNAPSHOT_JSON=*'} | Select-Object -Last 1
35
+ if($code -eq 0 -and $line){
36
+ $snapshot=$line.Substring('SNAPSHOT_JSON='.Length) | ConvertFrom-Json
37
+ if($snapshot.failed){throw 'Benchmark supplement failed; instance retained.'}
38
+ if($snapshot.complete){
39
+ $dest=Join-Path $LogDirectory 'completed_results';New-Item -ItemType Directory -Force -Path $dest | Out-Null
40
+ foreach($name in @('summary.json','backup.json','execution.json')){
41
+ & scp -O "${HostAlias}:${RemoteRoot}/$name" (Join-Path $dest $name)
42
+ if($LASTEXITCODE -ne 0){throw "Recovery failed: $name"}
43
+ }
44
+ foreach($arm in @('off','on')){
45
+ $folder=Join-Path $dest $arm;New-Item -ItemType Directory -Force -Path $folder | Out-Null
46
+ & scp -O "${HostAlias}:${RemoteRoot}/full/$arm/eval/*.json" $folder
47
+ if($LASTEXITCODE -ne 0){throw "Score recovery failed: $arm"}
48
+ & scp -O "${HostAlias}:${RemoteRoot}/full/$arm/restore_receipt.json" $folder
49
+ if($LASTEXITCODE -ne 0){throw "Restore receipt recovery failed: $arm"}
50
+ }
51
+ $receipt=Get-Content (Join-Path $dest 'backup.json') -Raw | ConvertFrom-Json
52
+ if(-not $receipt.verified -or -not $receipt.all_payload_hashes_match){throw 'Backup verification missing'}
53
+ Add-Content (Join-Path $LogDirectory 'poll.log') 'COMPLETE: scores recovered; instance retained by user request.'
54
+ break
55
+ }
56
+ }
57
+ Start-Sleep -Seconds $IntervalSeconds
58
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/monitor_qwen3_nofit_merge4.ps1 ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ param(
2
+ [string]$HostAlias='vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011',
3
+ [string]$RemoteRoot='/workspace/artifacts/qwen3-base-nofit-merge4-20261011',
4
+ [string]$LogDirectory='C:\Users\CELL\orca\artifacts\paper_revision\qwen3-base-nofit-merge4-55359231-20261011-monitor',
5
+ [int]$IntervalSeconds=300
6
+ )
7
+ $ErrorActionPreference='Stop'
8
+ New-Item -ItemType Directory -Force -Path $LogDirectory | Out-Null
9
+ if ($RemoteRoot -notmatch '^/workspace/artifacts/[a-zA-Z0-9._-]+$') { throw 'Unsafe root' }
10
+ $taskPoll=@'
11
+ from pathlib import Path
12
+ import json,subprocess,re,datetime
13
+ r=Path('__ROOT__')
14
+ def tail(p):
15
+ return [re.sub(r'https?://\S+','[URL]',s)[-500:] for s in p.read_text(errors='replace').splitlines()[-3:]] if p.exists() else []
16
+ arms={}
17
+ for arm in ('wa','wb','average','mka'):
18
+ a=r/'full'/arm
19
+ arms[arm]=dict(cycles=len(list((a/'run').glob('cycle_*/cycle_metadata.json'))),
20
+ smoke_cycles=len(list((r/'smoke'/arm/'run').glob('cycle_*/cycle_metadata.json'))),
21
+ markers=[x for x in ('PRUNE_COMPLETE','EVAL_COMPLETE','BACKUP_COMPLETE') if (a/x).exists()],
22
+ logs={str(p):tail(a/p) for p in map(Path,['logs/prune.log','logs/local_mse.log','logs/ppl.log','logs/eval14.log'])})
23
+ state=dict(utc=datetime.datetime.now(datetime.timezone.utc).isoformat(),
24
+ failed=[p.name for p in r.glob('*FAILED')], complete=(r/'RECORDS_COMMITTED').exists(),
25
+ markers=[x for x in ('DEPS_READY','BASE_READY','DATA_READY','EVAL_READY','COMMON_TEACHER_READY','INPUTS_READY','COMPLETE') if (r/x).exists()],
26
+ logs={str(p):tail(r/p) for p in map(Path,['bootstrap.log','controller.log','data_prepare.log','local_mse_prepare.log'])},arms=arms)
27
+ print('SNAPSHOT_JSON='+json.dumps(state))
28
+ print(subprocess.check_output(['nvidia-smi','--query-gpu=index,utilization.gpu,memory.used','--format=csv,noheader'],text=True))
29
+ '@
30
+ $taskPoll=$taskPoll.Replace('__ROOT__',$RemoteRoot)
31
+ $taskEncoded=[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($taskPoll.Replace("`r`n","`n")))
32
+ while ($true) {
33
+ $taskPreference=$ErrorActionPreference
34
+ $ErrorActionPreference='Continue'
35
+ $taskLines=@(& ssh -o BatchMode=yes -o ConnectTimeout=15 -o ServerAliveInterval=15 -o ServerAliveCountMax=2 $HostAlias "printf %s $taskEncoded | base64 -d | python" 2>$null)
36
+ $ErrorActionPreference=$taskPreference
37
+ $taskLine=$taskLines | Where-Object { $_ -like 'SNAPSHOT_JSON=*' } | Select-Object -Last 1
38
+ Add-Content -LiteralPath (Join-Path $LogDirectory 'poll.log') -Value (@((Get-Date -Format o))+$taskLines) -Encoding UTF8
39
+ if ($taskLine) {
40
+ $taskState=$taskLine.Substring(14) | ConvertFrom-Json
41
+ if ($taskState.failed.Count -gt 0) { throw 'Experiment failed; retained. Inspect poll.log.' }
42
+ if ($taskState.complete) {
43
+ & powershell.exe -NoProfile -ExecutionPolicy Bypass -File (Join-Path $PSScriptRoot '../receive-project.ps1') -HostAlias $HostAlias
44
+ if ($LASTEXITCODE -ne 0) { throw 'Commit recovery failed' }
45
+ & git -C (Join-Path $PSScriptRoot '..') push origin "codex/$HostAlias"
46
+ if ($LASTEXITCODE -ne 0) { throw 'Local push failed' }
47
+ Add-Content -LiteralPath (Join-Path $LogDirectory 'poll.log') -Value 'COMPLETE: result commit recovered and pushed; instance retained.'
48
+ break
49
+ }
50
+ }
51
+ Start-Sleep -Seconds $IntervalSeconds
52
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/monitor_qwen3_nofit_transport_zs6.ps1 ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ param(
2
+ [string]$HostAlias='vast-paper_revision-qwen3-base-nofit-transport-zs6-54974094-20261009',
3
+ [string]$LogDirectory='C:\Users\CELL\orca\artifacts\paper_revision\qwen3-base-nofit-transport-zs6-20261009-monitor',
4
+ [string]$RemoteRoot='/workspace/artifacts/qwen3-base-nofit-transport-zs6-20261009',
5
+ [ValidateRange(30,3600)][int]$IntervalSeconds=300,
6
+ [ValidateRange(1,40)][int]$RemovedBlocks=9,
7
+ [switch]$FullBench14
8
+ )
9
+ $ErrorActionPreference='Stop'
10
+ New-Item -ItemType Directory -Force -Path $LogDirectory | Out-Null
11
+ $root=$RemoteRoot
12
+ if ($root -notmatch '^/workspace/artifacts/[A-Za-z0-9._-]+$') { throw 'Unsafe remote artifact root' }
13
+ $poll=@'
14
+ from pathlib import Path
15
+ import json,re,time,subprocess
16
+ r=Path('__REMOTE_ROOT__')
17
+ def tail(p):
18
+ return [re.sub(r'https?://\S+','[URL omitted]',s)[-500:] for s in p.read_text(errors='replace').splitlines()[-3:]] if p.exists() else []
19
+ arms={}
20
+ for arm in ['off','on']:
21
+ d=r/'full'/arm;s=r/'smoke'/arm
22
+ arms[arm]={'smoke_verified':(s/'VERIFIED').exists(),
23
+ 'markers':[m for m in ['PRUNE_COMPLETE','EVAL_COMPLETE','BACKUP_COMPLETE'] if (d/m).exists()],
24
+ 'cycles':len(list((d/'run').glob('cycle_*/cycle_metadata.json'))),
25
+ 'logs':{phase:{n:tail(r/phase/arm/'logs'/n) for n in ['prune.log','zs6.log','ppl.log','eval14.log']} for phase in ['smoke','full']}}
26
+ print('SNAPSHOT_JSON='+json.dumps({'utc':time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime()),
27
+ 'failed':any((r/m).exists() for m in ['FAILED','BOOTSTRAP_FAILED','EVAL_FAILED','off_FAILED','on_FAILED']),
28
+ 'complete':(r/'COMPLETE').exists(),'arms':arms,
29
+ 'logs':{n:tail(r/n) for n in ['bootstrap.log','eval_prepare.log','controller.log','off_pipeline.log','on_pipeline.log']}}))
30
+ print(subprocess.check_output(['nvidia-smi','--query-gpu=index,utilization.gpu,memory.used','--format=csv,noheader'],text=True))
31
+ '@
32
+ $poll=$poll.Replace('__REMOTE_ROOT__',$root)
33
+ $payload=[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($poll.Replace("`r`n","`n")))
34
+ while ($true) {
35
+ $lines=@(& ssh -o BatchMode=yes -o ConnectTimeout=15 -o ServerAliveInterval=15 -o ServerAliveCountMax=2 $HostAlias "printf %s $payload | base64 -d | python")
36
+ $code=$LASTEXITCODE
37
+ Add-Content -LiteralPath (Join-Path $LogDirectory 'poll.log') -Value (@((Get-Date -Format o))+$lines) -Encoding UTF8
38
+ $line=$lines | Where-Object { $_ -like 'SNAPSHOT_JSON=*' } | Select-Object -Last 1
39
+ if ($code -eq 0 -and $line) {
40
+ $snapshot=$line.Substring('SNAPSHOT_JSON='.Length) | ConvertFrom-Json
41
+ if ($snapshot.failed) { throw 'No-FiT transport control failed; inspect logs. Instance retained.' }
42
+ if ($snapshot.complete) {
43
+ $dest=Join-Path $LogDirectory 'completed_results'
44
+ New-Item -ItemType Directory -Force -Path $dest | Out-Null
45
+ & scp "${HostAlias}:${root}/summary.json" (Join-Path $dest 'summary.json')
46
+ if ($LASTEXITCODE -ne 0) { throw 'Summary recovery failed' }
47
+ foreach ($arm in @('off','on')) {
48
+ $folder=Join-Path $dest $arm
49
+ New-Item -ItemType Directory -Force -Path $folder | Out-Null
50
+ if ($FullBench14) {
51
+ & scp -O "${HostAlias}:${root}/full/${arm}/eval/*.json" $folder
52
+ } else {
53
+ & scp "${HostAlias}:${root}/full/${arm}/eval/zs6.json" (Join-Path $folder 'zs6.json')
54
+ }
55
+ if ($LASTEXITCODE -ne 0) { throw "Evaluation recovery failed: $arm" }
56
+ if ($rowHasPpl = ($snapshot.arms.$arm.logs.full.'ppl.log'.Count -gt 0)) {
57
+ & scp "${HostAlias}:${root}/full/${arm}/eval/final_ppl.json" (Join-Path $folder 'final_ppl.json')
58
+ if ($LASTEXITCODE -ne 0) { throw "PPL recovery failed: $arm" }
59
+ }
60
+ & scp -r "${HostAlias}:${root}/full/${arm}/audit" $folder
61
+ if ($LASTEXITCODE -ne 0) { throw "Audit recovery failed: $arm" }
62
+ & scp "${HostAlias}:${root}/${arm}_backup.json" (Join-Path $folder 'backup.json')
63
+ if ($LASTEXITCODE -ne 0) { throw "Backup receipt recovery failed: $arm" }
64
+ }
65
+ $rows=Get-Content -LiteralPath (Join-Path $dest 'summary.json') -Raw -Encoding UTF8 | ConvertFrom-Json
66
+ if ($FullBench14) { $rows=$rows.rows }
67
+ if ($rows.Count -ne 2) { throw 'Expected two completed arms' }
68
+ foreach ($row in $rows) {
69
+ if ($row.fit -or $row.removed_blocks -ne $RemovedBlocks -or -not $row.backup.verified -or -not $row.backup.all_payload_hashes_match) {
70
+ throw 'Protocol/backup mismatch'
71
+ }
72
+ }
73
+ Add-Content -LiteralPath (Join-Path $LogDirectory 'poll.log') -Value 'COMPLETE: both controls recovered; instance retained.'
74
+ break
75
+ }
76
+ }
77
+ Start-Sleep -Seconds $IntervalSeconds
78
+ }
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/nofit_merge_control.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Exact non-Fisher merge controls; never construct an optimizer or FiT U."""
2
+ from __future__ import annotations
3
+
4
+ import torch
5
+ from fusegpt.fixed_span_merge_init import MLP_NAMES, tensor_hash
6
+ from fusegpt.fit_ablation_mka import PROJECTION_WEIGHTS
7
+
8
+
9
+ def merge_in_place(a, transported_b, method, *, mka_lambda=None):
10
+ ratio = {"wa": 1., "wb": 0., "average": .5}.get(method, mka_lambda)
11
+ if method not in {"wa", "wb", "average", "mka"} or ratio is None or not 0 <= ratio <= 1:
12
+ raise ValueError((method, ratio))
13
+ names = tuple(PROJECTION_WEIGHTS) if method == "mka" else MLP_NAMES
14
+ frozen = {n: tensor_hash(p) for n, p in a.named_parameters() if n not in names}
15
+ source = {n: tensor_hash(p) for n, p in transported_b.named_parameters()}
16
+ before = {n: tensor_hash(a.get_parameter(n)) for n in names}
17
+ with torch.no_grad():
18
+ for name in names:
19
+ left = a.get_parameter(name)
20
+ right = transported_b.get_parameter(name)
21
+ assert left.shape == right.shape
22
+ # Match the corrected MKA / exact endpoint controls: FP32 mix,
23
+ # one cast to deployed BF16. No sigmoid endpoint clamping.
24
+ initial = left.detach().clone() if ratio == 1 else (
25
+ right.detach().clone() if ratio == 0 else
26
+ torch.lerp(right.detach().float(), left.detach().float(), ratio).to(left.dtype))
27
+ assert torch.isfinite(initial).all(), name
28
+ left.copy_(initial)
29
+ assert {n: tensor_hash(p) for n, p in a.named_parameters() if n not in names} == frozen
30
+ assert {n: tensor_hash(p) for n, p in transported_b.named_parameters()} == source
31
+ return {"initializer": method, "lambda_left": ratio, "lambda_right": 1 - ratio,
32
+ "projection_names": list(names), "scope": "attention_and_mlp" if method == "mka" else "mlp",
33
+ "frozen_anchor_sha256": frozen, "anchor_before_sha256": before,
34
+ "source_post_transport_sha256": source,
35
+ "anchor_after_sha256": {n: tensor_hash(a.get_parameter(n)) for n in names},
36
+ "norm_policy": "keep_Wa_including_QK_norms", "source_mutated_by_merge": False,
37
+ "fisher_computed": False, "fit": False, "optimizer_steps": 0, "backward_calls": 0}
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/offline_eval_policy.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Run-local offline policy, applied before importing Hugging Face libraries."""
2
+ import json
3
+ import os
4
+ from pathlib import Path
5
+
6
+
7
+ def apply_run_offline_policy(argv):
8
+ output = None
9
+ for index, value in enumerate(argv):
10
+ if value == '--output' and index + 1 < len(argv):
11
+ output = argv[index + 1]
12
+ elif value.startswith('--output='):
13
+ output = value.split('=', 1)[1]
14
+ if output is None:
15
+ return None
16
+ policy_path = Path(output).parent.parent / 'offline_eval.json'
17
+ if not policy_path.is_file():
18
+ return None
19
+ policy = json.loads(policy_path.read_text())
20
+ cache = Path(policy['wikitext_cache'])
21
+ if not (cache / 'dataset_dict.json').is_file():
22
+ raise FileNotFoundError(f'Offline WikiText cache missing: {cache}; no online fallback')
23
+ for key in ('HF_HUB_OFFLINE', 'HF_DATASETS_OFFLINE', 'TRANSFORMERS_OFFLINE'):
24
+ os.environ[key] = '1'
25
+ print('STRICT_OFFLINE_RUN_POLICY_APPLIED', flush=True)
26
+ return policy
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/package_qwen3_nofit_merge_backup.py ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Retain every stage, not just final weights; enable previous-teacher MSE."""
2
+ from pathlib import Path
3
+ import json
4
+ import shutil
5
+ import sys
6
+ out,backup,project,external,root=map(Path,sys.argv[1:])
7
+ backup.mkdir(parents=True,exist_ok=True)
8
+ def link_immutable(src,dst):
9
+ src,dst=Path(src),Path(dst)
10
+ if dst.exists():
11
+ assert src.samefile(dst), f'Refusing to overwrite non-linked file: {dst}'
12
+ else:
13
+ dst.hardlink_to(src)
14
+ return str(dst)
15
+ for folder in ('compact','audit','eval','logs'):
16
+ shutil.copytree(out/folder,backup/folder,dirs_exist_ok=True,
17
+ copy_function=link_immutable if folder in ('compact','audit') else shutil.copy2)
18
+ assert len(list((backup/'compact').glob('stage_*/*.pt')))==9
19
+ for c in range(1,10):
20
+ d=backup/f'cycle_metadata/cycle_{c}';d.mkdir(parents=True,exist_ok=True)
21
+ shutil.copy2(out/f'run/cycle_{c}/cycle_metadata.json',d/'cycle_metadata.json')
22
+ shutil.copytree(root/'inputs',backup/'inputs',dirs_exist_ok=True)
23
+ # Dense activations are shared across the four arms. Exact inputs + original
24
+ # immutable teacher revision suffice to regenerate them; save protocol here.
25
+ shutil.copy2(root/'local_mse_reference/protocol.json',backup/'local_mse_protocol.json')
26
+ shutil.copy2(root/'local_mse_reference/evaluation_input_ids.pt',backup/'inputs/local_mse_evaluation_input_ids.pt')
27
+ shutil.copy2(root/'fisher_reference/local_mse.json',backup/'fisher_reference_local_mse.json')
28
+ shutil.copy2(root/'fisher_reference/restore_receipt.json',backup/'fisher_reference_restore_receipt.json')
29
+ code=backup/'code';code.mkdir(exist_ok=True)
30
+ for path in [*project.glob('scripts/*qwen3_nofit*'),project/'src/fusegpt/nofit_merge_control.py',
31
+ project/'src/fusegpt/fit_ablation_mka.py',project/'src/fusegpt/fixed_span_merge_init.py',
32
+ project/'src/fusegpt/abprune_compact.py',project/'src/fusegpt/abprune_stagewise_geometry.py',
33
+ project/'scripts/eval_llama31_fit_ablation_one.sh',project/'scripts/evaluate_abprune_compact_ppl.py',
34
+ project/'scripts/evaluate_hchc_wikitext2_ppl.py',project/'scripts/eval_opencompass_ppl_fast.py',
35
+ project/'scripts/eval_llama31_8b_12bench.py',project/'scripts/aggregate_transport_rho_fit_14bench.py',
36
+ project/'scripts/prepare_lmeval9_local_cache.py',project/'scripts/offline_eval_policy.py',
37
+ project/'exp_md/2026-10-11_qwen3-base-nofit-merge4.md',
38
+ *[external/'src'/n for n in ['fuse_layers.py','fuse_layers_distill.py','source_feature_transport.py','common_lm_data.py','dm500_rows.py']]]:
39
+ if path.is_file(): shutil.copy2(path,code/path.name)
40
+ import subprocess
41
+ (code/'project_commit.txt').write_text(subprocess.check_output(['git','-C',str(project),'rev-parse','HEAD'],text=True))
42
+ receipt=dict(stages=list(range(1,10)),stage0_original_model='Qwen/Qwen3-8B-Base',
43
+ stage0_revision='49e3418fbbbca6ecbdf9608b4d22e5a407081db4',
44
+ previous_teacher_reconstruction='stage(k-1) compact anchor + immutable original unremoved layers',
45
+ original_input_ids_saved=True,all_transport_matrices_saved=True,
46
+ intermediate_weights_saved=True,fit=False)
47
+ (backup/'stage_retention.json').write_text(json.dumps(receipt,indent=2)+'\n')
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/prepare_lmeval9_local_cache.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Materialize the exact harness datasets once, without changing task definitions."""
2
+ import argparse
3
+ from concurrent.futures import ThreadPoolExecutor, as_completed
4
+ import hashlib
5
+ import json
6
+ from pathlib import Path
7
+ import time
8
+
9
+ import datasets
10
+ from lm_eval.tasks import TaskManager
11
+
12
+
13
+ def cache_key(path, name, kwargs):
14
+ return hashlib.sha256(json.dumps([path, name, kwargs], sort_keys=True).encode()).hexdigest()
15
+
16
+
17
+ def specs():
18
+ manager = TaskManager()
19
+ names = ["piqa", "winogrande", "hellaswag", "arc_challenge", "arc_easy", "openbookqa", "sciq"]
20
+ entries = [manager.task_index[n] for n in names]
21
+ entries += [e for e in manager.task_index.values()
22
+ if e.yaml_path and e.yaml_path.parent.name == "default"
23
+ and (e.cfg or {}).get("dataset_path") == "cais/mmlu"]
24
+ entries += [e for e in manager.task_index.values()
25
+ if (e.cfg or {}).get("dataset_path") == "haonan-li/cmmlu"]
26
+ unique = {}
27
+ for entry in entries:
28
+ cfg = entry.cfg
29
+ path, name, kwargs = cfg["dataset_path"], cfg.get("dataset_name"), cfg.get("dataset_kwargs") or {}
30
+ unique[cache_key(path, name, kwargs)] = {"path": path, "name": name, "kwargs": kwargs}
31
+ assert len(unique) == 131, len(unique)
32
+ return unique
33
+
34
+
35
+ def materialize(root, key, spec, offline):
36
+ target = root / key
37
+ metadata = target / "source.json"
38
+ if metadata.is_file():
39
+ return key, json.loads(metadata.read_text())
40
+ start = time.monotonic()
41
+ try:
42
+ data = datasets.load_dataset(spec["path"], spec["name"], **spec["kwargs"])
43
+ except Exception:
44
+ if offline:
45
+ return key, None
46
+ raise
47
+ data.save_to_disk(str(target))
48
+ report = {**spec, "splits": {k: {"rows": len(v), "fingerprint": v._fingerprint}
49
+ for k, v in data.items()}}
50
+ metadata.write_text(json.dumps(report, indent=2) + "\n")
51
+ restored = datasets.load_from_disk(str(target))
52
+ assert {k: len(v) for k, v in restored.items()} == {k: len(v) for k, v in data.items()}
53
+ assert all(restored[k].features == data[k].features for k in data)
54
+ assert all(restored[k].data.table.equals(data[k].data.table) for k in data)
55
+ print("READY", spec["path"], spec["name"], round(time.monotonic() - start, 2), flush=True)
56
+ return key, report
57
+
58
+
59
+ def install_local_loader(root):
60
+ manifest = json.loads((root / "manifest.json").read_text())
61
+ assert len(manifest) == 131
62
+ memo = {}
63
+
64
+ def local_load(path, name=None, **kwargs):
65
+ key = cache_key(path, name, kwargs)
66
+ if key not in manifest:
67
+ raise RuntimeError(f"Unprepared dataset request: {path}/{name}; no online fallback")
68
+ if key not in memo:
69
+ memo[key] = datasets.load_from_disk(str(root / key))
70
+ print("LOCAL_DATASET", path, name, flush=True)
71
+ return memo[key]
72
+
73
+ datasets.load_dataset = local_load
74
+
75
+
76
+ if __name__ == "__main__":
77
+ parser = argparse.ArgumentParser()
78
+ parser.add_argument("root", type=Path)
79
+ parser.add_argument("--offline-export", action="store_true")
80
+ parser.add_argument("--validate-local", action="store_true",
81
+ help="Validate a complete transferred cache without Hub requests")
82
+ parser.add_argument("--workers", type=int, default=8)
83
+ args = parser.parse_args()
84
+ args.root.mkdir(parents=True, exist_ok=True)
85
+ sources = specs()
86
+ if args.validate_local:
87
+ manifest = json.loads((args.root / "manifest.json").read_text())
88
+ assert set(manifest) == set(sources), "Task configuration mismatch"
89
+ for key, spec in sources.items():
90
+ report = manifest[key]
91
+ assert all(report[k] == v for k, v in spec.items())
92
+ assert json.loads((args.root / key / "source.json").read_text()) == report
93
+ data = datasets.load_from_disk(str(args.root / key))
94
+ assert {k: len(v) for k, v in data.items()} == {
95
+ k: v["rows"] for k, v in report["splits"].items()}
96
+ print("VALIDATED_LOCAL", len(manifest), "NO_HUB_REQUESTS", flush=True)
97
+ raise SystemExit(0)
98
+ completed = {}
99
+ with ThreadPoolExecutor(max_workers=1 if args.offline_export else args.workers) as executor:
100
+ futures = [executor.submit(materialize, args.root, k, v, args.offline_export)
101
+ for k, v in sources.items()]
102
+ for future in as_completed(futures):
103
+ key, result = future.result()
104
+ if result is not None:
105
+ completed[key] = result
106
+ print("PREPARED", len(completed), "OF", len(sources), flush=True)
107
+ if len(completed) == len(sources):
108
+ (args.root / "manifest.json").write_text(json.dumps(completed, indent=2) + "\n")
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/prepare_qwen3_nofit_merge_inputs.py ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Materialize the exact historical calibration once for four workers."""
2
+ import argparse
3
+ import json
4
+ import os
5
+ from pathlib import Path
6
+ import sys
7
+
8
+ p = argparse.ArgumentParser()
9
+ p.add_argument('--external-root', type=Path, required=True)
10
+ p.add_argument('--model', required=True)
11
+ p.add_argument('--output', type=Path, required=True)
12
+ a = p.parse_args()
13
+ sys.path.insert(0, str(a.external_root / 'src'))
14
+ sys.path.insert(0, str(Path(__file__).resolve().parents[1] / 'src'))
15
+ import torch
16
+ from transformers import AutoTokenizer
17
+ from common_lm_data import SharedLMDataSpec, build_chunks
18
+ from fusegpt.fixed_span_merge_init import tensor_hash
19
+
20
+ os.environ['ABPRUNE_DATASET_REVISION'] = 'b5f90f419b7489cdba26fdbc8c022fcb5562f968'
21
+ tokenizer = AutoTokenizer.from_pretrained(a.model, local_files_only=True)
22
+ chunks = build_chunks(SharedLMDataSpec(dataset='slimpajama', config=None, split='train',
23
+ text_field='text', seq_len=1024, num_sequences=64, seed=42), tokenizer)
24
+ ids = torch.stack(chunks).long()
25
+ assert ids.shape == (64, 1024)
26
+ assert tensor_hash(ids) == '85a84b9a68cf0856fd363186d3a273860886b1c17f876cae145fd092454aff55'
27
+ a.output.mkdir(parents=True, exist_ok=True)
28
+ torch.save({'input_ids': ids, 'attention_mask': torch.ones_like(ids)}, a.output / 'calib.pt')
29
+ manifest = dict(model='Qwen/Qwen3-8B-Base', model_revision='49e3418fbbbca6ecbdf9608b4d22e5a407081db4',
30
+ dataset='DKYoon/SlimPajama-6B', revision=os.environ['ABPRUNE_DATASET_REVISION'], split='train',
31
+ packing='historical nonstreaming dataset.shuffle(seed42); concatenate encoded text without separators or BOS',
32
+ samples=64, seq_len=1024, batch_size=2, seed=42, valid_tokens=65536,
33
+ input_ids_sha256=tensor_hash(ids), attention_mask_sha256=tensor_hash(torch.ones_like(ids)))
34
+ (a.output / 'manifest.json').write_text(json.dumps(manifest, indent=2)+'\n')
35
+ print('EXACT_HISTORICAL_CALIBRATION_VERIFIED', json.dumps(manifest), flush=True)
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/project_commit.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ 228a79f631d8ddf633f8f5e77677af7add92c2bc
runs/vast-paper_revision-qwen3-base-nofit-merge4-55359231-20261011/20261011-qwen3-base-nofit-merge4/wb/code/qwen3_nofit_local_mse.py ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Evaluation-only boundary MSE, all variants against the same dense teacher."""
2
+ from __future__ import annotations
3
+ import argparse
4
+ import json
5
+ from pathlib import Path
6
+ import torch
7
+ from fusegpt.fixed_span_merge_init import tensor_hash
8
+ from evaluate_hchc_wikitext2_ppl import packed_wikitext_tokens, primary
9
+
10
+ REVISION = '49e3418fbbbca6ecbdf9608b4d22e5a407081db4'
11
+
12
+
13
+ class BoundaryReached(Exception):
14
+ pass
15
+
16
+
17
+ @torch.no_grad()
18
+ def capture(model, ids, boundary, batch_size=2):
19
+ outputs, inputs = [], []
20
+ current = {}
21
+ def pre(module, args, kwargs):
22
+ value = args[0] if args else kwargs['hidden_states']
23
+ current['input'] = value.detach().cpu()
24
+ def post(module, args, output):
25
+ current['output'] = primary(output).detach().cpu()
26
+ raise BoundaryReached()
27
+ h1 = model.model.layers[12].register_forward_pre_hook(pre, with_kwargs=True)
28
+ h2 = model.model.layers[boundary].register_forward_hook(post)
29
+ try:
30
+ for start in range(0, len(ids), batch_size):
31
+ current.clear()
32
+ batch = ids[start:start+batch_size].to('cuda')
33
+ try:
34
+ model.model(input_ids=batch, attention_mask=torch.ones_like(batch), use_cache=False)
35
+ except BoundaryReached:
36
+ pass
37
+ else:
38
+ raise RuntimeError('Boundary hook did not run')
39
+ inputs.append(current['input'])
40
+ outputs.append(current['output'])
41
+ finally:
42
+ h1.remove(); h2.remove()
43
+ return torch.cat(inputs), torch.cat(outputs)
44
+
45
+
46
+ def main():
47
+ p = argparse.ArgumentParser()
48
+ p.add_argument('--model', required=True)
49
+ p.add_argument('--cache', type=Path, required=True)
50
+ p.add_argument('--wikitext-cache', type=Path)
51
+ p.add_argument('--prepare', action='store_true')
52
+ p.add_argument('--compact-stage', type=Path)
53
+ p.add_argument('--output', type=Path)
54
+ a = p.parse_args()
55
+ from transformers import AutoModelForCausalLM, AutoTokenizer
56
+ if a.prepare:
57
+ assert a.wikitext_cache and not a.compact_stage
58
+ tokenizer = AutoTokenizer.from_pretrained(a.model, local_files_only=True)
59
+ ids = packed_wikitext_tokens(tokenizer, 'test', dataset_cache=a.wikitext_cache)[:64*1024].reshape(64,1024)
60
+ model = AutoModelForCausalLM.from_pretrained(a.model, dtype=torch.bfloat16,
61
+ local_files_only=True, attn_implementation='eager').to('cuda').eval()
62
+ anchor_inputs, targets = capture(model, ids, 21)
63
+ a.cache.mkdir(parents=True, exist_ok=True)
64
+ torch.save(dict(input_ids=ids, anchor_inputs=anchor_inputs, targets=targets), a.cache/'dense_teacher.pt')
65
+ torch.save(dict(input_ids=ids, attention_mask=torch.ones_like(ids)), a.cache/'evaluation_input_ids.pt')
66
+ protocol = dict(model='Qwen/Qwen3-8B-Base', revision=REVISION,
67
+ teacher='common_original_dense', dense_input_layer=12, dense_output_layer=21,
68
+ student_output_layer=12, sequences=64, sequence_length=1024, valid_tokens=65536,
69
+ metric='sum float32 squared activation differences / valid tokens / hidden width',
70
+ dtype='bfloat16 eager; float32 differences; float64 aggregate', training=False,
71
+ input_ids_sha256=tensor_hash(ids), anchor_inputs_sha256=tensor_hash(anchor_inputs),
72
+ targets_sha256=tensor_hash(targets), dataset='WikiText2 test, first64 packed1024 windows, HCHC packing')
73
+ (a.cache/'protocol.json').write_text(json.dumps(protocol,indent=2)+'\n')
74
+ print('COMMON_DENSE_TEACHER_READY',json.dumps(protocol),flush=True)
75
+ return
76
+ assert a.compact_stage and a.output
77
+ from fusegpt.abprune_stagewise_geometry import load_compact_model
78
+ reference = torch.load(a.cache/'dense_teacher.pt',weights_only=True)
79
+ protocol = json.loads((a.cache/'protocol.json').read_text())
80
+ for field in ('input_ids','anchor_inputs','targets'):
81
+ assert tensor_hash(reference[field]) == protocol[field+'_sha256']
82
+ model = load_compact_model(a.model,a.compact_stage,cycle=9,anchor=12,
83
+ dtype=torch.bfloat16,device=torch.device('cuda'),attn='eager',revision=REVISION).eval()
84
+ inputs, outputs = capture(model,reference['input_ids'],12)
85
+ assert torch.equal(inputs,reference['anchor_inputs']), 'Upstream prefix changed; common MSE inputs not matched'
86
+ # Keep accumulation chunked; the cached tensors themselves remain BF16.
87
+ numerator = denominator = 0.
88
+ for output,target in zip(outputs,reference['targets'],strict=True):
89
+ numerator += (output.float()-target.float()).square().double().sum().item()
90
+ denominator += target.float().square().double().sum().item()
91
+ assert denominator > 0 and numerator >= 0
92
+ report = dict(local_mse=numerator/outputs.numel(),local_nmse=numerator/denominator,
93
+ squared_error_sum=numerator,target_energy_sum=denominator,elements=outputs.numel(),
94
+ protocol=protocol,prefix_input_exact_match=True,compact_stage=str(a.compact_stage),fit=False)
95
+ a.output.parent.mkdir(parents=True,exist_ok=True)
96
+ a.output.write_text(json.dumps(report,indent=2)+'\n')
97
+ print('LOCAL_MSE_COMPLETE',json.dumps(report),flush=True)
98
+
99
+
100
+ if __name__ == '__main__':
101
+ main()