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

4.8 KiB
Raw Blame History

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名称格式与我收集的名称不匹配

收集的格式:

"language_model.model.layers.0.self_attn.q_proj.weight"
"layers.0.self_attn.q_proj.weight"  (如果P = "")

可能的实际格式:

"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检测逻辑:

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名称

    print("Sample allTensors names:")
    for name in allTensors.map { $0.name }.prefix(20) {
        print("  \(name)")
    }
    
  2. 验证P变量: 显示P的实际值

    print("P prefix value: '\(P)'")
    
  3. 对比名称格式: 显示收集的权重名称 vs allTensors名称

    print("First collected weight: '\(allWeightNames[0])'")
    print("First allTensor: '\(allTensors[0].name)'")
    

后续调试

  1. 修复名称匹配问题
  2. 验证预读取加载所有权重
  3. 测试性能提升

💡 解决方案建议

方案A: 修复P检测逻辑

// 改进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名称

// 改进权重查找:支持多种格式
guard let desc = allTensors.first(where: { 
    $0.name == name || 
    $0.name.hasSuffix(name) || 
    $0.name == "language_model.model." + name 
}) else {
    return
}

方案C: 收集实际存在的权重

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