Hanrui / syxin_old /eval_alignment_diff.md
Lekr0's picture
Add files using upload-large-folder tool
40d87dd verified
# 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 一致,保持不变
# 但增加提示,显式说明
```