Files
markbaseengine/PRELOAD_DEBUG_REPORT.md
MarkBase Admin ac75faa0cc
Some checks failed
CI / build-and-test (push) Has been cancelled
Initial commit: E4B-MarkBase model integration with passing tests
- E4B-MarkBase model (42 layers, 4.4GB) loaded successfully
- All Phase 1-6 tests passed (model loading, forward pass, vision/audio towers, token generation, performance)
- All stress tests passed (5/5 in 127.6s)
  - Concurrent inference
  - Memory stress (67.5 tok/s, 0 NaN)
  - Continuous generation
  - Batch processing
  - Long-running stability
- Swift Metal inference engine with multimodal support
2026-06-23 18:12:35 +08:00

190 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Layer权重预读取优化 - 调试报告
## 🔍 发现问题
### 核心问题
预读取收集了大量权重名称,但实际加载了**0个权重**
### 测试数据
```
E4B (42 layers): Collected 1512 weight names → Preloaded 0 weights
12B (48 layers): Collected 1728 weight names → Preloaded 0 weights
E2B (35 layers): Collected 1260 weight names → Preloaded 0 weights
26B-A4B (30 layers): Collected 1080 weight names → Preloaded 5 weights
31B (60 layers): Collected 2160 weight names → Preloaded 5 weights
```
### 问题分析
- ✓ 权重名称收集正确1512-2160个
- ✗ allTensors查找失败0-5个找到
- ✗ 预读取没有工作
## 🔧 可能原因
### 1. Tensor名称格式不匹配
**假设**: allTensors中的tensor名称格式与我收集的名称不匹配
**收集的格式**:
```swift
"language_model.model.layers.0.self_attn.q_proj.weight"
"layers.0.self_attn.q_proj.weight" (P = "")
```
**可能的实际格式**:
```swift
"layers.0.self_attn.q_proj.weight"
"language_model.model.layers.0.self_attn.q_proj.weight" ?
"model.layers.0.self_attn.q_proj.weight" ?
```
### 2. P变量值不正确
**假设**: P变量的检测逻辑可能有问题
**P检测逻辑**:
```swift
if allTensors.contains(where: { $0.name == "layers.0.self_attn.q_proj.weight" }) {
P = ""
} else {
P = "language_model.model."
}
```
**问题**: 如果P检测错误所有权重名称都会不匹配
### 3. allTensors列表不完整
**假设**: allTensors可能只包含部分tensor描述符
**需要验证**: allTensors是否包含所有layer权重
## 📊 当前状态
### 已完成
1. ✓ 预读取框架实现
2. ✓ 权重名称收集1512-2160个
3. ✓ 编译成功
4. ✓ 测试运行
### 待修复
1. ✗ Tensor名称匹配问题
2. ✗ 预读取实际加载权重
3. ✗ 性能验证
## 🎯 下一步行动
### 立即行动 (最高优先级)
1. **添加调试输出**: 显示allTensors中的实际tensor名称
```swift
print("Sample allTensors names:")
for name in allTensors.map { $0.name }.prefix(20) {
print(" \(name)")
}
```
2. **验证P变量**: 显示P的实际值
```swift
print("P prefix value: '\(P)'")
```
3. **对比名称格式**: 显示收集的权重名称 vs allTensors名称
```swift
print("First collected weight: '\(allWeightNames[0])'")
print("First allTensor: '\(allTensors[0].name)'")
```
### 后续调试
1. 修复名称匹配问题
2. 验证预读取加载所有权重
3. 测试性能提升
## 💡 解决方案建议
### 方案A: 修复P检测逻辑
```swift
// 改进P检测检查多个可能的格式
let P: String
if allTensors.contains(where: { $0.name.hasPrefix("layers.") }) {
P = ""
} else if allTensors.contains(where: { $0.name.hasPrefix("language_model.model.layers.") }) {
P = "language_model.model."
} else {
// Fallback: detect from any tensor name
if let firstTensor = allTensors.first {
let prefix = firstTensor.name.components(separatedBy: "layers.").first ?? ""
P = prefix.isEmpty ? "" : prefix + "layers."
} else {
P = ""
}
}
```
### 方案B: 动态匹配tensor名称
```swift
// 改进权重查找:支持多种格式
guard let desc = allTensors.first(where: {
$0.name == name ||
$0.name.hasSuffix(name) ||
$0.name == "language_model.model." + name
}) else {
return
}
```
### 方案C: 收集实际存在的权重
```swift
// 只收集allTensors中实际存在的权重
var allWeightNames: [String] = []
for layerIdx in 0..<numHiddenLayers {
let basePrefix = "layers.\(layerIdx)"
// 查找所有包含此layer的tensor
let layerTensors = allTensors.filter { $0.name.contains(basePrefix) }
for tensor in layerTensors {
allWeightNames.append(tensor.name)
}
}
```
## ⏱️ 时间估算
### 调试修复
- 添加调试输出: 15分钟
- 修复名称匹配: 30分钟
- 测试验证: 30分钟
- **总计**: ~1.5小时
### ROI评估
- **问题**: 预读取完全不工作
- **影响**: 无法获得预期3x性能提升
- **优先级**: 高(必须修复)
## 📂 相关文件
### 主要文件
- `Model.swift`: 预读取逻辑 (lines 419-523)
- `Model.swift`: P变量检测 (lines 202-209)
- `Model.swift`: allTensors加载 (lines 130-180)
### 测试文件
- `AllModelsTextTest.swift`: 预读取测试
## 🎉 总结
### 发现
预读取优化框架已实现,但**核心问题**
- Tensor名称匹配失败
- 预读取加载0个权重
- 需要调试修复
### 下一步
明天立即调试修复:
1. 显示allTensors实际名称
2. 修复P检测逻辑
3. 验证预读取工作
4. 测试性能提升
### 预期
修复后应该看到:
- `Parallel preloaded 1512 weights` (而不是0)
- Layer construction更快 (3x speedup)
**关键**: 必须修复tensor名称匹配才能获得性能提升