我将vLLM的服务栈移植到C++20:66 MiB二进制,推理时无Python,输出与vLLM逐token核对
摘要
作者将vLLM的服务栈移植到C++20,生成一个66 MiB的二进制文件,推理时无Python,可逐token与vLLM核对,且在测试硬件上吞吐量具竞争力。
我是作者本人,所以请适当打折这份热情。这是一个与官方无关的社区移植项目,并未获得vLLM项目背书,但项目本身用vLLM来验证正确性。起因:我喜欢vLLM,但这里安装一套vLLM需要9.1 GiB的virtualenv,而我想把推理嵌入到其他软件中,尤其是在进程里带解释器会有问题的机器上。而且说实话,Python依赖在部署上有另一套故事,涉及安全性(供应链攻击)以及Python本身的臃肿。所以vllm.cpp就是用C++20从零重写的vLLM服务栈。名字还没最终定,在想到更好的名字之前先叫vllm.cpp。支持连续批处理(continuous batching)、分块分页KV(block-paged KV)、自动前缀缓存、投机解码(speculative decoding),以及一个兼容OpenAI的服务器。它可以构建成一个66 MiB的二进制文件,运行时不需要Python和PyTorch。比起体积,我更在意的是验证门槛。每种架构都会在相同负载下与固定版本的vLLM oracle逐token核对,上游自己的测试模块也会和代码在同一提交中移植过来。token id必须一致。目前已有约25种架构。是的,这个项目大量使用了AI辅助。我正在准备后续文章介绍其架构(这是移植项目,部分地方有所偏离,比如支持MLX、Radix Attention等)。速度是大家最关心的问题。从图中可以看到,在高并发下我们几乎与vLLM打平。我只在DGX Spark、Thor和AGX Orin上测试过。在DGX Spark (GB10)上运行Qwen3.6-27B NVFP4,与生产级graph配置的vLLM对比,取3次交错重复的中位数,1024输入/128输出:
并发 vllm.cpp vLLM 比值
1 86.05 82.32 1.045x
2 159.68 158.03 1.011x
4 292.34 290.31 1.007x
8 508.77 505.46 1.007x
16 801.76 789.16 1.016x
32 1095.01 1076.25 1.017x
名义上全面领先,但我们每次运行间的噪声约为0.5%,而六项中有五项差距在1.7%以内。也就是说,在c1上赢了一场,其余五场是平局。我宁愿自己说清楚,免得有人在评论里算出来。每个点的输出都完全一致。内存方面的对比更明确:GPU峰值显存为40,996 MiB对70,531 MiB。不过vLLM会预先预留固定比例,而我们是按工作负载需求分配,所以这是占用足迹的差异,而不是KV更便宜。其他大家常问的数字:在CPU aarch64上,同一GGUF文件的prefill速度是llama.cpp的1.18倍,decode持平;在M4上达到MLX-LM暖启动总时长的97.6%;DeepSeek-V4-Flash 2-bit GGUF在单台Spark上跑到18.69 tok/s,是我能找到的最快GGUF引擎的1.14倍。投机解码已实现:MTP将c1从9.97提升到15.10 tok/s,DFlash从10.16提升到29.32,两者都超过了运行相同投机器的vLLM。它能加载safetensors和GGUF,支持NVFP4、k-quants、i-quants、fp8和bf16。CUDA支持sm_80到sm_121a,CPU支持AVX-512和Arm i8mm,Metal,部分支持Vulkan。模型列表在仓库里,这里不粘贴了。里面也包含一些sglang的片段,以及我一直想在C++引擎中看到的想法,比如radix attention和LPM感知的缓存调度。尚不完善的地方:还有很多东西待构建,比如模型架构、硬件支持;真实硬件上不支持多GPU(tensor parallel在CPU上已验证与tp=1持平,我只有一台机器);LoRA尚未接入服务器;多模态在CLI和库中可用,但HTTP API不支持;没有embedding或reranking模型;不支持ROCm。项目也在快速开发中,所以flag和内部实现会在提交间变动。不过有一个稳定接口,即带版本号的C ABI。欢迎社区帮助移植到新的架构!开始使用时,只需要cmake构建,没有其他依赖:
cmake -S . -B build && cmake --build build -j # CPU
cmake -S . -B build-cuda -DVLLM_CPP_CUDA=ON -DVLLM_CPP_TRITON=ON # CUDA
cmake --build build-cuda -j
Apache 2.0许可。https://github.com/mudler/vllm.cpp
基准测试、方法论以及我们落败的项目:https://github.com/mudler/vllm.cpp/blob/main/docs/BENCHMARKS.md
欢迎提问,知无不答!
相似文章
vllm-project/vllm v0.20.0rc1
vLLM 0.20.0rc1 发布,带来吞吐量、量化、投机解码及多硬件支持的重大改进,助力可扩展的大模型推理服务。
vllm-project/vllm v0.20.1
vLLM v0.20.1 是一个小版本更新,针对这款流行的开源大语言模型推理和服务库,继续保持其高吞吐量和高效内存管理的核心优势。
@vllm_project: vLLM v0.21.0 发布!367 次提交,来自 202 位贡献者(其中 49 位新贡献者)。亮点:KV 卸载 + HMA、带思考预算的推测解码(适用于推理模型)……
vLLM v0.21.0 已发布,新增 KV 卸载 + HMA、面向推理模型的带思考预算的推测解码、适用于 DSR1/Kimi K2.5 的 Blackwell 上的 TOKENSPEED_MLA、Mooncake 分布式 KV、DeepSeek V4 流水线并行,以及 C++20 + Transformers v5 基线。
vllm-project/vllm v0.19.1
vLLM v0.19.1 发布 - 一个快速易用的开源 LLM 推理和服务库,拥有业界领先的吞吐量,支持 200+ 个模型架构以及包括 NVIDIA/AMD GPU 和 CPU 在内的多样化硬件。
vllm-project/vllm v0.20.0
vLLM v0.20.0 已发布,这是一个用于高吞吐量 LLM 推理和服务的开源库,特色功能包括 PagedAttention 以及对多种硬件架构的支持。