File size: 10,848 Bytes
08af434
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# ELF 条件输入 EOS 修复与正式实验恢复

本页取代文档 12 中“原始 validation/test 暂停、先改跑作者全集”的临时安排。现有 JSONL、权重、环境无需重新准备;修复发生在 runner 的条件分词阶段,结果使用新目录 `results/elf-h200-gpu2-eos-v2`。

**诊断已经确认什么**

用户提交的服务器 audit 显示:WMT14 的 2992 条唯一文本对、XSum 的全部 11332 条,作者保存的条件 IDs 都严格等于 `raw_no_special_tokens + [EOS]`。EOS ID 为 1(`</s>`)。WMT14 剩余 8 条是重复文本对,旧诊断没有唯一配对;新诊断通过包含重复次数的完整记录比较覆盖它们,不会删除重复样本。

XSum 的 source ID **219、3834、4715、5677、8445** 是空白文本;旧路径返回 `[]`,作者路径是 `[1]`,所以原始实验在准备含第 219 行的 batch 时中断,而作者 sanity 能通过。EOS 属于输入编码格式,并非补写文章内容;这五条仍保留完整 reference 并参与评测。

WMT14 旧输入缺 EOS 的协议错误已确认,是质量下降的重要解释;是否足以恢复 BLEU,要以修正后实测为准,不能声称已经恢复 26 分。此前依据官方 JSONL loader 的无特殊 token 写法没有复现发布 Arrow 的编码,现根据实际发布数据修正。

**修复规则**

- WMT14/XSum 原始文本:完整分词后追加一个 EOS,再截到 source 上限 64/1024;不能先截断再强行补 EOS,也不能预留一个位置替换长文本的最后一个正文 token。
- 已有 `condition_input_ids`:原样使用,不再添加 EOS;已有 official-validation 生成结果不受影响。
- OWT unconditional 与 OWT 前缀续写:保留原协议。前缀续写不是已结束的 source 文本,不能套用这次 EOS 改动。
- `request.json`、`generation.json`、`timing.json` 记录 `condition_tokenization_policy=released_ids_or_raw_plus_eos_then_source_cap_v2`,汇总 CSV 也保留该字段。旧结果缺这个字段,不能仅按 task/steps 与新结果混用。

**1.同步代码并绑定物理 GPU 2**

最新服务器日志中的 `fatal: Cannot fast-forward to multiple branches.` 表明 pull 的整合阶段失败;随后继续使用旧 audit,虽然输出文件名叫 `input-audit-v2.json`,内部 schema 仍是 v1,触发了断言。由于实验块有 `set -e`,本次尚未启动 64 步生成。这不是 EOS 修复再次失效。仅凭日志不能确定为什么出现多个合并目标;先显式抓取和合并唯一的远端 main,不使用可能包含多个候选的 FETCH_HEAD,也不重置本地工作。

