Untitled
MegaScience Rebuttal — Results Summary
Last updated: 2026-05-30 13:43 UTC+8 (overnight pipeline — ALL FINAL;新增方法学 + 数据分布章节)
本文档自成体系,可直接作为 rebuttal 附录:先给【端到端方法学】与【数据分布分析】,再给最终结果表与结论。 所有数字均从真实产物/脚本/parquet 核实;个别无法从文件核实的参数标注
(待核实)。
Benchmarks: MATH-500, MMLU-Pro, GPQA-Diamond, SciBench (physics/chemistry/math).
Eval harness: Data-Mixture/lm-open-science-evaluation (GPQA shuffle bug fixed),
vLLM, temperature=0, few-shot, n_repeats=1. enforce_eager + on-disk-cache disabled
(fixes the "checksum mismatch" crash that earlier zeroed mmlu/gpqa/scibench).
Family-specific stop tokens: llama=128009, qwen2.5-chatml=151645/151643.
ALL RESULTS FINAL — 10 models × 6 benchmarks, epoch-3 checkpoints, all complete.
方法学(Methodology)— 端到端怎么做的
M0. 通用 pipeline(实验A / 实验B 共享的上游)
数据底座:MegaScience(v2,1.25M)。 全量 1,253,230 道题,三个 subset(核实自
megascience/results/analysis/difficulty_cross_proxy.json 的 per_source 与 v2 判分 parquet):
subset(内部 source 名) | 行数 | 占比 |
|---|---|---|
textbook_reasoning(Textbook) | 651,125 | 51.9% |
natural_reasoning(Natural) | 429,019 | 34.2% |
nemotro_science(Nemotron,注:源数据列名即此拼写) | 173,086 | 13.8% |
| 合计 | 1,253,230 | 100% |
① Rejection sampling(拒绝采样,每题 8 次)。 对每道题,用两个 proxy 模型各生成 8 个候选答案:
- proxy = Qwen2.5-7B-Instruct 与 Llama-3.1-8B-Instruct(即
judge_model_map里的两个被判分对象)。 - "每题 8 个样本"由判分总量反推核实:每个 proxy 的判分记录数 =
10,025,840 = 1,253,230 × 8, 两个 proxy 合计total_judge_calls ≈ 20.05M(核实自 stateJUDGE_20M_COMPLETE_2030/total_judge_calls)。 - 采样的具体温度 / top_p(待核实)—— 未在本工作区脚本中直接核到拒绝采样的采样旋钮。
② Length annotation(长度标注,greedy)。 用大模型 greedy 解码标注每题答案长度,
模型为 Qwen2.5-72B-Instruct / Llama-3.1-70B-Instruct(来自 paper / 交接文档;具体解码参数 待核实)。
产物落在 megascience/results/analysis/length_per_uuid.parquet(含 qwen_n_tokens / llama_n_tokens
两列,均已按 4096 训练 cutoff 截断)。这两列是后续实验A token 预算对齐的"标尺"(见 M2)。
③ 难度判分 v2(paper-faithful)。 严格复现 paper Figure 27 的判分 prompt,对每个 proxy 的 8 个
候选答案逐个打 0–10 分,再按题(uuid)取均值得到 mean_score(分数越高 = 模型答得越好 = 题越简单)。
核实自 megascience/scripts/single_shard_judge_v2_hdfs_worker.py:
| 维度 | 取值(核实) | 来源 |
|---|---|---|
| 判分 prompt | model_eval.prompt(paper Figure 27) | worker PROMPT_PATH 注释 |
| 参考答案 | 读 reference_answer 列(短答案) | worker src.column("reference_answer") |
| 解码 | n=1, temperature=0.0, max_tokens=4096(贪心) | worker jcfg |
| 分数解析 | parse_score(),0–10(无法解析记 -1) | worker |
| 同家族判分 | Qwen-7B 样本 → Qwen2.5-32B-Instruct (TP=2);Llama-8B 样本 → Llama-3.1-70B-Instruct (TP=4) | state judge_model_map |
| 分片 | 每个 proxy 64 shards,最多 4 个 run 各覆盖 16 shards | state judge_run_ids |
| 运行方式 | HDFS-only(输入/输出全走 HDFS) | worker + handoff |
为什么 HDFS-only: 早期 4 个 judge run 因 bytenas IDC 与队列不匹配(跨 IDC 不兼容)启动失败/被停, 改为输入输出全部走 HDFS(解 staging 失败,见 M5),从而可在任意空闲集群/IDC 上跑。
判分模型 HDFS 路径(核实自 state hdfs_paths):
- Qwen2.5-32B-Instruct:
huggingface/Qwen/Qwen2.5-32B-Instruct/data - Llama-3.1-70B-Instruct:
models/Meta-Llama-3.1-70B-Instruct
产物:megascience/results/judge_v2_paper_faithful/{qwen25-32b-instruct__vs__qwen25-7b-instruct, llama31-70b-instruct__vs__llama31-8b-instruct}/per_uuid_difficulty.parquet(列 uuid, mean_score, n_samples)。
判分 run IDs(v2,核实自 state judge_run_ids,均 soil-hl):
| proxy | judge | TP | shards | run IDs |
|---|---|---|---|---|
| Qwen-7B | Qwen2.5-32B | 2 | 0–63(4×16) | 8259563d52a103e6, eba15a5cd56fff94, 4a78649a734a9983, 4967ea35082988de |
| Llama-8B | Llama-3.1-70B | 4 | 0–63(4×16) | 29e4bd6ce897363c, ff4c8e62692acd6e, fca9c02cff99572f, fcd9d88d35051da6 |
M1. 数据分布分析(关键 —— 直接驱动了实验A 的设计)
以下分布数字均实测自 v2 paper-faithful 的 per_uuid_difficulty.parquet(本次重新跑数核实)。
1.1 两个 proxy 的难度分布(mean_score 0–10,越高越简单)
| 统计量 | Qwen-32B 判 Qwen-7B(n=1,253,010) | Llama-70B 判 Llama-8B(n=1,253,098) |
|---|---|---|
| mean | 8.32 | 7.05 |
| std | 1.64 | 1.84 |
| median | 9.00 | 7.38 |
| p10 / p25 / p50 / p75 / p90 | 6.0 / 7.62 / 9.0 / 9.38 / 10.0 | 4.5 / 5.88 / 7.38 / 8.62 / 9.0 |
| 占比 >7(饱和) | 81.1% | 55.2% |
| 占比 ≥9 | 50.3% | 15.2% |
| 占比 =10(撞天花板) | 12.4% | 1.8% |
| 占比 <2(极难) | 0.3% | 1.1% |
饱和现象(核心): Qwen-32B judge 给 Qwen-7B 样本的分严重饱和——81.1% 的题 >7 分、
中位数 9.0、过半(50.3%)≥9 分。这意味着 Qwen judge 眼里绝大多数 MegaScience 题"很简单",
难度信号被压缩在顶端。Llama-70B judge 的分布明显更散(中位数 7.38,>7 仅 55.2%),区分度更好。
1.2 Cross-proxy 一致性(同一道题,两套 proxy×judge 的难度信号是否一致)
在 1,252,972 道题上对齐(uuid inner join)实测:
- Spearman ρ = 0.6315(≈ 0.63),Pearson r = 0.6383 —— 中等正相关:两套 proxy 对"谁更难" 排序大体一致,但远非完全一致。
- 最难尾部的选择重叠/分歧(取各自 mean_score 最低 = 最难的一批):
| 选取最难比例 | 两 proxy 重叠率 | Jaccard | 分歧率(1−重叠) |
|---|---|---|---|
| 最难 10% | 43.6% | 0.279 | ~56% |
| 最难 25% | 63.1% | 0.461 | ~37% |
| 最难 50% | 76.0% | 0.614 | ~24% |
即:选最难的 25%,两个 proxy 有约 37% 不一致;选最难的 10%,分歧高达约 56%。
尾部(最有信息量的难题)选择分歧 ~35–55%,正是 reviewer 担心的"proxy 依赖"的量化证据。
1.3 中间带(middle-band)占比 —— 为什么从 18 格缩到 6 格
paper 的难度筛选规则是取"中间带"(既非太简单也非太难):textbook/natural: 1<s<9,nemotron: 2<s<9。
按此规则实测各 (subset, proxy) 落在中间带的占比(核实自 state A2_middleband_* + build 脚本统计):
| subset | Qwen proxy 中间带占比 | Llama proxy 中间带占比 |
|---|---|---|
| textbook | 42.0%(273,572/651,123) | 80.6% |
| natural | 45.9%(197,074/429,019) | 85.0% |
| nemotron | 87.3%(150,872/172,868) | 94.0% |
结论:6 个 (subset,proxy) 组合里有 5 个中间带占比 >80%(只有 Qwen-textbook / Qwen-natural 区分度好)。 中间带几乎 = 全量数据 ⇒ 在已筛过的数据上再做 "difficulty / length / random" 3-strategy × 3-subset × 2-family = 18 格全网格 ablation 会有 5/6 格信号近乎为零(选出来跟全量差不多,没有对比度)。
设计转向: 与其在退化的网格上烧 18×~16h 训练,不如直接回应 reviewer 的真正顾虑—— "换一个 proxy 选的数据,下游训练还一样好吗?"。难度信号 ρ=0.63、尾部分歧 35–55% 恰好让这个问题 值得测且非平凡。于是把 18 格压成 6 格 proxy-transfer(matched / crossed / random × 2 family)。
两张分布图(已生成):


