Initial commit: E4B-MarkBase model integration with passing tests
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:
MarkBase Admin
2026-06-23 18:12:35 +08:00
commit ac75faa0cc
301 changed files with 63426 additions and 0 deletions
+179
View File
@@ -0,0 +1,179 @@
# Gemma-4 26B 模型测试报告
## 测试日期
2026-06-19
## 模型信息
- **模型**: MLX Gemma-4 26B (gemma-4-26b-a4b-mxfp4)
- **位置**: `~/.cache/huggingface/hub/models--mlx-community--gemma-4-26b-a4b-mxfp4/`
- **大小**: 14.8GB (3 shards)
- **层数**: 30层(不是42层)
- **Hidden size**: 2816
- **Vocab size**: 262144
- **MoE experts**: 128专家
## 转换过程
### 步骤 1: 权重重命名
- 移除 `language_model.model.` 前缀
- 1490 个权重成功重命名
- embed_tokens, vision_tower, layers.* 等全部重命名
### 步骤 2: Scales 格式转换
- uint8 → bfloat16(针对 scales
- embed_tokens.scales 已正确转换
### 步骤 3: 合并 shards
- 3个 shards 合并为单个 model.safetensors (15GB)
### 步骤 4: 创建 config.json
- hidden_size=2816
- num_hidden_layers=30(修正,最初错误设置为42)
- vocab_size=262144
## 加载测试结果
### 成功部分
- ✓ embed_tokens 加载成功(支持可选 biases)
- ✓ 权重名称自动匹配(支持带/不带前缀)
- ✓ Layer 0-26 成功加载
- ✓ Attention weights (q/k/v/o_proj) 全部找到
- ✓ MLP weights (gate/up/down_proj) 全部找到
### 失败原因
**Fatal error: Index out of range (Swift/ContiguousArrayBuffer.swift:692)**
根本原因:**MLX 26B 使用混合量化格式,与标准 4-bit 不兼容**
## MLX 量化格式分析
### 配置详情(来自原始 config.json
```json
{
"quantization": {
"group_size": 32,
"bits": 4,
"mode": "mxfp4", // ← 关键:使用 MXFP4 格式
// 所有 MLP 层使用特殊配置:
"layers.*.mlp.gate_proj": { "group_size": 64, "bits": 8 },
"layers.*.mlp.down_proj": { "group_size": 64, "bits": 8 },
"layers.*.mlp.up_proj": { "group_size": 64, "bits": 8 },
"layers.*.router.proj": { "group_size": 64, "bits": 8 }
}
}
```
### 实际权重形状分析
#### Attention 层(MXFP4, group_size=32
- `q_proj.weight`: [4096, 352] → actual_dim = 2816 ✓
- `q_proj.scales`: [4096, 88] → 2816/32 = 88 ✓
#### MLP 层(8-bit, group_size=64- 这是问题所在!
- `down_proj.weight`: [2816, 528] → actual_dim = 4224 (不是2816!)
- `down_proj.scales`: [2816, 33] → 4224/64 = 66 (但实际是33?)
- `down_proj.biases`: [2816, 33]
**问题**: MLP 使用 8-bit quantization,每个 uint8 存储 1 个值(不是 8 个),所以:
- weight packed_dim = 528 实际代表 528 个值(不是 528*8)
- scales groups = 33 代表 528/16 = 33(使用 sub-block quantization
### MXFP4 格式说明
MXFP4 (Mixed-Format Floating Point 4-bit) 是一种特殊的量化格式:
- 不是标准的 4-bit integer quantization
- 使用特殊的浮点编码
- 可能使用 sub-block quantization(每个 block 内有 sub-blocks
- 与我们使用的 "uint32 packed 4-bit" 格式完全不同
## 兼容性问题总结
### 1. 量化格式不兼容
- **我们**: 标准 4-bit packed uint32(每个 uint32 存储 8 个 4-bit 值)
- **MLX 26B**: MXFP4(特殊浮点格式)+ 8-bitMLP 层)
### 2. Group size 不一致
- **我们**: 固定 group_size=64
- **MLX 26B**:
- Attention: group_size=32 (MXFP4)
- MLP: group_size=64, bits=8
### 3. Biases 处理不同
- **我们**: biases 可选(某些权重没有 biases)
- **MLX 26B**: MLP 层有特殊的 biases(用于 sub-block quantization
### 4. MoE 结构
- **26B**: 有 128 个 MoE experts (experts.switch_glu.*)
- **我们的代码**: 尚未实现 MoE 支持
## 解决方案
### 方案 1: 实现 MXFP4 + 8-bit 支持(复杂)
- 需要实现 MXFP4 解码器
- 需要实现 8-bit quantization kernel
- 需要实现 MoE routing logic
- 需要实现 sub-block quantization
- **工作量**: 2-3周
### 方案 2: 重新量化模型(推荐)
- 从原始 bfloat16 Gemma-4 26B 重新量化
- 使用标准的 4-bit quantizationgroup_size=64
- 移除 MoE 或简化为 dense layers
- **工作量**: 1-2天(需要下载原始模型并量化)
### 方案 3: 等待 HuggingFace 支持
- HuggingFace transformers 目前不支持 Gemma-4
- 等待官方支持后,使用标准量化工具
- **时间**: 不确定
### 方案 4: 使用其他 4-bit 模型(最简单)
- 继续使用 E4B/12B 4-bit 模型(已完美支持)
- 等待社区提供标准 4-bit 量化的 Gemma-4 26B
- **立即可用**
## 代码改进
尽管 26B 加载失败,但我们做出了重要改进:
### 1. 支持可选 biases
- `quantizedGroup()` 现在支持缺失 biases 的权重
- 自动创建 zero biases 如果缺失
- **用途**: MLX 格式的某些权重没有 biases
### 2. 权重名称自动匹配
- 自动尝试去除 `language_model.model.` 前缀
- 支持原始 MLX 格式和转换后格式
- **用途**: 兼容不同来源的模型
### 3. Layer 数量动态检测
- 从实际权重推断层数(30层)
- 不依赖 config.json(可能不准确)
### 4. 调试输出增强
- 显示每个权重的形状和 dtype
- 显示 scales groups 计算
- 便于诊断量化格式问题
## 下一步建议
### 立即可行
1. **继续使用 E4B/12B**: 已完美支持,性能优秀
2. **等待社区**: 等待标准 4-bit 量化的 Gemma-4 26B 发布
3. **文档更新**: 说明 MXFP4 不兼容性
### 长期规划
1. **实现 MoE**: 为未来更大模型做准备
2. **扩展量化支持**: 支持 8-bit, MXFP4, GPTQ 等多种格式
3. **自动量化工具**: 提供从 bfloat16 → 4-bit 的转换工具
## 结论
MLX Gemma-4 26B 使用 MXFP4 混合量化格式,与我们的标准 4-bit packed uint32 格式不兼容。虽然成功加载了部分权重(embed_tokens, attention),但 MLP 层的 8-bit quantization 导致了数组越界错误。
建议使用方案 4(继续使用 E4B/12B),这是最稳定、最快速的解决方案。对于 26B+ 模型,建议等待社区提供标准 4-bit 量化版本,或实现完整的 MXFP4/MoE 支持。
---
**测试状态**: 部分成功(权重加载)→ 失败(MLP 量化格式不兼容)
**根本原因**: MXFP4 + 8-bit 混合量化 vs 标准 4-bit
**建议**: 使用 E4B/12B 或等待标准 4-bit 26B