先单独执行同步块,看到 `ELF EOS code sync OK` 后再执行下面环境设置。Git pull 本身包含抓取和整合两个阶段,因此“显示抓取到 main”不代表工作区更新成功。[Git 文档](https://git-scm.com/docs/git-pull)

```bash
(
  set -e
  cd ~/diffusion_baseline
  git status --short
  test "$(git branch --show-current)" = main
  git fetch --no-tags origin refs/heads/main:refs/remotes/origin/main
  git merge --ff-only refs/remotes/origin/main
  git merge-base --is-ancestor 1b253e6 HEAD
  git diff --exit-code HEAD -- scripts/elf_common.py scripts/audit_elf_inputs.py scripts/run_elf.py
  git log -1 --oneline
  printf '%s\n' 'ELF EOS code sync OK'
)
```

若此块仍失败,停止并保留报错;不要继续 audit/generate。无须重新克隆、下载资源或删除结果。服务器有本地修改或分支分叉时,以上命令不会强行覆盖它们。

```bash
cd ~/diffusion_baseline
conda activate dlb-elf
export DLB_ROOT="$PWD"
export ELF_PYTHON="$CONDA_PREFIX/bin/python"
export PYTHONDONTWRITEBYTECODE=1
export ELF_PHYSICAL_GPU=2
export ELF_GPU_UUID="$(nvidia-smi -i "$ELF_PHYSICAL_GPU" --query-gpu=uuid --format=csv,noheader)"
export CUDA_VISIBLE_DEVICES="$ELF_GPU_UUID"
export ELF_RESULTS="$DLB_ROOT/results/elf-h200-gpu2-eos-v2"
export ELF_BATCH_SIZE=8 ELF_EVAL_BATCH_SIZE=8 ELF_SEED=42 ELF_COMPILE=0
unset ELF_STEPS ELF_COUNT ELF_SPLIT ELF_TIMING_PROMPT
mkdir -p "$ELF_RESULTS/logs" "$ELF_RESULTS/environment"
set -o pipefail
runlog() {
  local label="$1"
  shift
  "$@" 2>&1 | tee "$ELF_RESULTS/logs/$label.log"
}
nvidia-smi -i "$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-before.txt"
```

**GPU 2 上的小进程是否影响实验**

2026-09-12 14:56 的快照显示总显存约 97 MiB / 143771 MiB、GPU 利用率 0%,有三个同伴的 Python CUDA 进程。当前显存压力很低,可以先运行质量生成与评测;共享运行主要可能拖慢完成时间,如果其他进程后来增加显存也可能导致 OOM。共享本身通常不会改变 BLEU/ROUGE/PPL 的计算口径,不用因此作废成功完成的质量结果。

显存大小不是算力占用指标;0% 也只对应采样窗口。正式 timing 需要与同伴约定 GPU 独占时段,其他任务可能间歇启动 kernel,影响延迟和抖动,目前无法从快照量化影响百分比。[NVIDIA-SMI 指标说明](https://docs.nvidia.com/deploy/nvidia-smi/index.html)

可在另一个终端观察 30 次每秒的进程利用率;`-` 代表指标不可用,不代表零占用。观察只能了解负载,不能保证随后的整个 timing 窗口独占:

```bash
nvidia-smi pmon -i 2 -s um -d 1 -c 30
```

**2.CPU 检查实际修复路径,再跑 64 步 validation 全集**

更新后的诊断会保留旧 `raw` 统计用于对照,所以其中仍显示 5 个空列表是预期的。真正判定修复的是新增的 `corrected_runner_comparison_including_duplicates`:`empty_condition_ids=[]`、`ready_for_raw_validation=true`。完整 token 比较和截断后比较会分别报告,并检查顺序是否一致。它调用 runner 共用的分词函数,不是仅对 EOS 做一个假设性比较。

以下整块先做 CPU 检查,通过后才加载 GPU 模型。两项分别生成全部 3000/11332 条;参考答案不参与条件编码。

本次旧 audit 在 schema 断言处就停止了,因此同步成功后可以直接重跑下块、沿用 `elf-h200-gpu2-eos-v2` 目录。诊断 JSON 会更新成 v2;无需清空整个结果目录。如果后来另外启动过生成,则仍需先检查相应格子是否已完成,避免重复运行。

```bash
(
  set -e
  runlog input_audit_v2 python scripts/audit_elf_inputs.py \
    --output "$ELF_RESULTS/input-audit-v2.json"
  python - <<'PY'
import json, os
from pathlib import Path
r = json.loads((Path(os.environ['ELF_RESULTS']) / 'input-audit-v2.json').read_text())
assert r['schema'] == 'elf-condition-audit-v2'
for task in ('wmt14', 'xsum'):
    c = r['tasks'][task]['corrected_runner_comparison_including_duplicates']
    print(task, c)
    assert c['ready_for_raw_validation'], f'{task}: 修复后的条件与作者数据仍不一致,请保留报告'
print('条件输入核验通过,开始 64 步 validation 全集')
PY
  for task in wmt14 xsum; do
    runlog "${task}_val_s64_generate" \
      env ELF_COUNT=0 ELF_STEPS=64 ELF_SPLIT=validation \
      bash scripts/run_elf_suite.sh generate "$task"
    runlog "${task}_val_s64_evaluate" \
      env ELF_STEPS=64 ELF_SPLIT=validation \
      bash scripts/run_elf_suite.sh evaluate "$task"
  done
)
```

先看 WMT14 BLEU 和 XSum ROUGE 是否回到先前 sanity 的合理量级;全集与前 1000 条允许有抽样差异。如果仍明显异常,先提供这两项指标和 audit v2,不继续扩展扫描。无需再次跑 1000 条 sanity 或重复作者全集;如果作者全集已启动,先让它完成或正常停止,勿在同一 GPU 同时启动本节。

**3.64 步质量确认后,重跑原始 validation 的 8/16/32 步**

旧 WMT14 的 13–14 分结果使用了错误的 source 编码,不能只重算指标,必须重新生成;旧 XSum 的部分 `.tmp` 不能拼接进新结果。全部旧文件保留,不删除、不覆盖。

```bash
(
  set -e
  for task in wmt14 xsum; do
    for steps in 8 16 32; do
      runlog "${task}_val_s${steps}_generate" \
        env ELF_COUNT=0 ELF_STEPS="$steps" ELF_SPLIT=validation \
        bash scripts/run_elf_suite.sh generate "$task"
      runlog "${task}_val_s${steps}_evaluate" \
        env ELF_STEPS="$steps" ELF_SPLIT=validation \
        bash scripts/run_elf_suite.sh evaluate "$task"
    done
  done
)
```

**4.单卡独占时测修复后的条件 timing**

固定 batch=1、5 次 warmup、32 次 repeats,默认第 0 条输入;不与生成/指标评测并行。旧原始输入的 timing 也使用了不同条件长度,不能替代修复后的 timing。

```bash
nvidia-smi -i "$ELF_GPU_UUID"
(
  set -e
  nvidia-smi -i "$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-before-timing.txt"
  for task in wmt14 xsum; do
    runlog "${task}_val_timing" \
      env ELF_STEPS="8 16 32 64" ELF_SPLIT=validation \
      bash scripts/run_elf_suite.sh timing "$task"
  done
  nvidia-smi -i "$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-after-timing.txt"
)
```

同时保留 `sampler_cached_condition` 和 `encoder_plus_sampler` 的 `seconds_per_sample`,后者包含 T5 条件编码;两者均不含加载、CPU tokenizer、IO 和指标计算。这是单输入重复测量,不是全集平均服务耗时。OWT 的质量/已有 timing 不受本次修复影响;若 OWT timing 尚未跑,可在独占时用本目录单独运行 `env ELF_STEPS="8 16 32 64" bash scripts/run_elf_suite.sh timing owt`,质量继续引用旧目录。

**5.恢复 test:先冻结标准 64 步,使用同一 EOS 规则**

validation 检查确认后可执行完整 WMT14 test 3003 条、XSum test 11334 条。此次 EOS 规则由作者 validation 实证确定,再应用于 test;没有作者 test token 文件用于逐行对照,因此报告“官方权重在公开 test 上按验证过的 source EOS 规则重评”,不宣称已确认论文全部 test 预处理相同。空 source 仍保留,完整 reference 不截断。

```bash
(
  set -e
  for task in wmt14 xsum; do
    runlog "${task}_test_s64_generate" \
      env ELF_COUNT=0 ELF_STEPS=64 ELF_SPLIT=test \
      bash scripts/run_elf_suite.sh generate "$task"
    runlog "${task}_test_s64_evaluate" \
      env ELF_STEPS=64 ELF_SPLIT=test \
      bash scripts/run_elf_suite.sh evaluate "$task"
    # 此时同样要求 GPU 独占。
    runlog "${task}_test_s64_timing" \
      env ELF_STEPS=64 ELF_SPLIT=test \
      bash scripts/run_elf_suite.sh timing "$task"
  done
)
python scripts/summarize_elf.py \
  --results "$ELF_RESULTS" --output "$ELF_RESULTS/summary.csv"
```

更少步数的 test 配置先根据 validation 冻结,再补测。OWT 前缀和扩展步数仍按文档 11 的 F/H2 实施;原始条件任务的相关命令使用本页的新结果根目录。任何已经成功的格子都不要原样重复 generate;若只缺指标则只 evaluate,若只缺 timing 则只 timing。