diffusion_baseline / docs /15_elf_gpu01_queue.md
jyliuAI's picture
Add files using upload-large-folder tool
6b56858 verified
|
Raw History Blame Contribute Delete
9.16 kB

ELF:GPU 0、1 补齐质量实验

此质量队列已完成32/32格。最新结果归档与用户授权的正式timing见文档16。以下保留此前质量执行步骤,不要重复启动生成。

本页替代文档11–14中手动补跑和旧GPU2队列的安排。使用服务器 ~/diffusion_baseline 中已经下载的 ELF 权重、数据和 dlb-elf 环境;本地只同步代码。此前要求暂缓的 timing 仍不启动。

本次范围与已知进度

实验 本轮完整步数 每个步数的数据量 用户日志已确认 本轮动作
OWT unconditional 1/2/4/8/16/32/1024 1024条 8/16/32;64为辅助结果 核验并复用8/16/32,补缺失格子
OWT 前缀续写 conditional 1/2/4/8/16/32/1024 1024 prompts;前256各5个completion,共2048条 尚未收到结果 准备与旧baseline相同的prompts,再补齐
WMT14 validation 1/2/4/8/16/32/64 3000条 EOS修复后的8/16/32/64 核验复用,补1/2/4
XSum validation 1/2/4/8/16/32/64 11332条 EOS修复后的8/16/32/64 核验复用,补1/2/4
WMT14 test 32/64 3003条 未看到四个test配置的完整清单 只补未完成项
XSum test 32/64 11334条 看到一份全集结果,步数需查manifest 只补未完成项

共32个配置,包含已有结果,不是重新跑32次。调度器按步数由小到大派发,两张卡各有一个独立worker;哪张卡先空闲就领下一格。1024步的两项OWT任务在队列末尾,运行最久。生成/评测batch均为8、seed=42、compile关闭;每个子进程只看见一张GPU,内部使用逻辑 cuda:0。用UUID绑定物理GPU0/1,避免逻辑编号混淆。

OWT输出 Gen.PPL、entropy和长度诊断。前缀续写输出排除prompt loss的conditional PPL、reference conditional PPL、entropy和grouped Self-BLEU;MAUVE是现有可选评分,本队列不默认计算。WMT14看BLEU;XSum看ROUGE-1/2/L。两项任务并非都是翻译:XSum是摘要。

与旧OWT表的边界: 本轮对齐步数、1024样本、seed和GPT-2 Large评分模型/函数;继续使用公开ELF的1024 T5-token生成canvas及当前EOS处理。它不是旧方法的1024 GPT-2-token生成设置,entropy/EOS口径也未完全统一。前缀任务复用旧64 GPT-2-token的文本prompt,T5重编码后生成,评分取最多64 GPT-2-token续写;标记为 c64_text_t5_v1。这些结果用于公开ELF基线,不能声称与旧表所有setting完全一致。换成GPU0/1或重跑同样脚本不会消除差异。本轮不重新训练或更换词表,也不根据test分数调整采样参数。

1. 同步代码,选择持久终端

先确认此前手动启动的ELF作业已经结束,避免重复跑同一配置。在服务器执行:

(
  set -e
  cd ~/diffusion_baseline
  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 log -1 --oneline
  test -f scripts/run_elf_remaining.py
)

这里使用明确的fetch+fast-forward merge,避开此前 git pull 多分支歧义问题。若同步失败,先处理错误,勿继续运行旧文件。

建议在tmux终端运行长队列。有tmux时执行 tmux new -s elf-gpu01;若会话已存在,执行 tmux attach -t elf-gpu01,确认旧队列状态,不要再启动一份。以下命令都在该终端里执行:

cd ~/diffusion_baseline
conda activate dlb-elf
export DLB_ROOT="$PWD"
export ELF_PYTHON="$CONDA_PREFIX/bin/python"
export PYTHONDONTWRITEBYTECODE=1
nvidia-smi -i 0,1

调度器显式覆盖子进程的 CUDA_VISIBLE_DEVICES,不依赖旧GPU2变量。它自己的两张卡互不共享进程;锁只防止本脚本重复使用同一GPU,不能阻止其他人的作业。不要停止其他人的进程。质量实验可以共卡但可能变慢或OOM,正式timing要另选独占时段。

2. 只准备OWT前缀输入

WMT14/XSum数据和模型已经就绪,无需重新下载或执行 prepare_elf.py data。前缀输入需要服务器保留旧baseline的OWT预处理数据及manifest。下面命令只在原prompt文件不存在时构建;已有的必须先通过核验。

(
  set -e
  cd ~/diffusion_baseline
  conda activate dlb-bootstrap
  export DLB_ROOT="$PWD"
  if [ ! -f data/conditional/owt-c64/prompts.jsonl ]; then
    python scripts/build_conditional_prompts.py --root "$DLB_ROOT" --dataset owt
  fi
  python scripts/verify_conditional_prompts.py --root "$DLB_ROOT" --dataset owt

  conda activate dlb-elf
  python scripts/prepare_elf.py prefix
)

