File size: 3,716 Bytes
40d87dd | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | # 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 一致,保持不变
# 但增加提示,显式说明
```
|