Edge0 基准测试数据全解读:15 tok/s 解码、1GB 内存占用、冷/热 Prefill 差异一次说清
【免费下载链接】Edge0项目地址: https://gitcode.com/gh_mirrors/ed/Edge0
Edge0 是一款开源的流式 MoE 推理框架,核心能力是"SSD 专家卸载 + Recover-LoRA + prerouter 路由预测",让 35B 级大模型在消费级硬件上跑起来。本文带你逐行读懂官方基准数据:解码 15 tok/s 是怎么测出来的、为什么峰值内存只要 1 GiB、冷/热 Prefill 相差数倍的背后又是什么原理——一次说清。
先看结论:两个档位的官方基准数据
Edge0 随框架提供两个模型档位,官方基准数据(实测于Mac mini M4 Pro,24 GB)如下:
| 档位 | 解码速度 | Prefill 吞吐(冷 / 热)* | 峰值活跃内存 | 磁盘占用 |
|---|---|---|---|---|
edge0-35b(40 层 × 256 专家,K=4) | 14.9–17.7 tok/s | 113 / 140 tok/s | 2.9 GiB | ~23 GB |
edge0-8b(24 层 × 128 专家,K=8) | 23.9–25.3 tok/s | 500 / 1428 tok/s | 1.0 GiB | ~4.2 GB |
*Prefill 吞吐基于约 3.3k token 的长提示词测量。数据完整出处见 README.md 的 Benchmark 一节,模型细节见 docs/models/edge0-35b.md 与 docs/models/edge0-8b.md。
💡 一眼看重点:35B 级模型跑在15 tok/s左右(肉眼流畅阅读速度),而内存占用只有 2.9 GiB——它跑的不是"23 GB 全量加载",而是"活跃专家集"。这正是下面要拆解的核心。
基准测试方法:数字是怎么测出来的
解读数据之前,先明确测量口径(实现见 python/examples/bench.py):
- Prefill 阶段:用约 3.3k token 的合成长提示词(
BENCH_LONG=1),避免短提示词只测出固定开销; - 解码阶段:先跑 10 步"不计时的采样预热"(首 token 受专家冷启动影响大),再计时采样 200 个 token;
- 每个档位跑 2 轮,报告 tok/s 均值与 MLX 峰值活跃内存。
新手注意:tok/s 指解码(decode)速度,即逐 token 生成速度;Prefill 吞吐是理解长输入的速度,两者是完全不同的指标。
15 tok/s 解码:35B 模型为何能"流畅对话"
edge0-35b解码实测 14.9–17.7 tok/s,接近人类快速阅读速度。三个关键原因:
- 每 token 只激活少量专家:MoE 架构下每层仅路由 K=4 个专家(35b)或 K=8 个(8b),单 token 计算量远小于稠密模型;
- prerouter 提前一步预测路由:训练好的预测头在生成第 t 个 token 时,就预判第 t+1 步要用的专家集合,让 SSD 读取与 GPU 计算完全重叠,官方数据显示解码吞吐最多可提升+59%(机制详见 docs/prerouter.md);
- 8b 档位更快:
edge0-8b解码 23.9–25.3 tok/s,参数更少(约 7.9B 总 / 1.2B 激活),适合延迟敏感场景。
1 GiB 内存占用:峰值内存由谁决定
这里最容易误解:峰值活跃内存 ≠ 模型大小。
edge0-8b:checkpoint 有 4.2 GB,峰值内存仅~1.0 GiBedge0-35b:checkpoint 有 23 GB,峰值内存仅~2.9 GiB
原理(详见 docs/streaming.md):35b 模型每层 256 个专家的 4-bit 权重约 310 MB,40 层全驻留远超设备内存。Edge0 的做法是——权重留在 SSD,按需求 mmap 进 GPU,再用 LRU 缓存 + 预取 + 固定槽位把"每步搬运几十 MB"降到"几乎不搬"。内存上限由活跃专家集决定,而不是参数量。
⚠️ 部署建议:给系统、tokenizer 和长上下文 KV 增长留出余量,24 GB 机型跑 35b 很从容;16 GB 机型建议关注"按需 Prefill"选项(下文会讲)。
冷/热 Prefill 差异:同一份数据为何差 3 倍
表中113 / 140与500 / 1428 tok/s就是冷/热之分:
- 冷(Cold):进程启动后的第一个请求,专家权重从 SSD 首次故障读入,读的是整块文件;
- 热(Warm):后续请求,权重已在**页缓存(page cache)**中,几乎零 SSD 开销。
以edge0-8b为例,冷热 Prefill 吞吐差2.86 倍。更极端的例子来自 27-token 短提示词的冷缓存实测(出处:docs/models/edge0-8b.md):
| Prefill 策略 | 冷缓存读取量 | 冷缓存耗时 |
|---|---|---|
| E3b 整层加载(默认) | ≈4.1 GiB | ~5.3 s |
按需加载--prefill-ondemand | ≈0.4–0.8 GiB | 0.6–1.1 s |
而热缓存下反过来:整层加载最快(27 token 提示词 0.24 s vs 按需 0.37 s)。所以官方建议:内存大、页缓存装得下 checkpoint 的机器用默认路径;16 GB 级内存机器改用--prefill-ondemand,只读路由命中的专家,冷启动快 5 倍。
📌 实际体验含义:Edge0 服务首次请求稍慢是正常的(权重从 SSD 读入),之后对话会明显更流畅——这不是 bug,而是 SSD 流式卸载的正常行为。
如何复现这份基准数据
两条命令即可(需先安装框架并下载模型,详见 README.md 的 Getting Started):
cd python python examples/bench.py edge0-35b # 通过 $EDGE0_35B_MODEL 定位模型 python examples/bench.py edge0-8b # 通过 $EDGE0_8B_MODEL 定位模型 BENCH_LONG=1 python examples/bench.py edge0-8b # 启用 ~3k token 长提示词更多可调项(--ntok、--warmup、采样参数)见 python/examples/bench.py 文件头部说明。整体数据流(Prefill 整层加载 → 双缓冲解码 → 采样)可参考 docs/architecture.md。
一张图收尾:数据全解读速查
| 指标 | 数值 | 一句话解读 |
|---|---|---|
| 35b 解码 | 14.9–17.7 tok/s | prerouter 预测让 SSD 读取被计算掩盖 |
| 8b 解码 | 23.9–25.3 tok/s | 小激活参数 + K=8 路由的高吞吐档位 |
| 35b 峰值内存 | ~2.9 GiB | 只驻留活跃专家,而非 23 GB 全量 |
| 8b 峰值内存 | ~1.0 GiB | 4.2 GB checkpoint → 1 GiB 内存 |
| 冷 Prefill(8b) | 500 tok/s | 首请求从 SSD 读入权重 |
| 热 Prefill(8b) | 1428 tok/s | 页缓存驻留,差 2.86 倍 |
理解这三个数字,就理解了 Edge0 的核心设计:内存天花板与模型大小解耦,磁盘带宽被预测性预取掩盖。下次你在 Mac mini 上跑 35B 模型只看到 ~3 GB 内存占用时,就不用惊讶了 😉
📚 延伸阅读:docs/models/edge0-35b.md · docs/models/edge0-8b.md · docs/streaming.md · docs/prerouter.md
【免费下载链接】Edge0项目地址: https://gitcode.com/gh_mirrors/ed/Edge0
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考