真实模型需自行准备 Qwen2.5-7B-Instruct 权重并传 --model 路径;flash-attn 2.5.9.post1 要求 block_size 为 256 的倍数;speculative decoding、CUDA Graph、TP 等为独立 benchmark,未接入默认 serving 路径。
mini-infer
psmarterMIT更新放缓从零手写的 LLM 推理引擎,实现分页 KV 缓存、连续批处理、投机解码和 CUDA 图等优化,并提供 OpenAI 兼容服务接口。
LLM inference engine from scratch — paged KV cache, continuous batching, chunked prefill, prefix caching, speculative decoding, CUDA graph, tensor parallelism, OpenAI-compatible serving
pip install -e ".[serve,dev]"
mini-infer-serve --dry-run --port 8000README 标注环境为 CUDA 12.1 与 RTX 4090;benchmark 数据基于 Qwen2.5-7B 单卡 RTX 4090。未给出具体显存数值,也未说明 CPU 推理支持。
从零实现的 LLM 推理引擎,带 PagedAttention 与 OpenAI 兼容服务,适合学习与机制验证
从零手写的 LLM 推理引擎,实现分页 KV 缓存、连续批处理、投机解码和 CUDA 图等优化,并提供 OpenAI 兼容服务接口。
核心能力
- 用 flash_attn block_table 实现真 PagedAttention
- 四队列调度器支持 continuous batching 与 chunked prefill
- block 级哈希加 LRU 做前缀缓存降低 TTFT
- 提供 OpenAI 兼容 HTTP 接口与 /healthz 健康检查
- 支持 --dry-run 无模型权重启动验证接口
容易踩的坑
- v0.22.0v0.22.0 — HTTP serving benchmark最新正式版2026-03-28 · 2026-03-28 03:19 UTC
v0.22.0
-
新增 HTTP 服务基准测试:并发吞吐量从 55.7 提升至 219.1 tok/s(1→8 个客户端,Qwen2.5-7B,RTX 4090)
-
新增包含实际测量数据的
benchmarks/results/server_benchmark.json文件 -
修复
mini_infer/目录下的所有 ruff lint 错误(CI 测试已通过) -
为
mini-infer-serveCLI 添加--use-cuda-graph和--quant-mode标志 -
为 HTTP 服务器添加
/healthz端点 -
添加
Dockerfile和.github/workflows/lint.yml文件 -
重构 README:英文版简洁明了,采用三级能力分类,并添加“如何阅读”导航
-
- v0.21.0pre-release2026-03-28 · 2026-03-28 03:02 UTC
查看更新说明
首个版本发布。实现了分页键值缓存、连续批处理、
分块预填充、前缀缓存、推测性解码、CUDA 图、
张量并行、MoE 专家并行以及与 OpenAI 兼容的 HTTP 服务。
每项机制均已独立地与 HuggingFace Transformer 进行基准测试。
Full Changelog: https://github.com/psmarter/mini-infer/compare/v0.21.0...v0.21.0
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
mini-infer
LLM inference engine built from scratch — paged KV cache, continuous batching, chunked prefill, prefix caching, speculative decoding, CUDA graph, tensor parallelism, and OpenAI-compatible HTTP serving. Each mechanism has a dedicated benchmark with quantitative results. Core serving path reaches 100% of HF baseline throughput at batch=8; concurrent HTTP throughput scales 3.9× (1→8 clients, 55.7→219.1 tok/s). Ships with dry-run mode (no model weights needed), /healthz, Docker, and CI.
从零实现的 LLM 推理引擎。核心 serving 路径(PagedAttention + Continuous Batching + OpenAI HTTP API)在 Qwen2.5-7B 达到 HF Transformers 100% 吞吐,支持
--dry-run无权重启动验证。

