# DFlash Eval 对齐分析:你的脚本 vs 官方 benchmark.py ## 修改总览 | # | 问题 | 影响 | baseline | lora_inject | |---|------|------|----------|-------------| | 1 | Acceptance Length 计算方式 | 🔴 数值不同 | ✅ 修 | ✅ 修 | | 2 | Multi-turn 对话支持 | 🔴 mt-bench 结果不同 | ✅ 修 | ✅ 修 | | 3 | 样本选择:顺序 vs shuffle | 🔴 子集不同 | ✅ 修 | ✅ 修 | | 4 | 数据集只有3个,官方10个 | 🔴 覆盖不全 | ✅ 修 | ✅ 修 | | 5 | stop_token_ids 检查范围 | 🟡 可能提前/延迟停止 | ✅ 修 | ✅ 修 | | 6 | 分布式聚合方式 | 🟡 丢失per-sample粒度 | ✅ 修 | ✅ 修 | | 7 | AR baseline 含 draft forward | 🔴 speedup偏高(仅inject) | N/A | ✅ 修 | | 8 | max_new_tokens 默认值 | 🟡 | ✅ 修 | ✅ 修 | --- ## 修改详情 ### 1. Acceptance Length 计算方式 **问题:** 官方是 per-sample mean 再取 mean,你的是全局池化。 ```python # ❌ 你的(两个脚本都是) avg_accept_length = total_accept_sum / total_count # ✅ 官方 tau = np.mean([np.mean(r[block_size].acceptance_lengths) for r in responses]) ``` **修改:** 收集每个 sample 的 accept_lengths list,先算 per-sample mean,再取 mean。 --- ### 2. Multi-turn 对话支持 **问题:** 官方对 mt-bench 等多轮数据集,会逐轮生成并将 assistant 回复加入 context。 ```python # ❌ 你的:只取 turns[0],单轮 messages = [{"role": "user", "content": prompt}] # ✅ 官方:逐轮生成 for turn_index, user_content in enumerate(instance["turns"]): messages.append({"role": "user", "content": user_content}) # generate ... messages.append({"role": "assistant", "content": output_text}) responses.append(response) ``` **修改:** 数据加载改为返回 `{"turns": [...]}` 格式,生成循环改为逐轮。 --- ### 3. 样本选择 **问题:** 官方 shuffle 后选取,你的是顺序取前N。 ```python # ❌ 你的 prompts = prompts[:num_samples] # ✅ 官方 dataset = dataset.shuffle(seed=0).select(range(max_samples)) ``` **修改:** 改用 HF dataset 的 shuffle + select。 --- ### 4. 数据集补齐 **问题:** 缺少 math500, aime24, aime25, mbpp, livecodebench, swe-bench, alpaca 共 7 个。 **修改:** 直接复用官方 `load_and_process_dataset()` 函数。 --- ### 5. stop_token_ids 检查范围 ```python # ❌ 你的 baseline(检查到 start) output_ids[:, num_input_tokens:start] # ✅ 官方(检查所有已生成) output_ids[:, num_input_tokens:] ``` **修改:** 改为 `output_ids[:, num_input_tokens:]`。 --- ### 6. 分布式聚合 **问题:** 你用 all_reduce 聚合标量,丢失 per-sample 粒度。 ```python # ❌ 你的:all_reduce sum/count dist.all_reduce(local_sum, op=dist.ReduceOp.SUM) # ✅ 官方:gather 完整 response list responses = dist.gather(responses, dst=0) ``` **修改:** 改为 gather per-sample 的 acceptance_lengths + time metrics 到 rank 0 统一计算。 --- ### 7. AR baseline 含 draft forward (仅 lora_inject) **问题:** block_size=1 时仍跑完整的 inject pipeline(包含 draft model),导致 AR 时间偏大、speedup 偏高。 ```python # ❌ 你的 lora_inject AR baseline spec_generate_inject(..., block_size=1) # 仍会过 draft model layers # ✅ 应该:纯 target autoregressive ar_generate(target_model, input_ids, ...) # 只用 target ``` **修改:** 新增纯 AR 生成函数,block_size=1 时不经过 draft。 --- ### 8. max_new_tokens 默认值 ```python # 官方 shell 脚本用 2048(Python 默认 16384) # 你的默认 2048,和 shell 一致,保持不变 # 但增加提示,显式说明 ```