M2. 实验A 全过程(VeOmni,proxy-transfer,6 格)
设计动机: reviewer 关心"难度筛选是否依赖具体 proxy 模型"。直接测可迁移性:用 A 家族的 proxy 选数去训 B 家族模型,看能否仍超过 random baseline。
数据构造(核实自 veomni_sft/data/build_expA_proxytransfer.py + data/expA/manifest.json)
-
中间带选数(union over 3 subsets):
Data_Qwen= Qwen proxy 中间带并集 = natural 197,074 + nemotron 150,872 + textbook 273,572 = 621,518 行。Data_Llama= Llama proxy 中间带并集 = natural 364,482 + nemotron 162,558 + textbook 524,532 = 1,051,572 行(对齐前)。
-
token 预算对齐(单一标尺 =
qwen_n_tokens,已 cap 4096):B = min(sum_tok(Data_Qwen), sum_tok(Data_Llama))。Data_Qwen是较小方 = B 本身;Data_Llama用 shuffle(seed=42)按累计 token 截断到 B。- B = 507,297,565 qwen-tokens(≈ 507.3M) —— 这是最终权威口径。
Data_Random= 从全量 MegaScience 随机采样(seed=4242)到 B。
⚠️ 口径冲突已澄清(507.3M vs 555M): 旧文档与早期草稿
veomni_sft/data/full/output/expA_data_summary.json写的budget = 555,039,316(≈555M)是被废弃的早期版本(用不同的 token 统计口径、未用最终的qwen_n_tokens@4096标尺)。最终训练实际使用的是manifest.json的 507.3M(其行数 621,518 / 622,277 / 645,060 与 stateexpA_data_HDFS记录的实训数据完全一致)。以 507.3M 为准,555M 作废。 -
对齐后最终三数据集(核实自
manifest.json,ref_tokens列 =qwen_n_tokens):
| 数据集 | 行数 | 参考 token(qwen_n_tokens,≈507.3M) | 采样 seed |
|---|---|---|---|
| Data_Qwen | 621,518 | 507,297,565 | —(= 预算 B 本身) |
| Data_Llama | 622,277 | 507,296,294 | 42 |
| Data_Random | 645,060 | 507,297,541 | 4242 |
三者参考 token 数对齐到 ≈507.30M,唯一变量是"哪个 proxy 选的数据",可干净比较。
- 每格实际训练 token(VeOmni
TRAIN_SIZE,用各自训练 tokenizer + chat template 计,核实自 stateexpA_train_sizes):
| cell | A1 | A2 | A5 | A3 | A4 | A6 |
|---|---|---|---|---|---|---|
| train tokens | 561.3M | 532.2M | 522.0M | 511.7M | 539.0M | 501.6M |
这些数与 507.3M 不同是正常的:507.3M 是用统一标尺
qwen_n_tokens算的对齐预算;而 VeOmni 需要 用实际训练模型自己的 tokenizer + 模板(Qwen chatml / Llama3)重新统计 token 数来排 steps / LR schedule。 等预算保证是在共享标尺(qwen_n_tokens ≈507.3M)上成立的。
6 个 cell 定义
| cell | base 模型 | 训练数据 | 类型 | 训练 run ID(final,robust=10) |
|---|---|---|---|---|
| A1 | Qwen2.5-7B | Data_Qwen | matched | a3b624cd43d2ede1 |
| A2 | Qwen2.5-7B | Data_Llama | crossed | b87251207c8f7a38 |
| A3 | Llama-3.1-8B | Data_Llama | matched | b8c2674c0158bbc8 |
| A4 | Llama-3.1-8B | Data_Qwen | crossed | 34d1695d688318ad |
| A5 | Qwen2.5-7B | Data_Random | baseline | 42850b01303d9dcd |
| A6 | Llama-3.1-8B | Data_Random | baseline | c58e43fbdef727b7 |
第一批无 robust 的 run 被抢占驱逐(state
expA_evicted_runs,6 个);上表为最终robust_run_count=10的批次。
base 模型 HDFS 路径:Qwen2.5-7B /models/Qwen2.5-7B;
Llama-3.1-8B base models/Meta-Llama-3.1-8B。
VeOmni 训练超参(核实自 veomni_sft/README.md,与 expB LlamaFactory 严格对齐)
| 维度 | 取值 | 说明 |
|---|---|---|
| lr | 5e-6 | --train.lr 5e-6 |
| global batch | 128 | token-block 数;tokens/step = 128×4096 = 524,288,与 LF 一致 |
| epoch | 3 | --train.num_train_epochs 3 |
| max_seq_len | 4096 | cutoff |
| packing | rmpad_with_pos_ids + dyn_bsz | 变长 token-based packing |
| loss 范围 | 只算 response(loss_mask:assistant=1,其余=0) | |
| LR schedule | cosine + warmup_ratio 0.05 | |
| weight decay / grad clip | 0.0 / 1.0 | 对齐 LF |
| bsz_warmup_ratio | 0 | 关掉 VeOmni 特有 batch warmup 以对齐 LF |
| chat template | Qwen=chatml;Llama=自定义 Llama3Template | 见 M5 BUG2 |
| 资源 | 2×8 A100(4 节点 rendezvous 不稳,落 2 节点) |
Llama3Template 注入: 镜像内 VeOmni(data/VeOmni@zqfan_vesft)没有 CHAT_TEMPLATE_REGISTRY
装饰器,而是用普通 dict TEMPLATES={...} + 抽象基类 ChatTemplate(ABC),且按 message["loss_mask"]==1
(而非 role)掩码 label。故为 Llama 追加了 class Llama3Template(ChatTemplate) 并 TEMPLATES["llama3"]=Llama3Template
(BOS=128000,header token,仅 assistant span 算 loss)。本地 encode 验证通过(loss_tokens=7)。
ckpt → HF: VeOmni save_hf_weights=True(默认)在训练末自动把分布式 ckpt 合成 HF safetensors 到
<final_ckpt>/hf_ckpt(4 个 safetensors ~15GB + config + tokenizer),finals 无需再单独 merge;
save_epochs=1 每 epoch 存一个分布式 ckpt,单独转早期 ckpt 用 VeOmni/scripts/merge_to_hf_pt.py。
qwen finals 的 merge fork-run(核实自 state):A1 916bc1d3 / A2 8aea8bb3 / A5 d3b213e7;
llama A3/A4/A6 finals 同样以 fork-run 合并(state 记 gs2931/gs3087/gs2871)。评估 run IDs 见文末表。
M3. 实验B 全过程(LlamaFactory,mixture ablation,4 SFT)
设计动机: 数据配比 / 来源组合消融——固定 base 模型与 token 预算,看不同 2-source 组合 (leave-one-source-out 风格)相对 random 混合的差异。
4 个组合 + 等 token 预算(核实自 state expB_pair_sums / expB_budget_qa_tokens / expB_progress)
- 三个 2-source 组合的原始 token 量(question+answer,qwen tokenizer):
nat+nemo = 670.1M、nat+tex = 828.9M、nemo+tex = 451.5M。 - 等预算 = 三者最小 =
451,501,176qa-tokens(≈451.5M,即 nemo_tex 对)。 另两个 2-source 组合 下采样到 451.5M;mix_random从全量随机采样到 451.5M。
| config | 组合 | 对齐后行数 | 训练 run ID | epoch-3 final loss |
|---|---|---|---|---|
| mix_nat_nemo | Natural + Nemotron | 405,734 | d31a9caabe8dfea3 | 0.431 |
| mix_nat_tex | Natural + Textbook | 588,539 | c8a4a4944382a98e | 0.426 |
| mix_nemo_tex | Nemotron + Textbook | 824,211 | 4da002af8087544e | 0.436 |
| mix_random | 全量随机 | 580,393 | c4900af558db98d6 | 0.435 |
nemo_tex是预算基准(不截断)故行数最多;行数差异源于各组合的平均答案长度不同。
LlamaFactory 超参(核实自 megascience/scripts/sft/mix_*.yaml,4 个 yaml 一致)
| 维度 | 取值 |
|---|---|
| base | Qwen2.5-7B(base) |
| finetuning_type | full |
| 并行 | DeepSpeed ZeRO-3(examples/deepspeed/ds_z3_config.json) |
| attn | flash_attn: sdpa(镜像自带 vendored vllm-flash-attn,非标准 flash_attn 轮子;避免 ImportError/60min 编译) |
| template | qwen |
| cutoff_len | 4096 |
| packing | true |
| train_on_prompt | false(只算 response) |
| 有效 batch | per_device 2 × grad_accum 8 × 8 GPU = 128(+ gradient_checkpointing 省显存) |
| lr | 5.0e-6 |
| epoch | 3 |
| scheduler / warmup | cosine / warmup_ratio 0.05 |
| 精度 | bf16 |
| 资源 | 8×A100(soil-hl,idc=hl) |
ckpt 落 HDFS: 训完自动 push 完整 HF 权重到
megascience/sft_ckpts/<config>/<config>/
(current-run 命名为双重 <config>;<config>_full 为早期 stale 产物,忽略)。
每个根目录含 config.json + model-0000{1..4}-of-00004.safetensors + tokenizer。
M4. 评估 harness(10 个模型 × 6 benchmark)
- repo:
Data-Mixture/lm-open-science-evaluation(vLLM 推理)。 - benchmark(核实自
configs/veomni_expA_bench.json):MATH-500、MMLU-Pro、GPQA-Diamond、 SciBench-physics、SciBench-chemistry、SciBench-math(均 SFT-format prompt,0/few-shot 模板)。 - 采样参数(核实自
veomni_sft/run_veomni_eval_worker.sh):temperature=0、n_repeats=1(贪心、单次)。 - family 专属 stop token:llama=
128009;qwen2.5-chatml=151645/151643。 - GPQA shuffle bug 已修(核实自
data_processing/process_utils.py):process_gpqa与process_gpqa_sft均把random.seed(42)改为random.Random(item["Question"]).shuffle(options)—— per-item 确定性洗牌, 消除"正确答案永远落同一选项位置"的位置泄漏(GitHub issue GAIR-NLP/lm-open-science-evaluation#1)。 - 评估 canary 验证:math-500 = 67.8%(pipeline 闭环验证通过,eval run
facb52dd87d4db1e)。
实验结果(Results)
Experiment A — VeOmni proxy-transfer (6 cells) — ALL FINAL
Matrix: train model × data selector (matched = same-family proxy, crossed = other-family proxy, random = baseline), token-budget-aligned (B = 507.3M qwen-reference tokens, 口径见 M2;旧文档的 ~555M 已作废), 3-epoch SFT.
| Cell | Train | Selector | MATH-500 | MMLU-Pro | GPQA | SciB-Phys | SciB-Chem | SciB-Math | Avg |
|---|---|---|---|---|---|---|---|---|---|
| A1 | Qwen-7B | matched | 71.60 | 59.29 | 39.90 | 45.81 | 50.38 | 66.67 | 55.61 |
| A2 | Qwen-7B | crossed | 73.20 | 58.54 | 33.33 | 44.93 | 48.87 | 64.63 | 53.92 |
| A5 | Qwen-7B | random | 72.40 | 59.08 | 33.33 | 46.26 | 45.49 | 64.63 | 53.53 |
| A3 | Llama-8B | matched | 43.40 | 49.55 | 36.87 | 29.07 | 31.58 | 41.50 | 38.66 |
| A4 | Llama-8B | crossed | 43.20 | 50.67 | 34.85 | 32.60 | 36.09 | 44.22 | 40.27 |
| A6 | Llama-8B | random | 42.60 | 49.37 | 35.86 | 25.11 | 34.59 | 38.10 | 37.60 |
Proxy-transfer conclusions
Qwen family (epoch 3, final):
- matched 55.61 > crossed 53.92 > random 53.53
- Same-family proxy selection is best; cross-family data still beats random.
- Supports the proxy-transfer hypothesis: difficulty-based selection improves SFT regardless of which proxy picks the data, and same-family proxy is modestly better.
Llama family (epoch 3, final):
- crossed 40.27 > matched 38.66 > random 37.60
- Both difficulty-selected sets clearly beat random (+2.67 / +1.06 avg).
- Crossed (Qwen-selected data) slightly edges matched (Llama-selected), suggesting the Qwen proxy may produce a more discriminating difficulty signal even for Llama training (consistent with Qwen-32B judge's tighter score distribution).
Cross-family synthesis:
- In both families, difficulty-selected data > random baseline — the core claim (difficulty-based curation is effective) holds robustly.
- Cross-proxy transfer is positive: using one family's proxy to select data for another family still outperforms random, confirming proxy-invariance to a degree.
- The ordering matched vs crossed is family-dependent (Qwen: matched > crossed; Llama: crossed > matched), likely reflecting the proxy quality asymmetry (Qwen-32B judge is more discriminating than Llama-70B, ρ=0.63 cross-proxy).
Experiment B — Mixture ablation (4 SFTs) — ALL FINAL
4 × Qwen2.5-7B full SFT, equal token budget (451.5M), 3 epochs (loss ~0.43).
| Config | MATH-500 | MMLU-Pro | GPQA | SciB-Phys | SciB-Chem | SciB-Math | Avg |
|---|---|---|---|---|---|---|---|
| mix_random | 70.40 | 56.95 | 37.37 | 44.05 | 45.11 | 63.95 | 52.97 |
| mix_nat_nemo | 69.40 | 57.62 | 37.88 | 41.85 | 41.35 | 59.18 | 51.21 |
| mix_nat_tex | 72.80 | 55.24 | 33.84 | 49.34 | 36.47 | 59.18 | 51.15 |
| mix_nemo_tex | 69.60 | 56.87 | 33.33 | 34.36 | 40.60 | 57.82 | 48.76 |
Mixture signal: the random mixture has the highest 6-benchmark average (52.97), ahead of nat_nemo (51.21) ≈ nat_tex (51.15) > nemo_tex (48.76). Per-benchmark leaders vary (nat_tex best on MATH-500 & SciBench-physics; nat_nemo best on MMLU/GPQA; random best on SciBench-chem/math). Differences are within ~4 points — no single mixture dramatically dominates, but nemo_tex underperforms.
Overall takeaways for rebuttal
- Difficulty-based data selection works: In both model families, difficulty-selected data (matched or crossed) outperforms random baseline on science/math benchmarks.
- Proxy-transfer is viable: Cross-family proxy selection still improves over random, supporting the claim that the difficulty signal is not proxy-specific.
- Proxy quality matters asymmetrically: Qwen-32B judge produces tighter, more discriminating scores — its selections help Llama more than Llama-70B selections help Qwen. This aligns with the cross-proxy Spearman ρ=0.63 and overlap analysis.
- Mixture composition: Among 2-source mixtures at equal token budget, no mixture clearly dominates the random baseline on average, though per-benchmark variation exists.
Eval run IDs (final epoch-3)
| Model | Eval Run ID | Status |
|---|---|---|
| A1 (Qwen matched) | 7444bea2 (qwen final) | DONE |
| A2 (Qwen crossed) | 4a11d456 (qwen final) | DONE |
| A5 (Qwen random) | db76f5d7 (qwen final) | DONE |
| A3 (Llama matched) | 05ad9e0fa2543080 | DONE |
| A4 (Llama crossed) | 978696f450f96673 | DONE |
| A6 (Llama random) | 015ce1da9a297509 | DONE |
| expB nat_nemo | 609ec4ea | DONE |
| expB nat_tex | 897d855e | DONE |
| expB nemo_tex | 3a7ca704 | DONE |
| expB random | 80e6e535 | DONE |
M5. 过夜工程踩坑与修复(核实自 state 各 *_FIX / ROOT_CAUSE_* 记录)
训练侧(VeOmni / 实验A)
- Llama 模板"两连环" bug(qwen 是 chatml,跳过该补丁块所以不受影响):
- BUG1(exit 1): worker 里用
CT=$(python3 -c '...print(m.__file__)')捕获 chat_template.py 路径, 结果把 python 启动时的 SCM/HDFS env 噪声一起捕进$CT→ 路径变垃圾 →grep/cat失败。 修复: 改用 sentinelprint('CTPATH=>'+path)|sed|tail -n1+[ -f ]守卫。 - BUG2(DONE-empty,exit 0 但没训):
train_torch.py报NameError: 'CHAT_TEMPLATE_REGISTRY' not defined(chat_template.py:342)。根因:镜像内 VeOmni(zqfan_vesftcommit 5ec47b83)不用 registry 装饰器, 而是普通 dictTEMPLATES={...}+ChatTemplate(ABC)+ 按message['loss_mask']==1掩码。 修复: 重写注入为class Llama3Template(ChatTemplate)(用 loss_mask)+TEMPLATES['llama3']=Llama3Template。 用 2 个 1-GPU probe job dump 在线 chat_template.py 才定位到。 - 教训:forked VeOmni 多机会静默 exit0/FAIL,必须验证 loss 收敛后才算起来。
- BUG1(exit 1): worker 里用
- VeOmni ckpt 是分布式格式: per-epoch 存的是
global_step_N/{model,optimizer,extra_state}(无 hf_ckpt)。 finals 靠save_hf_weights=True训练末自动出hf_ckpt;要转早期 ckpt 用run_veomni_merge_worker.sh(fork-run 提交,非 create-run)→merge_to_hf_pt.py→ HF。 - NCCL 镜像差异: VeOmni 镜像 NCCL 2.21.5 在 H800(soil-lf grp671)报
nvmlDeviceGetHandleByPciBusId() failed→ 多机崩;A100 多机 OK(与 reference 同 image)。优先 A100。 - 4 节点 rendezvous 不稳: full run 用 4×8 A100 在 TCPStore/首个 NCCL communicator 建立时偶发崩
(
failed to recv, got 0 bytes);2×8 A100 稳定,故 full run 落 2 节点。
判分侧(实验A 难度信号)
- HDFS-only staging 失败(突破点): judge job 在 0 pod、空 err、308s timeout 处死——根因是
idc / quota / group_names 为空。修复: 显式设
arnold_*(idc + group_names)+use_robust_training。 这也是判分/SFT 全面改走 HDFS-only 的原因(兼容跨 IDC)。 - vLLM
generate(prompt_token_ids=...)TypeError: 该版 vLLM 接口不接受该参数 → 8 个 run 崩溃循环; 修复入参后重投 8 个 fresh run。
评估侧
- vLLM cache corruption("Bytes object corrupted, checksum mismatch")把 mmlu/gpqa/scibench 清零
→ 修复:
enforce_eager=True+TORCHINDUCTOR_FORCE_DISABLE_CACHES+VLLM_DISABLE_COMPILE_CACHE。 - qwen no-stop 拖慢:base config eos=151643,但 chatml-SFT 输出 151645 → eval 跑到 max_tokens (mmlu_pro 数小时)。修复 qwen stop=[151645,151643] → mmlu_pro ~12 min,精度不变(math-500 前后一致),快 10–50×。
- llama eval:staged 到
llama_hf_ckpt让 stop=128009 生效。 --model-size无8b:llama-8B 评估用--model-size 7b --model-family llama。- eval worker stdin 被吞:
while read | hdfs get消耗了循环 stdin → 只 stage 了 1 个文件 →FATAL_NO_CONFIG; 修复为先抓 FILES 列表再 for-loop +</dev/null。 - GPQA shuffle bug:
random.seed(42)→random.Random(item["Question"]).shuffle()(per-item 确定性,无位置泄漏)。
关键产物 / 路径速查
- 难度判分产物:
megascience/results/judge_v2_paper_faithful/{judge}__vs__{proxy}/per_uuid_difficulty.parquet - 分布图:同目录
difficulty_dist_compare.png、difficulty_cross_proxy_agreement.png - 实验A 数据 + manifest:
veomni_sft/data/expA/(manifest.json= 权威 B/行数/seed) - 实验A 数据构造脚本:
veomni_sft/data/build_expA_proxytransfer.py - 实验A HDFS 数据:
hdfs://.../user/wangzengzhi/megascience/.../veomni/expA_data/cell_A{1..6}_*.jsonl - 实验B yaml:
megascience/scripts/sft/mix_{nat_nemo,nat_tex,nemo_tex,random}.yaml - 实验B ckpt:
hdfs://.../megascience/sft_ckpts/<config>/<config>/ - 评估 repo / 配置:
Data-Mixture/lm-open-science-evaluation、configs/veomni_expA_bench.json - VeOmni 复用文档:
veomni_sft/README.md