d101-cognitive-chain: add v6 vocab_size fix, 4 crash root causes, new thinking patterns
This commit is contained in:
parent
2384b890ff
commit
26644c09a4
@ -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`
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user