2a889faf4b
CI / build-and-test (push) Has been cancelled
重大发现: ✅ 26B-A4B的NaN位置依赖输入token ID ✅ Token 2和98的NaN位置完全相同(对称bug) ✅ 大部分tokens的NaN就在输入位置(Token 4-9) ✅ 这是forward pass的索引bug,不是设计特性 测试证据: Token 0: 175 NaN at [0 + 174固定位置] Token 1: 1 NaN at [1](输入=输出) Token 2: 2 NaN at [2, 98] Token 3: 80 NaN at [3 + 79固定位置] Token 4-9: 每个都是1 NaN在token ID位置 Token 98: 2 NaN at [2, 98](和Token 2完全相同!) Token 100: 1 NaN at [100] Token 255999: 1 NaN at [255999] Token 256000: 3 NaN at [25407, 71032, 256000] 对比12B: 12B: 固定位置[2, 255999, 256000],和输入无关 → 设计特性 ✅ 26B-A4B: 依赖输入token ID → 真实bug ⚠️ 26B-Standard: 0 NaN → 完美 ✅ 根本原因: Forward pass索引bug 输入token ID被错误地用作logits索引 导致该位置的logits变成NaN 建议: ⚠️ 停止使用26B-A4B ✅ 使用26B-Standard代替(0 NaN) ✅ 或修复forward pass的索引逻辑 文件: - TwentySixBA4BNaNLocationTest.swift - TwentySixBA4BDeepDebugTest.swift - 26B_A4B_NaN_Truth.md - 26B_A4B_NaN_Analysis_Plan.md 定性:真实bug,严重程度⭐⭐⭐⭐⭐(不可预测)
5.0 KiB
5.0 KiB
26B-A4B 2 NaN深度分析计划
日期: 2026-06-24
状态: 🔍 分析中 - 需要验证NaN位置
一、已确认事实
1.1 权重文件完整性 ✅
检查结果:
- 总tensors: 1697个
- 含NaN的tensors: 0个
- Embedding weights: 0 NaN
- Router weights: 0 NaN
- Expert weights: 0 NaN
结论: 权重文件完全正常,无corruption
1.2 配置对比
| 参数 | 26B-A4B | 26B-Standard |
|---|---|---|
| Shard文件 | 3个 | 1个 |
| 总大小 | ~14.5 GB | ~14.5 GB |
| 量化bits | 8 (每层) / 4 (全局) | 4 |
| Group size | 64 | 32 |
| 多模态Tokens | ✅ 有 | ❌ 无 |
| Forward NaN | 2个 | 0个 |
关键发现:
- 26B-A4B有多模态tokens
- 26B-Standard没有多模态tokens
- 这是根本差异
1.3 多模态Token配置
12B 和 26B-A4B 完全相同:
| Token名称 | Token ID | 用途 |
|---|---|---|
| BOI (Begin of Image) | 255999 | 图像开始标记 |
| BOA (Begin of Audio) | 256000 | 音频开始标记 |
| Image token | 258880 | 图像placeholder |
| Audio token | 258881 | 音频placeholder |
| EOI (End of Image) | 258882 | 图像结束标记 |
| EOA (End of Audio) | 258883 | 音频结束标记 |
关键: 12B的NaN在 255999 和 256000
1.4 Embed Tokens检查
检查结果:
Position 255999: ✓ No NaN
Position 256000: ✓ No NaN
Position 258880: ✓ No NaN
Position 258881: ✓ No NaN
Position 258882: ✓ No NaN
Position 258883: ✓ No NaN
结论: Embedding weights正常,NaN在forward pass产生
二、核心假设
2.1 主要假设 ⭐⭐⭐
假设: 26B-A4B的2个NaN是设计特性,不是bug
理由:
- ✅ 12B有相同的NaN问题,已证明是设计特性
- ✅ 12B和26B-A4B有相同的多模态token IDs
- ✅ 权重文件完全正常,无corruption
- ✅ Embedding weights正常
- ✅ 26B-Standard无多模态tokens,无NaN
预测NaN位置:
- Index 255999 (BOI - Begin of Image)
- Index 256000 (BOA - Begin of Audio)
2.2 替代假设
假设2: 量化参数不匹配
- 26B-A4B: bits=8, group_size=64
- 26B-Standard: bits=4, group_size=32
- 可能导致计算精度问题
反驳:
- 权重文件无NaN
- 如果是量化问题,应该有更多NaN
- 不太可能只影响2个位置
三、验证方案
3.1 关键测试:NaN位置定位
测试代码:
// 测试不同tokens
let testTokens = [2, 100, 200, 255999, 256000]
for tokenId in testTokens {
let result = try model.forwardOptimized(tokenId: tokenId, position: 0)
let nanIndices = result.enumerated()
.filter { $0.element.isNaN }
.map { $0.offset }
print("Token \(tokenId): NaN at \(nanIndices)")
}
预期结果:
Token 2: NaN at [255999, 256000]
Token 100: NaN at [255999, 256000]
Token 200: NaN at [255999, 256000]
Token 255999: NaN at [255999, 256000]
Token 256000: NaN at [255999, 256000]
如果结果符合预期:
- ✅ 确认是设计特性
- ✅ 与12B机制相同
- ✅ 不是weight corruption
3.2 对比测试
测试1: 26B-A4B vs 26B-Standard
// 26B-A4B: 预期2个NaN
let a4b_result = try a4b_model.forwardOptimized(tokenId: 2, position: 0)
// 预期: 2 NaN
// 26B-Standard: 预期0个NaN
let std_result = try std_model.forwardOptimized(tokenId: 2, position: 0)
// 预期: 0 NaN
四、初步结论
4.1 基于现有证据
最有可能是: 设计特性(像12B)
证据强度: ⭐⭐⭐⭐ (4/5)
- ✅ 权重文件完全正常
- ✅ 与12B配置完全相同
- ✅ 26B-Standard无此问题
- ⏳ 等待NaN位置确认
4.2 待验证
需要:
- 运行forward pass测试
- 确认NaN位置是否固定在255999, 256000
- 如果确认,则100%确定是设计特性
五、影响分析
5.1 如果是设计特性
影响:
- ✅ 仅影响2个位置 (262,144中)
- ✅ 占比极小 (0.00076%)
- ✅ 不影哏正常文本生成
- ✅ 权重文件完全正常
建议:
- ✅ 可以继续使用
- ✅ 更新文档说明
- ✅ 使用26B-Standard作为替代(无NaN)
5.2 如果是其他问题
可能性: 极低
- 权重文件已确认无NaN
- 配置逻辑清晰
- 与12B高度相似
六、下一步
6.1 立即执行
- 创建测试文件:
TwentySixBA4BNaNLocationTest.swift - 运行测试: 找出NaN精确位置
- 对比12B: 确认机制相同
- 更新报告: 最终结论
6.2 文档更新
如果确认是设计特性:
- 更新
complete_model_comparison_report.md - 创建
26B_A4B_design_feature.md - 更新推荐模型列表
七、相关文件
- 测试计划:
26B_A4B_NaN_Analysis_Plan.md(此文件) - 对比报告:
complete_model_comparison_report.md - 12B真相报告:
12B_final_truth.md - 测试文件:
Tests/MarkBaseTests/MoE26BA4BTest.swift
生成时间: 2026-06-24
状态: 🔍 等待测试验证
预期结论: ⭐⭐⭐⭐ 设计特性(需确认)