Initial commit: E4B-MarkBase model integration with passing tests
CI / build-and-test (push) Has been cancelled
CI / build-and-test (push) Has been cancelled
- 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
This commit is contained in:
@@ -0,0 +1,256 @@
|
||||
# 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!
|
||||
Reference in New Issue
Block a user