立即验证(无需模型权重)
pip install -e ".[serve,dev]"
mini-infer-serve --dry-run --port 8000
curl http://localhost:8000/healthz # → {"status":"ok","model":"dry",...}
核心成果
主 serving 路径(mini-infer-serve 默认启动)
| 技术 | 关键数据 |
|---|---|
| Continuous Batching HTTP API(AsyncEngine + OpenAI 兼容) | 并发 1→8 吞吐 55.7→219.1 tok/s(3.9×,Qwen2.5-7B,RTX 4090) |
| True PagedAttention(flash_attn block_table) | batch=8 吞吐达到 HF Transformers 100%(406 tok/s) |
| Chunked Prefill | 混合 serving 场景 ITL spike 降低 57%–67% |
| Prefix Caching(block-level hash + LRU) | 共享前缀 TTFT −22% |
独立 benchmark 实验(功能完整,未接入默认 serving 路径)
| 技术 | 关键数据 |
|---|---|
| Speculative Decoding(0.5B draft + 7B target) | acceptance rate 55.85% |
| CUDA Graph(decode_batch 静态捕获) | 1.5B bs=1 decode 延迟 −28.9% |
| Flash Decoding(Triton split-K) | seq=4096 延迟 3.31× vs 标准 Triton,SM 利用率 9%→103% |
| Tensor Parallelism(NCCL all-reduce,Megatron-LM 风格) | TP=2 greedy 输出与单卡完全一致(见注 ¹) |
| PD 解耦(同机双进程) | TTFT 三段分解:prefill 12.3ms / transfer ≈14.7ms / decode 519ms |
原型实现(correctness-first,有明确边界限制)
完整 benchmark 数据与复现命令见 docs/benchmarks.md。
| 主线吞吐演进 | Chunked Prefill ITL |
|---|---|
![]() | ![]() |
| Flash Decoding(seq_len sweep) | CUDA Graph decode 延迟 |
|---|---|
![]() | ![]() |
¹ TP 说明:1.5B 模型规模下,2 卡 NCCL all-reduce 通信开销超过计算节省,吞吐未提升;当前验收结论为 greedy 输出与单卡完全一致(正确性已验证)。TP 适用于单卡显存不足时的大模型横向扩展。
快速开始
git clone https://github.com/psmarter/mini-infer && cd mini-infer
pip install -e ".[serve,dev]"
# 无需模型权重,立即验证服务接口
mini-infer-serve --dry-run --port 8000
# 真实模型(需要 Qwen2.5-7B-Instruct)
mini-infer-serve --model /path/to/Qwen2.5-7B --port 8000
# 开启 CUDA Graph
mini-infer-serve --model /path/to/Qwen2.5-7B --use-cuda-graph --port 8000
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"mini-infer","messages":[{"role":"user","content":"Hello"}],"stream":false}'
Python 完整示例(streaming / 多轮对话)见 examples/openai_client.py。
目录结构
mini_infer/
├─ core/ # EngineConfig、Request、SamplingParams
├─ runtime/ # LLMEngine、Scheduler、AsyncEngine、SpecEngine、PDEngine
├─ cache/ # KVCacheManager(BlockTable + Prefix Cache)
├─ modeling/ # ModelRunner
├─ kernels/ # PagedAttention、Triton decode、Flash Decoding
├─ parallel/ # TP、Replica、PP
└─ serving/ # FastAPI server、OpenAI schema
benchmarks/ # 每项能力对应一个 benchmark 脚本(21 个)
tests/ # 287 collected items(含参数化展开),大多数支持 dry_run,不依赖模型权重
make test-fast 跑 CPU dry-run 全量测试(约 10s);make test 含 GPU 专项。
文档
| 文档 | 内容 |
|---|---|
| docs/architecture.md | 包结构、模块说明、请求生命周期 |
| docs/benchmarks.md | 所有能力的 benchmark 数据与复现命令 |
| docs/faq.md | 常见问题:安装、环境、CUDA Graph |
| docs/roadmap.md | 后续扩展方向与已知 gap |
与 vLLM 的区别
| 维度 | mini-infer | vLLM |
|---|---|---|
| 目标 | 从零实现并测量关键推理机制 | 生产级:高吞吐、多模型、SLO 保障 |
| PagedAttention | 与 vLLM 同路线(flash_attn block_table) | 相同路线,更成熟 |
| 模型覆盖 | Qwen2.5 / DeepSeek-V2 | 数十种架构,自动适配 |
| 调度器 | 手工实现,四队列 + chunked prefill | 完整 SLO、KV 共享感知 |
| 部署 | 单机原型 | K8s、多机 RDMA、完整监控 |
环境
| 依赖 | 版本 |
|---|---|
| Python | 3.10+ |
| PyTorch | 2.1.2+cu121 |
| transformers | 4.43.4 |
| flash-attn | 2.5.9.post1(block_size 须为 256 的倍数) |
| CUDA | 12.1 / RTX 4090 |
License
MIT



