一句话:pagoda 是一个只用 Rust 标准库的 LLM 推理运行时框架。没有 tokio,没有 candle,没有 ndarray。cargo build --release 离线一次通过,产出 17.9MB 单二进制。
设计目标是三件事:易用、性能、可靠。
易用性
- 部署只需要一个文件 :17.9MB 单二进制,不依赖 Python、CUDA 运行时;内网、离线环境、CI 里
cargo build --release直接出产物 - OpenAI 兼容 API:现有客户端改一个 base_url 即可接入
- 结构化生成内置 :
gen / select / fork同构 DSL,不需要额外框架 - 机制即配置:radix 前缀缓存与块级 APC 缓存做进同一个引擎,一行配置切换,可直接 A/B
- 87 项测试
cargo test --offline全过,不依赖网络和外部资源
性能
共享开发机(i5-12500 / RTX 3050 8GB,测试时有其他负载)上的指示性数据,三方同条件测量,脚本和原始数据都在仓库里。
vs SGLang 0.5.10:
| 对比项 | pagoda | SGLang |
|---|---|---|
| tiny 模型 warm 延迟 | 14.3 ms | 153.9 ms(10.8x 框架开销差距) |
| tiny batch-8 吞吐 | 3103 tok/s | 680 tok/s(4.6x) |
| 1.1B batch-8 吞吐 | 4.0 tok/s | 23.0 tok/s(输 5.8 倍) |
| CPU-only 运行 | 全链路可跑 | scheduler 硬依赖 CUDA,拒绝启动 |
vs Python 参考实现(同一模型快照、同一输入,5 次预热 + 50 次迭代):
| 指标 | pagoda | Python 参考实现 |
|---|---|---|
| GPU 单次延迟 | 605.9 ms | 690.9 ms(pagoda 为全 f32,对方为 fp16 autocast) |
| 冷启动加载 | 1.4--1.6 s | 7.9--9.4 s |
| 峰值内存(GPU) | 1850 MB | 2954 MB |
| 交付形态 | 17.9 MB 单二进制 | 5.3 GB / 39 个包的 venv |
机制 A/B(同一引擎内开 vs 关):
| 机制 | 实测效果 |
|---|---|
| 增量 KV 会话 | 16 步生成 216→21 token,模型计算省 10.3 倍 |
| 张量级前缀嫁接 | 134-token prompt 的 warm prefill 归零 |
| 批量解码 | 物理调用收缩 6.24 倍 |
| KV checkpoint | 分支 100% 前缀命中,创建 6→1 token |
可靠性
- 跨设备确定性:CPU 与 GPU 输出 argmax 逐位一致(概率差约 52 ULP)。风控、路由这类阈值敏感场景,跨硬件可复现是硬保障
- 故障面小 :无 async 运行时------HTTP 服务基于
std::net,调度器是裸 thread + channel - 网关模式:与生成引擎共部署时 pagoda 守门(健康检查、指标、KV checkpoint),上游进程崩溃时网关回 502,自身不挂
- 缓存免疫:KV checkpoint 不受 LRU 淘汰影响,任意分支 100% 前缀命中接入
边界
- CPU 纯算力落后 torch 约 2.25 倍(没有 BLAS 库;路线图是自带 BLAS / int8 内核)
- 只做推理,不带训练;数据中心级批量吞吐交给大引擎,pagoda 以网关共部署
- CUDA Graph、融合 kernel 尚未实现,GPU 通路目前是数值正确优先
链接
- GitHub:github.com/quantz8a/pa...(Apache-2.0)
- 文档站:quantz8a.github.io/pagoda(15 篇文档 + 基准原始数据 + 全站检索)
- crates.io:crates.io/crates/pago...,
cargo add pagoda
基准脚本全部开源,数字可复现。