高性能的 SGLang Rust 运行时

一句话: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 通路目前是数值正确优先

链接

基准脚本全部开源,数字可复现。

相关推荐
传奇开心果编程8 小时前
【Rust入门练中学】第6课:结构体与方法
开发语言·rust·结构体·编程语言理论·结构体方法·编程通用语言
本地化文档8 小时前
cutile-rs-book-l10n
rust·gpu·nvidia·cuda·sphinx·crowdin
qq_4069810311 小时前
大白话rust系列09 函数调用两次有什么错?
开发语言·python·rust
康小旺12 小时前
TypeScript 编译器开始卷 Rust 了:Cloudflare 的 tsrs 到底想干嘛?
rust·typescript
Norna12 小时前
时间轮的 +1,为什么最后只留在顶层
rust
轻舟技术A19 小时前
Rust 重写 Pi:会话启动耗时降 91%,就绪内存少 78%
开发语言·后端·rust
unconditional19 小时前
外部命令改不了你的 shell:sdkm 怎么做到"回车即生效"
rust·开源
程工造Agent19 小时前
从 0 到 1 学 Codex 源码:为什么 let b = a 之后,a 就不能用了?
rust·ai编程
Norna19 小时前
方差怎么会是 −32:nushell math variance 的一次数值修复
rust
JavaPub-rodert20 小时前
王仕宇分享:Oxigraph 是什么?用 Rust + RocksDB 搭一个轻量 RDF/SPARQL 知识图谱数据库
数据库·rust·知识图谱