diffusion_baseline / docs /12_elf_condition_recovery.md
jyliuAI's picture
Add files using upload-large-folder tool
08af434 verified
|
Raw History Blame Contribute Delete
9.22 kB

ELF 正式条件实验中断:诊断和继续运行

本页为故障诊断期间的历史步骤,现由 文档 13:已确认的 EOS 修复与恢复 替代。 用户提供的 audit 已证明唯一配对样本的作者条件等于 raw tokens 加 EOS。现在采用修复后的原始输入流程,不必再按本页切换作者全集;已有作者结果保留。

2026-09-12 最新日志显示:WMT14 连续完成了若干个 3000 样本格子,BLEU 为 13.4014、14.0021、14.1667;随后 XSum 在 216/11332 samples 后报 ValueError: Empty condition。这份恢复步骤优先于文档 11 中使用原始 validation/test 的条件实验命令。

已确认的问题与尚未确认的原因

  • XSum 中断发生在下一批(零基索引 216–223)准备输入时:至少一行得到空的条件 token 列表。仅凭日志不能确定确切行号或是空字符串、空白字符还是分词后为空;新诊断会列出全部空条件 ID。
  • 1069 > 512 是 T5 tokenizer 的长度提示,不是这次异常。当前 ELF XSum 配置将 source 截到 1024,总 canvas 为 1088。不要把 source 上限改成 512 来消除提示,那会改变实验。新预检查使用 verbose=False 做完整分词,再沿用原有模型截断上限。
  • WMT14 的 BLEU≈13–14 明显低于之前 official-validation sanity 的 25.79,需调查原始文本与作者条件 IDs 的差异。此次日志没有格子的步数标签;按此前循环顺序,最后完成的是 64 步,但应以 request.json 为准。不能把该降幅直接归为正常采样误差,也不能凭日志断定唯一原因是 EOS。
  • 旧 prepare 对官方输入使用 condition_input_ids,对原始输入使用 add_special_tokens=False 重新分词。这与锁定版本的官方 JSONL loader一致,但不能据此证明与发布的 Arrow tokens 等价。作者预处理 validation 才是发布配置默认使用的数据。

此前从 sanity 直接切换原始 validation 全集的安排,缺少逐样本输入一致性核验。这次先补核验,并用已下载的作者 validation 全集建立 ELF 基线。原始 validation/test 暂停,不删空样本、不添加虚构 source、不猜测性插入 EOS。已有低分格子保留为待调查的原始输入协议结果;作者数据结果单独存放,不混成一条曲线。

1.更新代码、恢复单张物理 GPU 2 环境

新版本在加载 ELF 权重前扫描本次全部条件输入,空条件会报告数量和行号并提前退出,避免再生成几百条才失败。有效输入的 tokens、截断、采样器和指标没有改变。OWT 已成功完成的质量结果无需重跑。

cd ~/diffusion_baseline
git pull --ff-only origin main
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-official-v1"
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"

失败的原始 XSum 目录包含 samples.jsonl.tmp,不是完整结果,也不能直接从第 217 条拼接续跑:脚本没有保存该位置的完整 RNG 状态。保留该目录,本次使用新的根目录和 official-validation split;不要移动或删除旧结果来伪装恢复。

2.CPU 诊断,并核对之前各格子的任务与步数

不下载数据、不加载模型权重、不占 GPU 推理。读取服务器现有 JSONL、manifest 和本地 T5 tokenizer:

runlog input_audit python scripts/audit_elf_inputs.py \
  --output "$ELF_RESULTS/input-audit.json"

python scripts/summarize_elf.py \
  --results "$DLB_ROOT/results/elf-h200-gpu2" \
  --output "$DLB_ROOT/results/elf-h200-gpu2/summary-before-recovery.csv"

python - <<'PY'
import json, os
from pathlib import Path
root = Path(os.environ['DLB_ROOT']) / 'results/elf-h200-gpu2/quality'
for path in sorted(root.rglob('request.json')):
    request = json.loads(path.read_text())
    metrics = path.with_name('metrics.json')
    m = json.loads(metrics.read_text()) if metrics.exists() else {}
    print(request['task'], (request.get('input') or {}).get('split', 'unconditional'),
          'steps=', request['steps'], 'valid=', m.get('valid'),
          'BLEU=', m.get('metrics', {}).get('bleu'), str(path.parent))
