File size: 9,156 Bytes
6b56858 | 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 | # ELF:GPU 0、1 补齐质量实验
**此质量队列已完成32/32格。最新结果归档与用户授权的正式timing见[文档16](16_elf_results_and_timing.md)。以下保留此前质量执行步骤,不要重复启动生成。**
本页替代文档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作业已经结束,避免重复跑同一配置。在服务器执行:
```bash
(
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`,确认旧队列状态,不要再启动一份。以下命令都在该终端里执行:
```bash
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文件不存在时构建;已有的必须先通过核验。
```bash
(
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
```bash
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. 一条命令启动两张卡
```bash
python -u scripts/run_elf_remaining.py --gpus 0 1
```
**只启动这一份队列,不再在另一终端手动启动相同实验循环。** 不需要分别设置两份 `ELF_RESULTS`,也不启动torchrun。脚本会打印 `START GPU 0/1 ...`、`DONE ...` 和每30秒进度。
新质量结果写在 `results/elf-gpu01/quality/...`,已有结果继续保留在原目录。每次调度的终端详细日志及实时清单写在:
```text
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. 查看日志和最终指标
在另一个终端执行(这是只读操作):
```bash
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,不停止队列。
全部结束后,再执行:
```bash
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实验。
|