From 26644c09a465a2b94d5358b3a0ba9ae714b83adc Mon Sep 17 00:00:00 2001 From: bingshuo <565183519@qq.com> Date: Mon, 18 May 2026 21:16:11 +0800 Subject: [PATCH] d101-cognitive-chain: add v6 vocab_size fix, 4 crash root causes, new thinking patterns --- brain/d101-cognitive-chain.md | 83 +++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/brain/d101-cognitive-chain.md b/brain/d101-cognitive-chain.md index e64aa58..dc33f98 100644 --- a/brain/d101-cognitive-chain.md +++ b/brain/d101-cognitive-chain.md @@ -190,3 +190,86 @@ head -20 train.log # 启动日志(确认配置) - 尝试对服务器上的脚本做sed修补 → 破坏了Python语法 - **修复:** 改用Python heredoc在服务器端完整生成脚本 - **教训:** 对于复杂的脚本修改,直接重写比修补更安全 + +--- + +## 八、D101后半段 蒸馏修复完整记录(20:30~21:00) + +### 事情经过 + +蒸馏又崩溃了。这次是新错误: + +``` +RuntimeError: The size of tensor a (152064) must match the size of tensor b (151936) at non-singleton dimension 2 +``` + +**根因:** Qwen2.5-7B的vocab_size=152064,Qwen2.5-1.5B的vocab_size=151936。KL散度要求两个tensor的最后一维一致。 + +### 四次崩溃的完整根因链 + +| 版本 | 崩溃原因 | 根因 | 修复 | +|------|---------|------|------| +| v1 | STUDENT_PATH路径不存在 | 未在服务器上确认路径 | 改为实际下载路径 | +| v2 | COS密钥缺失(脚本下载Teacher失败) | 密钥未export | export后再启动 | +| v3 | Teacher logits预存储到RAM → 116GB RSS → OOM | 存储所有teacher_logits在内存 | 改为即时forward(on-the-fly) | +| v4 | DataLoader num_workers=2 → CUDA fork崩溃 | 多进程不能重新初始化CUDA | 改为num_workers=0 | +| v5 | forward参数名用了ii/am(HuggingFace需要input_ids/attention_mask) | HF接口规范不匹配 | 改为input_ids= / attention_mask= | +| v5.5 | vocab_size不匹配(152064 vs 151936) | Qwen2.5不同规模模型词汇表不同 | 截断teacher_logits到student词汇表 | + +### 关键认知:vocab_size不匹配 + +Qwen2.5模型家族的vocab_size: +- 小模型(0.5B/1.5B/3B):**151936** +- 大模型(7B/14B/32B/72B):**152064** +- 多出的128个token是额外特殊token + +**修复方式:** `t_logits = t_logits[..., :student.config.vocab_size]` — 直接截断teacher logits的最后一维。 + +### 最终v6状态(21:00) + +``` +PID: 82143 | Epoch 1/3 | step=50 | loss=6.66 | sft=2.56 | kl=8.42 +GPU: 96.1/97.9GB (98%) | 利用率 99% | 温度 70°C +速度: ~1.08s/step | 预计总耗时: ~2.6小时 | 预计完成: ~23:30 +``` + +### 新思维模式5:Qwen2.5跨规模蒸馏的vocab_size栅栏 + +``` +模型规模 <-> vocab_size 对应关系: + ≤3B params: vocab_size=151936 + ≥7B params: vocab_size=152064 + +蒸馏时必须截断Teacher logits: + t_logits = t_logits[..., :student.config.vocab_size] + +tokenizer可以通用(Qwen2.5家族共享tokenizer),但最后一层linear层维度不同。 +这是架构层面的不兼容,不是配置问题。 +``` + +### 新思维模式6:蒸馏脚本的终极范式(v6已验证) + +``` +做法:两个模型同时驻留GPU,即时forward + - num_workers=0(强制单进程,DataLoader不加workers) + - model()参数必须用input_ids/attention_mask + - 即时teacher logits(不存储,每次step forward一次teacher) + - vocab_size截断 + +显存需求:Teacher(7B)+Student(1.5B)=~18GB / 96GB + 7B BF16 ≈ 14GB权重 + 1.5B BF16 ≈ 3GB权重 + + 优化器状态 + 梯度 + 激活值 ≈ 1-2GB + 总计 ≈ 18-20GB,96GB绰绰有余 +``` + +### 恢复锚点更新(下次唤醒用) + +1. SSH密码: `HkM43lFVUIsc` · 端口23647 · 用户root +2. 检查命令: + ``` + /root/miniconda3/bin/python3 -c "import re; c=open('/root/autodl-tmp/distill_mother.log').read(); print('step='+re.findall(r'step=(\d+)',c)[-1] if re.findall(r'step=(\d+)',c) else 'no step'); print('Epoch='+('1' if 'Epoch 2' not in c else '2' if 'Epoch 3' not in c else '3')); print('DONE' if 'DONE!' in c else 'running')" + ``` +3. 如果蒸馏完成(日志有DONE!):检查`ls /root/autodl-tmp/output/qwen25-15b-shuangyan-distill/final/` +4. 如果蒸馏崩溃:`grep -E 'Error|Traceback|RuntimeError|ValueError|CUDA|OOM' /root/autodl-tmp/distill_mother.log` +5. COS密钥: `AKIDkQuBQhoiS2OYXWebXLwMbdT7cvAScbbU` / `nPoZKArgUJBA4nJenjSxJSQBj5FCj3A4`