Files
markbaseengine/PRELOAD_DEBUG_REPORT.md
T
MarkBase Admin ac75faa0cc
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

# 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名称匹配才能获得性能提升!