如果缺少原OWT预处理数据或核验失败,不创建临时prompt或换数据集绕过。可先执行第3–4步的 --tasks owt wmt14 xsum 子集,前缀输入恢复后再跑 --tasks owt-prefix;调度器也会把缺输入项标记为 blocked_input,允许其他任务继续。

3. 先看计划,不使用GPU

conda activate dlb-elf
cd ~/diffusion_baseline
python -u scripts/run_elf_remaining.py --gpus 0 1 --plan

自动扫描所有 results/elf*/quality,包括旧 elf-h200-gpu2、elf-h200-gpu2-eos-v2 和新目录:

  • skip:样本与指标哈希/计数一致,且当前权重、输入、采样、batch、seed和协议匹配。也会跳过已明确记录的退化无效质量,避免反复刷随机样本;无效结果仍不可填成有效PPL。
  • evaluate:已有完整、匹配的生成文件,只补评分。
  • generate+evaluate:缺少可复用的完整结果。生成到新目录,不覆盖旧样本。
  • BLOCKED:输入缺失或manifest不匹配。计划命令返回2;需处理对应输入,但其他任务可以照常排队。

1000条sanity不替代1024条正式实验;旧无EOS条件结果不复用。部分完成/损坏目录保留,必要时写入 elf-gpu01-retry1 等新根目录。单格生成中断不能逐条续写,因为没有保存中途随机数状态;该格重生成,其他完整格子不重跑。

4. 一条命令启动两张卡

python -u scripts/run_elf_remaining.py --gpus 0 1

只启动这一份队列,不再在另一终端手动启动相同实验循环。 不需要分别设置两份 ELF_RESULTS,也不启动torchrun。脚本会打印 START GPU 0/1 ...、DONE ... 和每30秒进度。

新质量结果写在 results/elf-gpu01/quality/...,已有结果继续保留在原目录。每次调度的终端详细日志及实时清单写在:

results/elf-gpu01/logs/<UTC时间-进程号>/
  queue.json
  <task>__<split>__steps_<N>__seed_42__compile_0__generate.log
  <task>__<split>__steps_<N>__seed_42__compile_0__evaluate.log

遇到低步数空输出或不足两个GPT-2 tokens,评分器可能记录 quality_invalid。队列保留无效原因并继续其他配置,不删除样本、不换seed。其他异常记录 failed,后续格子继续;结束返回非零。不能只看到进程结束就认为所有实验有效。

tmux中按 Ctrl-b,再按 d 可退出界面,后台继续;恢复用 tmux attach -t elf-gpu01。直接 Ctrl-C 会终止本队列及它启动的子进程,保留日志/已完成结果,不停止别人的进程。之后重复第3–4步即可补剩余格子。

5. 查看日志和最终指标

在另一个终端执行(这是只读操作):

cd ~/diffusion_baseline
conda activate dlb-elf
python - <<'PY'
import json
from pathlib import Path
paths = sorted(Path('results/elf-gpu01/logs').glob('*/queue.json'))
if not paths:
    raise SystemExit('尚无队列报告;检查启动终端。')
path = paths[-1]
r = json.loads(path.read_text())
print('报告:', path)
for run in r['runs']:
    c = run['cell']
    print(c['task'], c['split'], c['steps'], run['status'], run['run'])
    if run.get('reason'):
        print('  原因:', run['reason'])
    if run.get('status') == 'failed':
        print('  日志:', run.get('generate_log'), run.get('evaluate_log'))
for item in r['blocked']:
    print('BLOCKED:', item)
PY

想看某个配置的实时终端输出,从启动终端给出的日志目录选对应文件运行 tail -f <具体日志文件>;Ctrl-C仅退出tail,不停止队列。

全部结束后,再执行:

python scripts/inspect_elf_progress.py --root "$PWD" \
  --output "$PWD/results/elf-progress.json"
python -u scripts/run_elf_remaining.py --gpus 0 1 --plan

完成标准:计划为32格、0 queued、0 blocked;另看哪些是 quality_valid、哪些是已运行但 quality_invalid。若仍有排队项/失败项,先看其日志,修复后重复同一队列命令即可。只汇总 elf-gpu01 会漏掉复用的旧结果;以 queue.json 的run路径和跨根目录清单归档。OWT64步、1000条sanity和历史无EOS结果仍在总清单中,不能混入本轮主表。

实际H200推理尚需在服务器验证。本地33项CPU检查覆盖输入矩阵、结果复用、协议不匹配、损坏文件、双worker GPU绑定、无效质量继续运行和只读预览;没有本地下载权重或运行GPU实验。