vLLM 对 Arm CPU 的优化
vLLM 与 PyTorch、oneDNN 和 KleidiAI 合作,针对基于 Arm Neoverse 的服务器优化其服务栈。这些更新显著提升了可用性、功能覆盖和性能,降低了在基于 CPU 的基础设施上部署大型语言模型(LLM)的成本和复杂性。
部署与功能启用
vLLM 在 Arm CPU 上现在具备了改进的开箱即用可用性和更广泛的模型支持。关键的功能启用更新包括:
- 简化安装:提供预构建的 wheel 包和 Docker 镜像。
- 扩展模型支持:支持 GPT-OSS、Whisper 和 Qwen 3.5 / 3.6。
- 新功能:支持分块预填充(chunked prefill)、前缀缓存(prefix caching)以及 INT8 W8A8 和 INT8 W4A8 推理。
- 稳定性:修复导致崩溃、准确性、线程和 CPU 利用率问题的 bug,并提升与 PyTorch 和 UXL 生态系统的集成。
核心性能优化
通过解决整个推理栈的瓶颈,而不仅仅是针对 GEMM 内核,实现了性能提升。
使用 mimalloc 的内存分配
PyTorch 默认使用 glibc malloc,在 KV 缓存管理和调度所需的重复张量分配过程中导致高页错误和争用。vLLM 现在在基于 Arm 的 CPU 上的 PyTorch 中将 mimalloc 设为默认分配器。该缓存分配器在多线程压力下扩展性更好,使 Llama 3.1 8B 离线吞吐提升 2.3 倍,并在低并发服务场景中提供最高 7 倍的提升。
同步与 Arm LSE 原子操作
在高核心数下,性能曾因 OpenMP 动态调度中的争用而回退。分析显示 gomp_iter_dynamic_next 依赖于加载链接/条件存储的重试循环,在高线程争用时导致反复失败。
vLLM 通过在 PyTorch 中构建使用 Arm Large System Extensions (LSE) 的 libgomp 运行时来解决此问题。通过使用诸如 LDADDAL 的硬件原子指令,系统消除了低效的重试循环,使 Llama 3.1 8B 离线吞吐提升 9%,并在低并发场景中将每输出令牌时间(TPOT)延迟降低 15%。
密集层权重预打包
为消除每次调用时将权重从框架布局转换为内核友好格式的开销,vLLM 启用了由 Compute Library for Arm Architecture 加速的快速 oneDNN 路径。这使得 BF16 权重可以在模型热身期间进行打包,并在推理时复用,从而在低并发场景中将 TPOT 延迟降低 60%,并将 Llama 3.1 8B 离线吞吐提升 16%。
优化的分页注意力
之前,CPU 分页注意力内核依赖于 QK 和 PV 矩阵乘法以及 softmax 指数的参考实现。vLLM 使用以下方式优化了这些路径:
- BFMMLA 高级 SIMD 指令 用于 QK 和 PV 路径。
- 向量化三次多项式近似 用于 softmax 指数。
这些优化使分页注意力提升至最高 4 倍,并将 Llama 3.1 8B 离线吞吐提升 12%,同时在 Arm CPU 上解锁了分块预填充和前缀缓存的支持。
量化性能
INT8 W8A8(8 位权重和激活)
通过使用在 SVE128 和 SVE256 上利用 SMMLA(有符号 INT8 矩阵乘加)指令的 oneDNN JIT 内核,vLLM 现在支持高效的 W8A8 量化。相较于优化的 BF16 基线,W8A8 可实现最高 88% 的吞吐提升、45% 的 TPOT 降低以及 54% 的 TTFT 降低。
INT8 W4A8(4 位权重,8 位激活)
通过 KleidiAI INT4 微内核加速,W4A8 进一步降低内存带宽压力,在低并发、受内存限制的场景中尤为有效。相较于 W8A8 基线,W4A8 可实现最高 29% 的吞吐提升、26% 的 TPOT 降低以及 18% 的 TTFT 降低。
性能提升汇总
与 2025 年 10 月的 BF16 基线相比,这些优化的累计影响相当显著:
| 配置 | 最大吞吐提升 | 最大 TPOT 加速 | 最大 TTFT 加速 |
|---|---|---|---|
| Optimized BF16 | 2.7× | - | - |
| INT8 W8A8 | 4.8× | 5.7× | - |
| INT8 W4A8 | 6.2× | 7.8× | 2.6× |
这些改进通过优化从内存分配、运行时同步到内核级执行的完整路径,使 vLLM 成为面向基于 Arm Neoverse 服务器的生产就绪推理栈。
Sources
- OriginalOptimizing vLLM on Arm CPUs