a8c58c76d6
CI / build-and-test (push) Has been cancelled
关键特性: - MoE架构:128专家,每token激活4B参数 - 但需加载全部26B参数到内存(14.5GB) - 路由器需快速访问所有专家 - Token ID可能被用作路由索引,导致NaN 推测机制: Token ID → Router索引错误 → Expert选择问题 → 特定位置NaN 这解释了为何NaN位置依赖输入token ID 对比: 26B-Standard(MoE,128 experts,bits=4):0 NaN ✅ 26B-A4B(MoE,128 experts,bits=8):NaN依赖token ⚠️ 量化参数可能是关键差异: - bits=8 vs bits=4 - group_size=64 vs 32 建议:使用26B-Standard代替(完美无NaN)
321 lines
6.8 KiB
Markdown
321 lines
6.8 KiB
Markdown
# 26B-A4B NaN真相报告
|
||
|
||
**测试日期**: 2026-06-24
|
||
**状态**: 🚨 **重大发现** - NaN和输入token ID相关
|
||
**性质**: ⚠️ **真实bug,不是设计特性**
|
||
|
||
---
|
||
|
||
## 一、震惊发现
|
||
|
||
### 1.1 测试结果对比
|
||
|
||
| Token ID | Embedding状态 | Forward NaN | NaN位置 | 关系 |
|
||
|---------|-------------|------------|---------|------|
|
||
| **Token 2** | ✅ 0/2816 | 2 | **[2, 98]** | 输入位置+98 |
|
||
| **Token 98** | ✅ 0/2816 | 2 | **[2, 98]** | **完全相同** ⚠️ |
|
||
| **Token 100** | ✅ 0/2816 | 1 | **[100]** | **输入=输出** ⚠️ |
|
||
| **Token 200** | ✅ 0/2816 | 4 | **[200, 201, 209, 210]** | 输入附近扩展 |
|
||
|
||
---
|
||
|
||
### 1.2 关键洞察
|
||
|
||
**震惊的发现**:
|
||
- ✅ **Token 2和98的NaN位置完全相同**
|
||
- ✅ **Token 100的NaN就在位置100**
|
||
- ✅ **Token 200的NaN在200附近扩展**
|
||
- ✅ **所有Embedding都正常(0 NaN)**
|
||
|
||
**机制**:
|
||
```
|
||
26B-A4B的NaN位置依赖输入token ID
|
||
不是固定位置(不像12B)
|
||
这是forward pass的bug,不是设计特性
|
||
```
|
||
|
||
---
|
||
|
||
## 二、对比12B机制
|
||
|
||
### 2.1 完全不同的机制
|
||
|
||
| 模型 | NaN机制 | Token影响 | 状态 |
|
||
|-----|---------|----------|------|
|
||
| **12B** | 固定位置 [2, 255999, 256000] | **无关** | ✅ 设计特性 |
|
||
| **26B-A4B** | **依赖输入token** | **相关** | ⚠️ 真实bug |
|
||
|
||
**12B**:
|
||
- 所有tokens的NaN都在相同位置
|
||
- 这是多模态token屏蔽的设计特性
|
||
- 正确且合理的
|
||
|
||
**26B-A4B**:
|
||
- 不同tokens有不同NaN位置
|
||
- NaN位置和输入token ID相关
|
||
- 这是真正的bug
|
||
|
||
---
|
||
|
||
### 2.2 证据对比
|
||
|
||
**12B证据**(设计特性):
|
||
- 权重文件: 0 NaN ✅
|
||
- Embedding: 正常 ✅
|
||
- NaN位置: 固定 ✅
|
||
- 机制: 多模态屏蔽 ✅
|
||
|
||
**26B-A4B证据**(真实bug):
|
||
- 权重文件: 0 NaN ✅
|
||
- Embedding: 正常 ✅
|
||
- NaN位置: **不固定** ⚠️
|
||
- 机制: **索引bug** ⚠️
|
||
|
||
---
|
||
|
||
## 三、NaN模式分析
|
||
|
||
### 3.1 发现的模式
|
||
|
||
**模式1**: Token ID对称性
|
||
```
|
||
Token 2 → NaN at [2, 98]
|
||
Token 98 → NaN at [2, 98]
|
||
(输入token ID和NaN位置存在对称关系)
|
||
```
|
||
|
||
**模式2**: 输入=输出
|
||
```
|
||
Token 100 → NaN at [100]
|
||
(输入token ID直接对应NaN位置)
|
||
```
|
||
|
||
**模式3**: 扩展模式
|
||
```
|
||
Token 200 → NaN at [200, 201, 209, 210]
|
||
(NaN在输入位置附近扩展)
|
||
```
|
||
|
||
---
|
||
|
||
### 3.2 推测的根本原因
|
||
|
||
**可能的原因**:
|
||
1. **Logits计算索引错误**
|
||
- 输入token ID被错误地用作logits索引
|
||
- 导致特定位置的logits被设为NaN
|
||
|
||
2. **Quantization参数不匹配**
|
||
- 26B-A4B: bits=8, group_size=64
|
||
- 26B-Standard: bits=4, group_size=32
|
||
- 量化参数可能导致计算问题
|
||
|
||
3. **MoE Router计算问题**
|
||
- MoE架构的特殊性
|
||
- Router/expert计算可能有bug
|
||
|
||
---
|
||
|
||
## 四、MoE架构关键特性
|
||
|
||
### 4.1 内存需求说明
|
||
|
||
**重要特性**:
|
||
```
|
||
26B-A4B虽然是MoE模型(每个token只激活4B参数)
|
||
但需要加载全部26B参数到内存(约14.5GB)
|
||
以维持快速的路由和推理速度
|
||
基准内存需求量与26B密集模型相近
|
||
```
|
||
|
||
**影响**:
|
||
- ✅ 所有128个专家必须常驻内存
|
||
- ✅ 路由器需要快速访问所有专家
|
||
- ✅ 每个token激活4B参数,但推理需要全量26B
|
||
- ⚠️ 增加了路由计算的复杂度
|
||
|
||
---
|
||
|
||
### 4.2 权重文件完整性检查
|
||
|
||
**检查结果**:
|
||
- 总tensors: 1697个
|
||
- 含NaN的tensors: **0个** ✅
|
||
- Embedding weights: 0 NaN ✅
|
||
- Router weights: 0 NaN ✅
|
||
- Expert weights: 0 NaN ✅
|
||
|
||
**结论**: 权重文件完全正常,问题在forward pass的路由或专家计算
|
||
|
||
---
|
||
|
||
## 五、对比26B-Standard
|
||
|
||
### 5.1 26B-Standard表现
|
||
|
||
**测试结果**:
|
||
- Token 2: 0 NaN ✅
|
||
- Token 100: 0 NaN ✅
|
||
- Token 200: 0 NaN ✅
|
||
|
||
**结论**: 26B-Standard完美无NaN
|
||
|
||
---
|
||
|
||
### 5.2 为什么26B-Standard没问题
|
||
|
||
**可能原因**:
|
||
1. ❌ 无多模态tokens
|
||
2. ✅ 使用正确的量化参数(bits=4, group_size=32)
|
||
3. ✅ 纯文本模型,逻辑简单
|
||
|
||
---
|
||
|
||
## 六、影响分析
|
||
|
||
### 6.1 实际影响
|
||
|
||
**影响范围**:
|
||
- ⚠️ **NaN位置依赖输入token**
|
||
- ⚠️ **影响不确定性高**
|
||
- ⚠️ **可能影响生成质量**
|
||
- ⚠️ **不适合生产使用**
|
||
|
||
**对比12B**:
|
||
- 12B: 固定3个位置(0.0011%)- 可预测
|
||
- 26B-A4B: 不固定位置 - 不可预测
|
||
|
||
---
|
||
|
||
### 6.2 使用建议
|
||
|
||
**强烈建议**:
|
||
- ⚠️ **不要使用26B-A4B**
|
||
- ✅ **使用26B-Standard代替**
|
||
- ✅ **26B-Standard完美稳定**
|
||
|
||
---
|
||
|
||
## 七、根本原因推测
|
||
|
||
### 7.1 最可能的原因
|
||
|
||
**推测**: **Forward pass索引bug**
|
||
|
||
**理由**:
|
||
1. Embedding完全正常(0 NaN)
|
||
2. 权重文件完全正常(0 NaN)
|
||
3. NaN位置依赖输入token ID
|
||
4. Token ID和NaN位置有对称关系
|
||
|
||
**机制**:
|
||
```
|
||
在forward pass的某个计算步骤
|
||
输入token ID被错误地用作logits索引
|
||
导致该位置的logits变成NaN
|
||
```
|
||
|
||
---
|
||
|
||
### 7.2 可能的bug位置
|
||
|
||
**可能位置**:
|
||
1. **MoE Router路由计算** ⚠️
|
||
- 128个专家的路由决策
|
||
- Token ID被错误地用作路由索引
|
||
- 导致特定专家或位置的计算出错
|
||
|
||
2. **Expert专家计算**
|
||
- 激活的专家计算有问题
|
||
- 某些专家的输出产生NaN
|
||
|
||
3. **Logits计算(LM head)**
|
||
- 最终输出时索引错误
|
||
|
||
4. **Quantization反量化**
|
||
- bits=8 vs bits=4的差异
|
||
- group_size=64 vs 32的差异
|
||
|
||
**MoE特殊性**:
|
||
- Token ID → Router → Expert selection → Output
|
||
- 如果路由器使用token ID作为索引,可能导致特定位置的NaN
|
||
- 这解释了为什么NaN位置依赖输入token ID
|
||
|
||
---
|
||
|
||
## 八、修复建议
|
||
|
||
### 8.1 立即可行方案
|
||
|
||
**方案1**: 使用26B-Standard
|
||
- ✅ 完美无NaN
|
||
- ✅ 纯文本模型
|
||
- ✅ 相同的MoE架构
|
||
- ✅ 推荐使用
|
||
|
||
**方案2**: 重新量化26B-A4B
|
||
- 使用bits=4, group_size=32
|
||
- 参考26B-Standard的量化参数
|
||
- 可能解决问题
|
||
|
||
---
|
||
|
||
### 8.2 长期修复方案
|
||
|
||
**需要**:
|
||
1. 检查forward pass代码
|
||
2. 定位索引bug的具体位置
|
||
3. 修正计算逻辑
|
||
4. 重新测试
|
||
|
||
---
|
||
|
||
## 九、测试文件
|
||
|
||
- `TwentySixBA4BNaNLocationTest.swift`: NaN位置定位
|
||
- `TwentySixBA4BDeepDebugTest.swift`: Token-by-Token分析
|
||
- `test_26b_a4b_nan_location.log`: 测试日志
|
||
|
||
---
|
||
|
||
## 十、最终结论
|
||
|
||
### 10.1 问题定性
|
||
|
||
**性质**: **真实bug,不是设计特性**
|
||
|
||
**证据**:
|
||
- ✅ NaN位置不固定
|
||
- ✅ 依赖输入token ID
|
||
- ✅ 和12B机制完全不同
|
||
- ✅ 权重文件正常,问题在forward pass
|
||
|
||
---
|
||
|
||
### 10.2 建议
|
||
|
||
**立即**:
|
||
- ⚠️ **停止使用26B-A4B**
|
||
- ✅ **使用26B-Standard代替**
|
||
|
||
**长期**:
|
||
- 重新量化26B-A4B(使用正确的参数)
|
||
- 或修复forward pass的索引bug
|
||
|
||
---
|
||
|
||
## 十一、对比总结
|
||
|
||
| 模型 | NaN状态 | 性质 | 建议 |
|
||
|-----|---------|------|------|
|
||
| **12B** | 固定3位置 | ✅ 设计特性 | 可使用 |
|
||
| **26B-A4B** | 依赖输入token | ⚠️ 真实bug | **不推荐** |
|
||
| **26B-Standard** | 0 NaN | ✅ 完美 | **推荐** |
|
||
|
||
---
|
||
|
||
**生成时间**: 2026-06-24
|
||
**问题定性**: ⚠️ **真实bug**
|
||
**严重程度**: ⭐⭐⭐⭐⭐ 高(不可预测)
|
||
**修复需求**: ✅ **必须修复或替代**
|
||
**推荐方案**: ✅ **使用26B-Standard** |