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

257 lines
6.9 KiB
Markdown

# 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**:
```swift
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**:
```swift
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**:
```swift
// 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:
```swift
// 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)
3.**Document router scale fix**
- Create validation report
- Compare with 26B-Standard fix
- Document normalization pattern
4.**Run full benchmark**
- Test token generation speed
- Compare with 26B-Standard (40 tok/s)
- Memory usage
### If Fix Doesn't Work (Priority 3)
5. ⚠️ **Debug forward pass**
- Add NaN checks
- Test router computation
- Test expert selection
6. ⚠️ **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!