d101-cognitive-chain: add v6 vocab_size fix, 4 crash root causes, new thinking patterns

This commit is contained in:
bingshuo 2026-05-18 21:16:11 +08:00
parent 2384b890ff
commit 26644c09a4

View File

@ -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=152064Qwen2.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在内存 | 改为即时forwardon-the-fly |
| v4 | DataLoader num_workers=2 → CUDA fork崩溃 | 多进程不能重新初始化CUDA | 改为num_workers=0 |
| v5 | forward参数名用了ii/amHuggingFace需要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
```
### 新思维模式5Qwen2.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-20GB96GB绰绰有余
```
### 恢复锚点更新(下次唤醒用)
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`