PY

报告重点:raw.empty_condition_ids、official.empty_condition_ids、按 source/reference 文本配对后的 exact_ids_after_source_cap、raw_plus_eos_equals_official、mismatch_examples。匹配按完整文本对进行,不假设两个数据集同一行号就是同一样本;无法匹配或重复匹配的行也会计数。EOS 对比只是诊断,不会修改 token。将 logs/input_audit.log 提供给我,用它确定原始 validation/test 的后续预处理修复。

3.先跑作者 validation 全集的 64 步标准点

先检查诊断成功且作者输入全部非空;通过后运行 WMT14 3000 条、XSum 11332 条。之前 sanity 是独立目录的 1000 条,这里是全集,不会覆盖它。

(
  set -e
  python - <<'PY'
import json, os
from pathlib import Path
r = json.loads((Path(os.environ['ELF_RESULTS']) / 'input-audit.json').read_text())
for task in ('wmt14', 'xsum'):
    assert r['tasks'][task]['official_conditions_nonempty'], (
        task, r['tasks'][task]['official']['empty_condition_ids'])
print('Official validation conditions are nonempty; generation will recheck input hashes.')
PY
  for task in wmt14 xsum; do
    runlog "${task}_official_s64_generate" \
      env ELF_COUNT=0 ELF_STEPS=64 ELF_SPLIT=official-validation \
      bash scripts/run_elf_suite.sh generate "$task"
    runlog "${task}_official_s64_evaluate" \
      env ELF_STEPS=64 ELF_SPLIT=official-validation \
      bash scripts/run_elf_suite.sh evaluate "$task"
  done
)

先看 64 步的 BLEU/ROUGE 是否回到 sanity 的量级。全集与前 1000 条分数可以不同,不设置为了“通过”而调参的分数门槛;如果仍明显偏低,先提供这两个指标与 audit 日志,暂不跑第 4 步的全量扫描。若 preflight 仍报错,保留错误信息,不绕过它。这里的结果应标为 official-validation 全集,不能称 test 结果。

4.标准点合理后,补 8/16/32 步质量

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

5.同一张 H200 独占时测 timing

不要与 generation/evaluate 并行;确认 GPU 2 没有其他计算任务。条件 timing 与本次质量统一使用 official-validation,固定 batch=1,5 次预热、32 次测量,第 0 条输入。OWT 不受这次条件输入问题影响。

nvidia-smi -i "$ELF_GPU_UUID"
(
  set -e
  nvidia-smi -i "$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-before-timing.txt"
  runlog owt_core_timing env ELF_STEPS="8 16 32 64" \
    bash scripts/run_elf_suite.sh timing owt
  for task in wmt14 xsum; do
    runlog "${task}_official_core_timing" \
      env ELF_STEPS="8 16 32 64" ELF_SPLIT=official-validation \
      bash scripts/run_elf_suite.sh timing "$task"
  done
  nvidia-smi -i "$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-after-timing.txt"
)
python scripts/summarize_elf.py \
  --results "$ELF_RESULTS" --output "$ELF_RESULTS/summary.csv"

OWT 质量仍在旧根目录,以上 OWT timing 在新根目录;汇总时按任务/步数/seed/配置匹配,保留两边 provenance。条件任务看 results.encoder_plus_sampler.seconds_per_sample(含 T5 编码)及 results.sampler_cached_condition.seconds_per_sample(缓存编码);OWT 看 results.sampler.seconds_per_sample。这些不含模型加载、CPU 分词、指标计算和 IO;第 0 条重复测量不代表全数据集平均服务延迟。

6.后续实验

OWT 前缀实验仍可按文档 11 的 F 准备和运行,不受 WMT14/XSum 输入问题影响。原始 validation/test 的正式恢复取决于本次 audit 的实证结果;不能将作者 validation 冒充 test,也不能删除空数据后继续声称原始全集。现在先取得可信的作者 validation 质量与 timing 基线,再完成原始集协议核验和 test。