Download docs/15_elf_gpu01_queue.md from jyliuAI/diffusion_baseline: direct link, hf CLI and curl.
- Browser
- Download file 9.16 kB
-
https://huggingface.co/jyliuAI/diffusion_baseline/resolve/main/docs/15_elf_gpu01_queue.md
- Command line
-
hf download hf://jyliuAI/diffusion_baseline/docs/15_elf_gpu01_queue.md
-
curl -L -o 15_elf_gpu01_queue.md https://huggingface.co/jyliuAI/diffusion_baseline/resolve/main/docs/15_elf_gpu01_queue.md
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实验。