File size: 22,134 Bytes
93cd35a | 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 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 | # DS210029:数据准备完成后,用单张 H200 跑 ELF
**最新状态:已确认原始条件输入缺少 EOS 并修复。请优先按 [文档 13 的恢复步骤](13_elf_eos_fix.md) 继续 WMT14/XSum 的 validation/test,使用新的 `elf-h200-gpu2-eos-v2` 结果根目录。** OWT 与前缀步骤仍可使用;不要整体重跑已经完成的格子。文档 12 是诊断期间的临时安排,现已被替代。
这份步骤从你 **2026-09-11 已完成数据导出** 的状态开始。按 A → B → C → D → E → F → G → H 顺序执行。所有命令都在服务器 `~/diffusion_baseline`;不再执行 Conda 创建、pip 安装、源码下载或 `prepare_elf.py assets/data`。模型推理均使用同一张 H200、单进程、generation batch=8;正式 timing 固定 batch=1。
**2026-09-12 sanity 日志更新:C/D 已成功完成,不再执行。** 先阅读 D1 的指标判读;如果换了 shell,按 B 恢复环境,然后执行 E。F 尚未准备时可以先执行 G 的前三个任务;前缀 timing 已单列为可选后续命令。
**A. 你已经完成什么,还需要跑什么**
已完成:`dlb-elf` 环境、锁定 ELF 源码、10 项模型/数据资源下载及校验、以下 6 个 JSONL 导出。
| 数据文件 | 行数 | 用途 |
|---|---:|---|
| wmt14-official-validation | 3000 | 作者预处理版本的 sanity check |
| wmt14-validation | 3000 | 扫步数、选择配置 |
| wmt14-test | 3003 | 冻结配置后的正式测试 |
| xsum-official-validation | 11332 | 作者预处理版本的 sanity check |
| xsum-validation | 11332 | 扫步数、选择配置 |
| xsum-test | 11334 | 冻结配置后的正式测试 |
最新日志还确认完成:物理 GPU 2 的 CUDA bf16 检查、OWT/WMT14/XSum smoke、三项 1000 样本 sanity 生成和质量评测。尚未收到正式全集质量、timing、OWT 前缀续写 prompts 的结果。OWT unconditional 无需下载训练集;OWT 前缀续写需要服务器上原 benchmark 的 held-out prompts,放在 F 单独准备。
本轮实验清单如下。先完成“核心”,再补扩展;不要上来直接运行最贵的 1024 步。
| 阶段 | 实验 | 步数 | 样本数 | 目的 |
|---|---|---|---:|---|
| C | OWT/WMT14/XSum smoke | OWT 1/32;另两项 1/64 | 每格 2 | 确认加载、采样、条件编码能运行 |
| D | 官方配置 sanity | OWT 32;另两项 64 | 每格 1000 | 先检查质量大致合理 |
| E1 | OWT unconditional 核心 | 8/16/32/64 | 每格 1024 | PPL、entropy 曲线 |
| E2 | WMT14/XSum validation 核心 | 8/16/32/64 | 全集 3000/11332 | BLEU/ROUGE 随步数变化 |
| F | OWT 零样本前缀续写核心 | 8/16/32/64 | 每格 2048 个续写 | CPPL、entropy、Self-BLEU |
| G | 上述核心配置 timing | 相同步数 | 每格 5 warmup+32 repeats | 同一 H200 的独立延迟 |
| H1 | WMT14/XSum test 标准点 | 64 | 全集 3003/11334 | 正式 baseline 质量与 timing |
| H2 | 扩展曲线 | OWT/前缀 1/2/4/128/256/512/1024;条件任务 1/2/4 | 同正式设置 | 补齐此前要求的 grid |
本轮无需训练你的方法;先保存 ELF 基线。WMT14 是德译英,XSum 是摘要。
**B. 固定使用物理 GPU 2(2026-09-12 更新)**
你已确认当前空闲的是 **2 号 H200 NVL**,本轮所有实验固定使用物理 GPU 2。此前 9 月 11 日快照里的占用情况已过时,不再按物理 GPU 3 安排。正式 timing 期间仍保持该卡独占,不与其他生成、评测或训练进程并行。
先拉取文档更新,并记录开始前的 2 号卡状态:
```bash
cd ~/diffusion_baseline
git pull --ff-only origin main
nvidia-smi -i 2
```
下面通过物理 GPU 2 的 UUID 绑定进程,所有后续命令自动沿用该卡。本轮结果使用 `results/elf-h200-gpu2`,先前目录保持原样;无需重新下载或预处理。
长任务建议放在 tmux 中:若服务器已安装 tmux,先 `tmux new -s elf-h200`,然后在其中运行后续命令;离开按 Ctrl+B 再按 D,回来执行 `tmux attach -t elf-h200`。没有 tmux 时可先在当前 SSH 终端做 smoke,长任务前再安排不会断线的运行方式。
```bash
cd ~/diffusion_baseline
conda activate dlb-elf
export DLB_ROOT="$PWD"
export ELF_PYTHON="$CONDA_PREFIX/bin/python"
export PYTHONDONTWRITEBYTECODE=1
# 这里的 2 指 nvidia-smi 显示的物理卡号。
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"
export ELF_BATCH_SIZE=8
export ELF_EVAL_BATCH_SIZE=8
export ELF_SEED=42
export ELF_COMPILE=0
unset ELF_STEPS ELF_COUNT ELF_SPLIT ELF_TIMING_PROMPT
mkdir -p "$ELF_RESULTS/logs" "$ELF_RESULTS/environment"
nvidia-smi -i "$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-before.txt"
printf '%s\n' "physical_gpu=$ELF_PHYSICAL_GPU" "uuid=$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-selection.txt"
python -m pip freeze > "$ELF_RESULTS/environment/pip-freeze.txt"
# 日志保存在文件中;pipefail 让 tee 不掩盖实验失败。
set -o pipefail
runlog() {
local label="$1"
shift
"$@" 2>&1 | tee "$ELF_RESULTS/logs/$label.log"
}
```
CUDA 接受 GPU UUID 作为 `CUDA_VISIBLE_DEVICES`;这种绑定避免把物理卡号与框架枚举顺序混淆。进程只见一张卡,所以 Python 显示 `cuda:0` 是正常的,它对应刚选定的物理 H200,不是机器的物理 GPU 0。[NVIDIA 环境变量说明](https://docs.nvidia.com/cuda/cuda-programming-guide/05-appendices/environment-variables.html)
进行一次小型 CUDA 检查:
```bash
python - <<'PY'
import os, torch
print('selected UUID:', os.environ['CUDA_VISIBLE_DEVICES'])
print('torch:', torch.__version__, 'wheel CUDA:', torch.version.cuda)
print('visible GPUs:', torch.cuda.device_count())
assert torch.cuda.is_available() and torch.cuda.device_count() == 1
print('logical cuda:0:', torch.cuda.get_device_name(0))
assert 'H200' in torch.cuda.get_device_name(0)
assert torch.cuda.is_bf16_supported()
x = torch.randn(256, 256, device='cuda', dtype=torch.bfloat16)
y = x @ x
torch.cuda.synchronize()
print('CUDA bf16 check passed:', tuple(y.shape))
PY
```
你的驱动为 575.57.08;保留已安装的 `torch 2.5.1+cu124` 即可,不需要为了 `nvidia-smi` 顶部显示 CUDA 12.9 改装 cu129。驱动支持版本与 wheel 内的 CUDA 运行时不是同一个字段;最终以这次实际 CUDA 检查和 smoke 为准。[NVIDIA 兼容性说明](https://docs.nvidia.com/deploy/cuda-compatibility/minor-version-compatibility.html)
每次更换 SSH/tmux shell,需要重新执行环境设置和 `runlog` 定义。不要在同一 GPU 同时开多个实验终端;下面的命令全部串行。
**C. 先跑 3 组 smoke,不先测正式 timing**
以下小块使用子 shell 的 `set -e`,任何一项失败都会停止这一块;不要看到报错后直接进入下一节。
```bash
(
set -e
runlog smoke_owt env ELF_STEPS="1 32" bash scripts/run_elf_suite.sh smoke owt
runlog smoke_wmt14 env ELF_STEPS="1 64" ELF_SPLIT=official-validation bash scripts/run_elf_suite.sh smoke wmt14
runlog smoke_xsum env ELF_STEPS="1 64" ELF_SPLIT=official-validation bash scripts/run_elf_suite.sh smoke xsum
)
```
成功标志:每格进度到 `2/2 samples`、无 traceback、对应目录出现 `generation.json` 和 `samples.jsonl`。例如:
```text
results/elf-h200-gpu2/smoke/owt/unconditional/steps_32/seed_42/compile_0/
results/elf-h200-gpu2/smoke/wmt14/official-validation/steps_64/seed_42/compile_0/
results/elf-h200-gpu2/smoke/xsum/official-validation/steps_64/seed_42/compile_0/
```
smoke 是功能检查,不凭两个样本判断论文质量;1 步生成很差也不等于实现错误。若失败,把对应 `logs/smoke_*.log` 的 traceback 发来。首次模型加载与文件校验期间可能暂时没有采样进度,不要因此再开第二份进程。
**D. 1000 样本 sanity:确认质量合理,再花时间扫全集**
这一节单独存到 `results/elf-h200-gpu2-sanity`,不会覆盖后面的正式 1024 样本或完整 validation。
```bash
(
set -e
export ELF_RESULTS="$DLB_ROOT/results/elf-h200-gpu2-sanity"
mkdir -p "$ELF_RESULTS/logs"
runlog owt32_generate env ELF_COUNT=1000 ELF_STEPS=32 bash scripts/run_elf_suite.sh generate owt
runlog owt32_evaluate env ELF_STEPS=32 bash scripts/run_elf_suite.sh evaluate owt
runlog wmt64_generate env ELF_COUNT=1000 ELF_STEPS=64 ELF_SPLIT=official-validation bash scripts/run_elf_suite.sh generate wmt14
runlog wmt64_evaluate env ELF_STEPS=64 ELF_SPLIT=official-validation bash scripts/run_elf_suite.sh evaluate wmt14
runlog xsum64_generate env ELF_COUNT=1000 ELF_STEPS=64 ELF_SPLIT=official-validation bash scripts/run_elf_suite.sh generate xsum
runlog xsum64_evaluate env ELF_STEPS=64 ELF_SPLIT=official-validation bash scripts/run_elf_suite.sh evaluate xsum
)
```
`generate` 只生成并保存样本;`evaluate` 才计算指标。评测成功会打印 JSON 并保存 `metrics.json`。OWT 32 步论文参考 PPL≈24、entropy≈5.15;WMT14 BLEU 和 XSum ROUGE 的论文 test 参考分别为 26.4、36.0/12.2/27.8。这些只是量级参照,当前 sanity 使用 1000 条 official-validation,不能当作 test 全集结果。明显偏离时先检查日志与样本,不根据 test 分数反复调参。
括号结束后,`ELF_RESULTS` 自动回到 B 设置的 `results/elf-h200-gpu2`,不需要手动 unset。
**D1. 本次 sanity 日志判读:主指标合理,继续正式实验**
三组均完成 `1000/1000 samples` 并打印评测 JSON,没有 traceback。终端先后打印 OWT、WMT14、XSum;条件任务的通用评测器都会打印 BLEU 和 ROUGE,应按任务读取主指标:
| 任务 | 本次主指标 | 前文记录的论文参考 | 判读 |
|---|---|---|---|
| OWT,32 步 | PPL **24.4239**;entropy **5.1671 nats** | 24.1;5.15 | PPL 高约 1.34%,entropy 高约 0.017,量级接近 |
| WMT14,64 步 | BLEU **25.7906** | 26.4 | 低约 0.61 BLEU;当前是前 1000 条 official-validation,不是论文 test |
| XSum,64 步 | ROUGE-1/2/L **36.3126 / 12.3464 / 28.1115** | 36.0 / 12.2 / 27.8 | 量级接近;不能据此声称 test 超过论文 |
XSum 的 BLEU=8.0842 是附带指标,不是截图中 XSum 的评价列;WMT14 的 ROUGE=59.24/33.29/53.85 也不应拿去对比 XSum。OWT 的 entropy 是每条文本的经验 unigram 熵,PPL 是 GPT-2 Large 的预测困惑度,两者不是同一个概率分布,所以不要求 `entropy = ln(PPL)`。ROUGE 的 `_sem` 是此次 1000 条样本之间的标准误,不是多个随机种子的标准差,不能与论文误差条直接判定显著性。
两条 tokenizer 警告均未导致本次失败:
- `clean_up_tokenization_spaces` 是所装 Transformers 版本的未来默认值提示,本次不用升级或重装环境。
- `1037 > 1024` 来自评测脚本先对完整文本分词以统计原始长度;`above_1024_tokens_fraction=0.002` 表示 1000 条里有 2 条超过 GPT-2 的 1024 上限。实际 PPL 调用 `compute_gen_ppl` 时明确设置 `truncation=True, max_length=1024`,entropy 同样取前 1024 个 GPT-2 tokens。样本没有被丢弃,超长部分不计分,结果中已记录右截断策略。
长度还可做交叉检查:原始平均长度 946.265 对应总计 946265 tokens;减去每条不计首 token 的 1000 个目标以及截断掉的 21 tokens,得到日志中的 `valid_token_count=945244`。所有三项 `empty_fraction=0`,OWT 最短也有 828 个 GPT-2 tokens,未见空输出或极短输出退化的迹象。
**结论:日志未显示需要修复的生成或计分错误,保留已有 sanity,不改采样参数、不重跑 C/D,进入 E 的正式步数扫描。** 当前没有正式 timing,不能从 `8/1000 samples` 的进度或生成总用时推断单样本延迟。此次日志判读仅说明 sanity 合理,正式 test 和速度结论仍待测量。
**E. 核心正式质量实验:OWT → WMT14 → XSum**
先 OWT,后条件任务;同一张 H200 连续串行运行。显式固定 OWT 为 1024 条、条件任务为完整 validation,按每个步数先生成再评测,便于及时看到对应质量:
```bash
(
set -e
for steps in 8 16 32 64; do
runlog "owt_s${steps}_generate" env ELF_COUNT=1024 ELF_STEPS="$steps" bash scripts/run_elf_suite.sh generate owt
runlog "owt_s${steps}_evaluate" env ELF_STEPS="$steps" bash scripts/run_elf_suite.sh evaluate owt
done
for task in wmt14 xsum; do
for steps in 8 16 32 64; do
runlog "${task}_s${steps}_generate" env ELF_COUNT=0 ELF_STEPS="$steps" ELF_SPLIT=validation bash scripts/run_elf_suite.sh generate "$task"
runlog "${task}_s${steps}_evaluate" env ELF_STEPS="$steps" ELF_SPLIT=validation bash scripts/run_elf_suite.sh evaluate "$task"
done
done
)
```
预期每个 OWT 格子 1024 样本,WMT14 格子 3000 样本,XSum 格子 11332 样本。核心质量结果共 12 格。XSum 总 canvas 为 1088 T5 tokens,完整 validation 比 1000 样本 sanity 更耗时;不要把没有新终端输出等同于卡死。
查看任意一个完成的指标文件:
```bash
cat "$ELF_RESULTS/quality/owt/unconditional/steps_32/seed_42/compile_0/metrics.json"
cat "$ELF_RESULTS/quality/wmt14/validation/steps_64/seed_42/compile_0/metrics.json"
cat "$ELF_RESULTS/quality/xsum/validation/steps_64/seed_42/compile_0/metrics.json"
```
**F. OWT 前缀续写:另外准备 prompts,再跑核心实验**
刚导出的六个数据文件不含 OWT 前缀 prompts。先检查已有文件:
```bash
ls -l data/conditional/owt-c64/prompts.jsonl data/manifests/conditional-owt-c64.json
```
若文件已存在,直接在 bootstrap 环境验证;若不存在但已有原 benchmark 的 OWT 预处理数据,先构建再验证:
```bash
conda activate dlb-bootstrap
# 仅在 prompts 尚未准备时执行这一行:
python scripts/build_conditional_prompts.py --root "$DLB_ROOT" --dataset owt
python scripts/verify_conditional_prompts.py --root "$DLB_ROOT" --dataset owt
conda activate dlb-elf
export ELF_PYTHON="$CONDA_PREFIX/bin/python"
python scripts/prepare_elf.py prefix
```
如果构建提示缺少 OWT processed 数据,先完成 [旧数据准备流程](02_datasets.md);这不会妨碍你先完成 E/G/H 中不依赖前缀的三个任务。不要用 WMT14 或 XSum 来替代 OWT prompts。
```bash
(
set -e
runlog prefix_smoke env ELF_STEPS="1 32" bash scripts/run_elf_suite.sh smoke owt-prefix
runlog prefix_core_generate env ELF_STEPS="8 16 32 64" bash scripts/run_elf_suite.sh generate owt-prefix
runlog prefix_core_evaluate env ELF_STEPS="8 16 32 64" bash scripts/run_elf_suite.sh evaluate owt-prefix
)
```
smoke 使用 2 个 prompts,每个 5 个续写,共 10 条;正式每格 1024 个主续写,加前 256 prompts 各 4 个额外续写,共 2048 条。默认得到 CPPL、entropy、grouped Self-BLEU;MAUVE 后续可补,不是继续主流程的前提。
**G. 核心 timing:同一张 H200 独占时单独运行**
测量前确认你自己的 generation/evaluate 均已结束,并重新检查所选卡,不能用 10:47 的旧快照代替:
```bash
nvidia-smi -i "$ELF_GPU_UUID"
```
如果仍有其他计算进程,等其结束或取得独占时段。就绪后执行:
```bash
(
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
runlog wmt_core_timing env ELF_STEPS="8 16 32 64" ELF_SPLIT=validation bash scripts/run_elf_suite.sh timing wmt14
runlog xsum_core_timing env ELF_STEPS="8 16 32 64" ELF_SPLIT=validation bash scripts/run_elf_suite.sh timing xsum
nvidia-smi -i "$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-after-timing.txt"
)
```
只有完成 F 的 prefix 准备后,再单独测前缀任务;同样保持 GPU 独占:
```bash
(
set -e
nvidia-smi -i "$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-before-prefix-timing.txt"
runlog prefix_core_timing env ELF_STEPS="8 16 32 64" bash scripts/run_elf_suite.sh timing owt-prefix
nvidia-smi -i "$ELF_GPU_UUID" > "$ELF_RESULTS/environment/gpu-after-prefix-timing.txt"
)
```
也在另一个终端观察 GPU 是否被新任务占用;前后两张快照不能证明整个计时窗口独占。若发生干扰,此次 timing 标为受干扰,之后用新结果目录重测,不能据此算加速比。
每个格子固定 batch=1、5 次 warmup、32 次重复;无需将 `ELF_BATCH_SIZE=8` 改为 1,timing 入口会强制传 1。保存位置例:
```text
results/elf-h200-gpu2/timing/owt/unconditional/steps_32/seed_42/compile_0/prompt_0/timing.json
results/elf-h200-gpu2/timing/xsum/validation/steps_64/seed_42/compile_0/prompt_0/timing.json
```
主要读取 `results.sampler.seconds_per_sample`;条件任务读取 `results.sampler_cached_condition.seconds_per_sample` 和 `results.encoder_plus_sampler.seconds_per_sample`,后者包含 T5 条件编码。它们包含最终神经网络解码,不含加载、CPU tokenizer、磁盘 IO 和指标计算。不要把 generation 的总 wall time 当作正式延迟。
**H. 正式 test、扩展曲线和多 seed**
H1:先固定论文标准 64 步条件配置,不在 test 上选择参数。使用完整 test 集:
```bash
(
set -e
runlog wmt_test_generate env ELF_STEPS=64 ELF_SPLIT=test bash scripts/run_elf_suite.sh generate wmt14
runlog wmt_test_evaluate env ELF_STEPS=64 ELF_SPLIT=test bash scripts/run_elf_suite.sh evaluate wmt14
runlog xsum_test_generate env ELF_STEPS=64 ELF_SPLIT=test bash scripts/run_elf_suite.sh generate xsum
runlog xsum_test_evaluate env ELF_STEPS=64 ELF_SPLIT=test bash scripts/run_elf_suite.sh evaluate xsum
# 仍须满足 G 的独占条件。
runlog wmt_test_timing env ELF_STEPS=64 ELF_SPLIT=test bash scripts/run_elf_suite.sh timing wmt14
runlog xsum_test_timing env ELF_STEPS=64 ELF_SPLIT=test bash scripts/run_elf_suite.sh timing xsum
)
```
WMT14 应为 3003 条,XSum 应为 11334 条。若还要报告更少步但质量接近的点,先在 validation 上选择并记录冻结配置,再指定那些步数跑 test,不自动把某个低步数点叫作最优。
H2:核心完成后补扩展,每个格子都生成、评测、计时。OWT/前缀比核心多 7 个步数,条件任务多 3 个:
```bash
(
set -e
for task in owt owt-prefix; do
runlog "${task}_extra_generate" env ELF_STEPS="1 2 4 128 256 512 1024" bash scripts/run_elf_suite.sh generate "$task"
runlog "${task}_extra_evaluate" env ELF_STEPS="1 2 4 128 256 512 1024" bash scripts/run_elf_suite.sh evaluate "$task"
runlog "${task}_extra_timing" env ELF_STEPS="1 2 4 128 256 512 1024" bash scripts/run_elf_suite.sh timing "$task"
done
for task in wmt14 xsum; do
runlog "${task}_extra_generate" env ELF_STEPS="1 2 4" ELF_SPLIT=validation bash scripts/run_elf_suite.sh generate "$task"
runlog "${task}_extra_evaluate" env ELF_STEPS="1 2 4" ELF_SPLIT=validation bash scripts/run_elf_suite.sh evaluate "$task"
runlog "${task}_extra_timing" env ELF_STEPS="1 2 4" ELF_SPLIT=validation bash scripts/run_elf_suite.sh timing "$task"
done
)
```
如果 F 未就绪,先把第一行循环中的 `owt-prefix` 去掉,之后再补它。如果低步数空输出导致 PPL 无效,脚本会保留 `valid=false` 并停止;这是可能的质量结果,不能删除空样本抬高指标。确认是哪一格后,用 `ELF_STEPS` 单独指定剩余未评测格子继续;**不要把生成循环整体重跑**,因为已有输出目录会被拒绝。
H3:第一次完整流程成功后才补关键点 seed 43/44 或 compiled 版本,避免现在一次启动过多配置。比如补两种条件任务的标准点:
```bash
(
set -e
for seed in 43 44; do
for task in wmt14 xsum; do
runlog "${task}_test_seed${seed}_generate" env ELF_SEED="$seed" ELF_STEPS=64 ELF_SPLIT=test bash scripts/run_elf_suite.sh generate "$task"
runlog "${task}_test_seed${seed}_evaluate" env ELF_SEED="$seed" ELF_STEPS=64 ELF_SPLIT=test bash scripts/run_elf_suite.sh evaluate "$task"
runlog "${task}_test_seed${seed}_timing" env ELF_SEED="$seed" ELF_STEPS=64 ELF_SPLIT=test bash scripts/run_elf_suite.sh timing "$task"
done
done
)
```
**I. 结果位置、汇总与中断恢复**
```bash
python scripts/summarize_elf.py \
--results "$ELF_RESULTS" --output "$ELF_RESULTS/summary.csv"
```
| 目录 | 内容 |
|---|---|
| `results/elf-h200-gpu2/logs/` | 每个步骤的终端日志 |
| `results/elf-h200-gpu2/smoke/` | 小样本功能检查,不能当正式质量结果 |
| `results/elf-h200-gpu2/quality/` | 正式 samples、generation manifest、metrics |
| `results/elf-h200-gpu2/timing/` | 原始重复测量、均值/中位数/标准差 |
| `results/elf-h200-gpu2/environment/` | 物理 GPU UUID 映射、环境和 GPU 快照 |
| `results/elf-h200-gpu2-sanity/` | 1000 样本预检查,与主实验分开 |
核心 E+F 的主质量格子共 16 个,相应 G timing 共 16 个;H1 另加 2 个 test 质量格子和 2 个 timing 格子。某项没跑就应留作 missing,不用别的 split 或 sanity 数据补数。summary 是逐 run 清单,质量和 timing 分开列,smoke 也可能显示 incomplete;不是完成度证明或自动排好的论文表。
失败目录不会被覆盖。若某次失败且目录已存在,先保留日志,用新的 `ELF_RESULTS` 目录(例如 `results/elf-h200-gpu2-retry1`)只重跑失败点;评测时要指向相同新目录。已经成功生成但尚未评测的点,只执行 evaluate;已经有质量结果而缺 timing,只执行 timing。不要在同一根目录里改变 seed/batch/compile 或样本数后覆写同一格。
如果 shell 断开后要恢复,先重新设置 B 中的变量和 `runlog` 函数,查询当前 GPU 占用,再从未完成的阶段继续。本次更新基于你提供的服务器终端日志,没有在服务器代跑;已确认 C/D 的运行结果,后续全集质量和实际 timing 仍待执行。
|