Files
markbaseengine/26B_A4B_MOE_DEBUG_SUMMARY.md
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

6.9 KiB

26B-A4B MoE Debug Summary - Current Status

Test Date

2026-06-20 22:13-22:15

Successes

1. Model Loading - COMPLETE SUCCESS

Load time: 51.818s
Layers: 30 (ALL MoE ✓)
Experts: 128/128 per layer ✓
Total tensors: 1697
Status: Test passed

2. Router Structure Verification - COMPLETE SUCCESS

Router components: All present ✓
Expert components: All present ✓
Router weights: 8-bit, correct dimensions ✓
Expert weights: 4-bit, correct structure ✓
Router scale: 31.25 ⚠️ (potential issue)
Status: Test passed

⚠️ Issues Found

1. Token Generation - HANGS ⚠️⚠️⚠️

Symptoms:

  • Generation test hangs
  • Timeout after 30s (no response)
  • Likely numerical issue in forward pass

Root Cause (Hypothesis):

  • routerScale = 31.25 might be too large
  • Similar to 26B-Standard scales issue
  • May cause softmax overflow or NaN
  • Needs normalization (divide by hiddenSize?)

2. Router Scale Value - POTENTIAL BUG ⚠️⚠️

Current value: routerScale = 31.25

Question: Is this already normalized or raw value?

Similar issue (26B-Standard):

26B-Standard scales:
  - Raw: ~120
  - Problem: Too large
  - Fix: Normalize by hiddenSize (120/2816 = 0.0426)
  - Result: Fixed NaN

26B-A4B routerScale:
  - Current: 31.25
  - Hypothesis: May need normalization
  - Potential fix: 31.25/2816 = 0.011

📊 Test Results Summary

Test Status Duration Result
Model Loading PASSED 51.818s All 30 layers loaded with MoE
Router Structure PASSED 1.0s All components verified
Token Generation HANGS 30s+ timeout No response, likely NaN
Forward Pass Not tested - Needs separate test

🔧 Proposed Fixes

Fix 1: Router Scale Normalization

Code location: Model.swift:508-519

Current code:

if let rsDesc = allTensors.first(where: { $0.name == "\(prefix).router.scale" }) {
    let rsData = try rsReader.read(tensor: rsDesc)
    let rsFloats = SafeTensorsReader.bf16ToFloat32(rsData)
    routerScale = rsFloats.first ?? 1.0  // Raw value
}

Proposed fix:

if let rsDesc = allTensors.first(where: { $0.name == "\(prefix).router.scale" }) {
    let rsData = try rsReader.read(tensor: rsDesc)
    let rsFloats = SafeTensorsReader.bf16ToFloat32(rsData)
    let rawRouterScale = rsFloats.first ?? 1.0
    // Normalize by hiddenSize (similar to scales normalization)
    routerScale = rawRouterScale / Float(hiddenSize)  // 31.25/2816 = 0.011
}

Expected result:

  • routerScale = 0.011 (smaller, stable)
  • Softmax won't overflow
  • Generation should work

Confidence: High (based on 26B-Standard fix pattern)

Fix 2: Add NaN Checks

Add debug prints in Layer.swift moeForward:

// After router computation
let routerData = engine.readFloats(from: temps.gate, count: numExperts)
print("Router logits: max=\(routerData.max()), min=\(routerData.min())")

// After scaling
var scaled = routerData.map { $0 * routerScale }
print("Scaled logits: max=\(scaled.max()), min=\(scaled.min())")

// After softmax
print("Softmax weights: sum=\(sum)")

Purpose:

  • Identify where NaN occurs
  • Verify router computation
  • Debug numerical issues

Fix 3: Expert Scale Normalization

Similar to 26B-Standard scales fix:

If router fix doesn't work, expert scales might also need normalization:

// In loadExpertGroup
let normalizedScales = scales / Float(expertInDim)

🎯 Next Steps

Immediate (Priority 1)

  1. Apply router scale normalization

    • Edit Model.swift:508-519
    • Add normalization: routerScale /= hiddenSize
    • Test generation
  2. Test generation with fix

    • Run MoEDebugTests/test26BA4BSimpleGenerationDebug
    • Expect: generation works
    • If works: Document fix

If Fix Works (Priority 2)

  1. Document router scale fix

    • Create validation report
    • Compare with 26B-Standard fix
    • Document normalization pattern
  2. Run full benchmark

    • Test token generation speed
    • Compare with 26B-Standard (40 tok/s)
    • Memory usage

If Fix Doesn't Work (Priority 3)

  1. ⚠️ Debug forward pass

    • Add NaN checks
    • Test router computation
    • Test expert selection
  2. ⚠️ Check other issues

    • Expert scales normalization
    • Metal kernels
    • Forward pass sequence

📈 Expected Timeline

With router fix:

  • Fix implementation: 5 minutes
  • Testing: 5-10 minutes
  • Documentation: 5 minutes
  • Total: 15-20 minutes

If router fix doesn't work:

  • Additional debugging: 30-60 minutes
  • Multiple attempts: 1-2 hours
  • Total: 2-3 hours ⚠️⚠️

📊 Comparison: MoE vs Dense

Model Type Load Status Load Time Generation Speed
26B-Standard Dense Works 5.3s Works 40 tok/s
31B-IT Dense Works 63.8s Works 11.7 tok/s
26B-A4B MoE Works 51.818s ⚠️ Fix needed Expected: 20-30 tok/s

🎓 Lessons Learned

  1. MoE implementation already complete

    • No need for 3-5 days implementation
    • Code was ready, just needed testing
  2. Router scale needs investigation ⚠️

    • Similar to 26B-Standard scales issue
    • Normalization pattern applies to MoE too
  3. Test incrementally

    • First test loading (passed)
    • Then test structure (passed)
    • Now test generation (issue found)
    • Debug systematically

💡 Recommendation

Apply router scale normalization NOW

Reasons:

  • High confidence fix (based on 26B-Standard pattern)
  • Quick to implement (5 minutes)
  • Likely to work (similar issue pattern)
  • If works → complete success
  • If fails → debug further

Time investment: 15-20 minutes Potential reward: MoE model working! Risk: Low (if fails, we learn more)


Files Created

Test reports:

  • /Users/accusys/MarkBase12B/26B_A4B_LOADING_SUCCESS.md
  • /Users/accusys/MarkBase12B/26B_A4B_ROUTER_SCALE_ANALYSIS.md
  • /Users/accusys/MarkBase12B/26B_A4B_MOE_DEBUG_SUMMARY.md

Test code:

  • /Users/accusys/MarkBase12B/Tests/G12BTests/MoEDebugTests.swift
  • /Users/accusys/MarkBase12B/Tests/G12BTests/MoEForwardTests.swift

Test logs:

  • /Users/accusys/MarkBase12B/26B_A4B_LOADING_TEST.log
  • /Users/accusys/MarkBase12B/MOE_ROUTER_STRUCTURE_TEST.log

Summary

Major progress: MoE model loading and structure verified

⚠️ Blocking issue: Generation hangs, likely router scale too large

🔧 Proposed fix: Normalize routerScale by hiddenSize (31.25/2816)

📊 Confidence: High () based on 26B-Standard fix pattern

⏱️ Expected time: 15-20 minutes to test fix

🏆 Potential outcome: First working MoE model!