OpenBMB推出了CPM.cu,这是一个轻量级且高效的开源CUDA推理框架,专为端侧大型语言模型(LLMs)的部署而设计,并为MiniCPM4提供优化,核心支持稀疏架构、投机采样和低位宽量化等前沿技术创新。
CPM.cu 亮点包括:
- 集成了InfLLM v2可训练稀疏注意力内核,可加速长上下文预填充和解码;
- FR-Spec(频率排序推测采样)通过压缩词汇空间提高草稿效率,显著降低计算开销;
- 结合了EAGLE-2推测采样、4位量化和基于滑动窗口注意力的长上下文支持,从而在资源受限设备上实现高效部署。
- 性能方面,在128K-token序列上,预填充速度比Qwen3-8B快2-4倍,解码速度快4-6倍。
CPM.cu 框架结构:
CPM.cu/
├── src/
│ ├── flash_attn/ # 修改后的 Flash-Attention, 支持稀疏和投机采样
│ ├── model/
│ │ ├── minicpm4/ # minicpm4 模型
│ │ │ ├── minicpm4_model.cuh # 模型的核心实现
│ │ │ └── minicpm4_eagle.cuh # 投机采样实现
│ │ ├── model.cuh # 其他代表性模型
│ │ ├── w4a16_gptq_marlin/ # GPTQ 量化计算 kernel
│ │ ├── memory.cuh # 显存分配
│ │ └── layer.cuh # 通用层
│ ├── entry.cu # pybind: 连接 C/CUDA 和 Python
│ └── ...
├── cpmcu/ # python interface
└── ...
-
cpmcu/ 代码提供了一个 python 的调用接口,里面涉及在 Python 侧 tokenize,调用 C 代码得到模型的输出 logits,在 Python 侧根据 logits 采样并 detokenize 这些过程。我们使用了 pybind 将 C 代码与 Python 代码进行绑定。
-
src/model/memory.cuh 这里实现了整个推理框架的内存管理,这里我们采用了先分配模型权重,再分配模型中间计算结果所需的空间,最后把所有剩余显存分配给 kv-cache 的内存管理策略。这一点设计上是和 vLLM, SGLang 类似的。分配中间计算结果的空间时可以考虑一下中间计算结果的生命周期,做一点显存复用。
-
src/model/w4a16_gptq_marlin/ 量化的计算 kernel。这里直接使用了 vLLM 的 Marlin 代码。
-
src/model/minicpm4/ 这里是模型的架构实现。src/model/下也有其他代表性模型实现。
-
src/flash_attn/ 我们基于 flash_attn 2.6.3 版本,在上面增加了对 InfLLM v2、投机采样的适配支持。下面我们主要介绍这一部分,也是整个框架实现的难点。
开源地址:https://github.com/OpenBMB/CPM.cu