利用高通矩阵扩展加速移动端CPU上的Llama推理

大语言模型(LLMs)已迅速从研究原型转变为面向用户的日常功能。无论是文本摘要、对话助手、还是离线推理,所面临的挑战已不再仅仅是模型质量,而是如何在严格的延迟、功耗和内存限制条件下高效运行这些模型。在移动设备和边缘设备上,CPU是一种普遍可用且可靠的执行平台。
在本文中,您可以了解如何启用骁龙平台上针对Llama模型的高通矩阵扩展(Qualcomm Matrix Extension, MX)加速功能,并进行基准测试 – 您可以尝试在30分钟的时间内,利用可复现的分步设置在骁龙平台上使用高通矩阵扩展加速功能。
如果您仔细观察就会发现,这些模型的核心是由矩阵乘法主导的计算密集型线性代数运算。每一次大语言模型(LLM)的推理请求都会经历两个主要阶段:
- 预填充阶段:在该阶段,模型会处理输入提示(例如:文本令牌或图像嵌入)。
- 解码阶段:在该阶段,模型根据提示词以自动回归方式每次生成一个输出令牌。
从系统和性能角度来看,这两个阶段呈现出截然不同的特征:
- 预填充阶段主要受到计算限制,并由大型通用矩阵-矩阵乘法(GEMM)运算驱动。
- 解码阶段通常受到内存限制,性能主要由通用矩阵-向量乘法(GEMV)及相关内存访问决定。
通用矩阵-矩阵乘法和通用矩阵-向量乘法运算共同构成了Transformer架构推理的计算核心。在以下章节中,我们重点关注一组特定的大语言模型;在该组大语言模型中,这类执行模式特别明显,并且对性能至关重要。
Llama模型与关注理由
我们重点关注Llama系列模型,涵盖了大约1B到8B参数的配置,非常适合在边缘和设备端部署。这些模型准确反映了现代Transformer架构大语言模型的架构,同时保持了在资源受限环境中的实用规模。
Llama模型支持多种量化表现形式(例如:INT8和INT4),可在几乎不损失准确度的前提下,显著降低内存占用和计算成本。这使得该类模型在手智能机和边缘系统等功耗、内存带宽、和算力受限的设备上部署时表现突出。
除了其架构相关性之外,Llama模型还受益于强大的开源生态系统支持、广泛的工具兼容性、以及整个行业范围内的广泛采用。这种灵活性、可访问性、和代表性的结合使Llama成为评估CPU级加速机制(例如:高通矩阵扩展(QMX))性能增益的理想基准。
为什么要在CPU上运行大语言模型?
虽然GPU通常用于训练和推理,但CPU仍然是实际大语言模型部署的主流平台,特别是针对移动、边缘和嵌入式设备上的推理活动。有几个因素导致CPU成为这类环境下具有实用性及可扩展性的选择:
- 无处不在的可用性和无缝集成,并由成熟且广泛的软件生态系统予以支持
- 为各种量化数据类型和灵活精度提供原生支持,确保高效执行各种现代大语言模型
- 经过简化的部署和运行流程,与以GPU为中心的软件栈相比,运行时依赖性更少
这些特性使CPU特别适合于具有成本效益、可靠、且可广泛部署的设备端推理。
高通矩阵扩展(MX):专门用于大语言模型加速
为了解决大语言模型工作负载的矩阵密集型性质,高通技术公司推出了高通矩阵扩展,这是一种硬件矩阵乘法加速功能,并直接集成到其最新的CPU架构中。
高通矩阵扩展与ARM可扩展矩阵扩展(SME)指令集兼容,且专为加速Transformer推理而设计。
高通矩阵扩展的主要功能包括:
- 专用矩阵指令和基于分块的执行模式,并针对高吞吐量通用矩阵-矩阵乘法和通用矩阵-向量乘法运算进行了优化
- 支持低精度数据类型(例如:INT8和BF16),这些数据类型与经过量化的大语言模型推理高度匹配
- 高效的计算和内存利用率,有助于减少注意力机制和前馈层中出现的瓶颈
高通矩阵扩展可直接在CPU上实现高性能矩阵运算,从而在GPU资源受限或不可用的平台上显著提高了大语言模型推理效率。
实验设置与指标:
我们使用llama.cpp对高通矩阵扩展性能进行了评估,而llama.cpp是一个得到广泛采用并针对大语言模型推理进行优化的开源框架。
测试配置
- 硬件(QMX):启用搭载高通矩阵扩展的第5代骁龙8至尊版移动平台,以下简称为“第5代骁龙8至尊版移动平台”(高通矩阵扩展)
- 基线(NEON):仅使用NEON SIMD指令的第5代骁龙8至尊版移动平台,以下简称为“第5代骁龙8至尊版移动平台”(NEON)
- 线程配置
- 1线程与4线程
- 在以上两个平台的预填充和解码阶段均保持一致应用
- 经过评估的模型:
- Gemma 270M
- Gemma 1
- Llama 1B
- Gemma 4
- Llama 3
- Llama 8B
- 所有模型均采用经过量化的GGUF格式进行评估
- 提示词长度(预填充阶段):128个令牌
- 最大解码长度:128个令牌
指标
- 首令牌输出时间(TTFT)
用于衡量预填充阶段的端到端延迟时间(单位:秒)。首令牌输出时间反映了系统响应速度,即用户从请求开始到生成首个输出令牌所等待的时间。
- 令牌生成速率
用于衡量解码阶段的吞吐量(单位:每秒生成的令牌数)。该指标体现了解码开始后令牌生成的流畅性;作为参考,人类平均阅读速度约为每秒4-7个令牌。
利用该评估方法,可以在高通矩阵扩展加速执行和仅使用NEON的基线之间进行可控比较,从而在多种模型规模和线程配置范围内,在现实的边缘推理条件下隔离了高通矩阵扩展带来的性能影响。
实验背景
所有结果均以多次运行的平均值报告。固定CPU频率(小内核:3953 MHz;大内核:4394 MHz),以确保可重复性。通过测量比较了Neon SIMD和高通矩阵扩展加速在相同第5代骁龙8至尊版移动平台上的性能。
经过量化的8位模型:高通矩阵扩展的性能影响
总结
Q8模型的主要观察结果:
- 利用高通矩阵扩展,将首令牌输出时间提高了2.9倍(单线程)和约2.0倍(4线程)。
- 在单线程模式下,解码吞吐量适度提高(达到约1.5倍)。
- 多线程解码的扩展性有限,表明存在内存和打包方面的限制。
| 模型 | 首令牌输出时间加速比(最高) | 解码加速比(最高) |
| 经过量化的8位模型,1线程 | 2.9倍 | 1.5倍 |
| 经过量化的8位模型,4线程 | 2.0倍 | 1.05倍 |
首令牌输出时间加速比 – 下图表明,高通矩阵扩展的效益随着模型规模增大而提升,并且在计算密集的预填充阶段表现最为显著。

解读:预填充阶段由大规模、计算密集型的通用矩阵-矩阵乘法运算主导,包括Q/K/V(查询/键/值)投影和MLP(多层感知机)层面。由于高通矩阵扩展可直接加速这些具有良好分块结构的矩阵乘法,因此显著缩短了首令牌输出时间(TTFT),从而实现了可观察到的最大性能提升。
解码吞吐量(每秒令牌数)

解读:解码阶段主要由较小的通用矩阵-矩阵乘法和通用矩阵-向量乘法内核主导,并且越来越受到内存访问和数据打包开销的限制。尽管高通矩阵扩展仍可继续提供加速效益,但由于这些内存密集特性,其可实现的加速比相对于预填充阶段会自然受限。
经过量化的4位模型:高通矩阵扩展的性能影响
总结
- 利用高通矩阵扩展,将首令牌输出时间提升了1.52倍(单线程),最高可达约1.34倍(4线程),反映出计算密集型预填充内核的加速效果。
- 解码吞吐量在两种线程配置下均基本保持不变,表明内存带宽已达到饱和。
- 线程层面的并行性对解码性能的提升并不明显,因为解码仍然由内存访问和张量打包开销主导,而非计算本身。
| 模型 | 首令牌输出时间加速比(最高) | 解码加速比(最高) |
| 经过量化的4位模型,1线程 | 2.07倍 | 约1.25倍 |
| 经过量化的4位模型,4线程 | 1.77倍 | 约1.21倍 |
与经过量化的8位模型相比,经过量化的4位模型的算术强度降低,从而将推理瓶颈转移到内存带宽上,限制了解码期间硬件计算加速的增量收益。
首令牌输出时间加速比

解码吞吐量(每秒令牌数)

在所有实验中,出现了三种保持一致的趋势:
- 高通矩阵扩展在计算密集的场景下可实现最大的性能提升,尤其是在预填充阶段以及用于高精度模型时。
- 解码性能随着计算加速的提升而增长较弱,因其很快会进入内存受限的状态。
- 线程层面的并行性会降低每个核心的计算压力,从而削弱了高通矩阵扩展相对于单线程执行的相对优势。
结论:
本文使用真实的边缘部署设置和开源推理软件栈,评估了高通矩阵扩展(MX)对于移动CPU上基于Llama的大语言模型推理的影响。
我们的研究结果表明,高通矩阵扩展在预填充阶段显著降低了延迟,其中Q8模型的首令牌输出时间(TTFT)提升达到2.9倍,Q4模型提升达到1.5倍,从而直接加速了在注意力和前馈层占主导地位的计算密集型通用矩阵-矩阵乘法内核。
相比之下,解码阶段的性能对计算加速的敏感性有限。随着算术强度的降低,推理过程日益受到内存带宽的限制,而性能则受到权重流式传输、张量打包和数据移动的限制,而非原始计算吞吐量。
这一现象在不同线程配置下均存在,突出表明解码性能本质上由内存系统特性决定,而非矩阵计算能力。
综上,这些结果说明CPU上的硬件矩阵加速在降低大语言模型推理中的端到端延迟方面效果显著,尤其适用于预填充阶段和较高精度的量化场景。
同时,这些结果也凸显了整体系统优化的重要性,其中计算加速必须通过内存带宽利用率、数据布局、和运行时调度方面的优化予以补充,以便在解码过程中实现进一步的性能提升。
高通矩阵扩展可直接在移动CPU上实现高性能、低延迟的大语言模型推理,从而减少对于独立加速器的依赖,并实现具有更高扩展性、功率效率性、及可部署性的设备端AI体验。
未来发展方向
此项工作带来了多个机遇:
- 以内存为中心的解码优化(包括经过改进的权重打包、预取、和缓存感知布局),以更好地补充高通矩阵扩展的加速能力。
- 混合量化策略,其中将较高的精度选择性地保留在计算关键层中,以实现矩阵加速效益的最大化。
- 运行时级别的调度与融合,可以在解码过程中更好地重叠计算和内存操作。
- 更广泛的模型覆盖范围(包括微调指令和多模态变体),可以进一步说明高通矩阵扩展在新型大语言模型工作负载中的优势。
随着大语言模型推理持续向边缘端迁移,以CPU为中心的加速机制(例如:高通矩阵扩展)将在大规模提供响应迅速、隐私安全、高效节能的AI体验中发挥日益重要的作用。
这些结果突出表明,仅靠矩阵加速不足以提升端到端的大语言模型推理性能;内存带宽与数据布局同样起着至关重要的作用,尤其是针对量化解码的场景。
30分钟内尝试在骁龙平台上使用高通矩阵扩展加速
1. 在高通矩阵扩展的支持下逐步完成骁龙平台上的设置与基准测试
# 1. Clone the repository
git clone https://github.com/ggerganov/llama.cppcd llama.cpp
# 2. Checkout the specific commit that is verified to work
git checkout 25f40ca65f1aa596f8b1702bbac4bc48a45b87d7
# 3. Clone the Kleidiai Repo
git clone https://github.com/ARM-software/kleidiai.git
# 4. Update the hardcoded KleidiAI source path
# Open the following file in your preferred text editor:
# ggml/src/ggml-cpu/CMakeLists.txt#
# Locate the KLEIDIAI_SRC variable (around line 523) and replace the hardcoded path:
# set(KLEIDIAI_SRC "<Path to Kleidiai repo>/kleidiai")
# Change it to the actual absolute path where your 'kleidiai' folder is located. For example:
# set(KLEIDIAI_SRC "<Path to Kleidiai repo>/kleidiai")
2. 模型(我们采用经过量化的4位模型和经过量化的8位模型)
通过以下来源下载采用经过量化的GGUF格式的适当模型:Gemma 270M、Gemma 1B、Llama 1B、Gemma 4B、Llama 3B、和Llama 8B
3. Android设备的构建指令
我们使用一组特定的标志来启用与KleidiAI和ARMv9架构兼容的扩展功能。
环境设置:
export NDK_PATH="<path to NDK tools>/android-ndk-r28b"mkdir build && cd build
适用于第5代骁龙8平台的CMake配置:
cmake -DCMAKE_BUILD_TYPE=Release \ -DANDROID_ABI=arm64-v8a \ -
DANDROID_PLATFORM=android-29 \ -DCMAKE_TOOLCHAIN_FILE="$NDK_PATH/build/cmake/
android.toolchain.cmake" \ -DLLAMA_CURL=OFF \ -DGGML_CPU_KLEIDIAI=ON \ -
DGGML_SYSTEM_ARCH=ARM \ -DGGML_CPU_AARCH64=ON \ -DGGML_CPU_ARM_ARCH="armv9.2-
a+sve2+sme+dotprod+i8mm" \ -DCMAKE_C_FLAGS="-march=armv9.2-a+sve2+sme+dotprod+i8mm
-fno-omit-frame-pointer -g" \ -DCMAKE_CXX_FLAGS="-march=armv9.2-
a+sve2+sme+dotprod+i8mm -fno-omit-frame-pointer -g" \ -
DCMAKE_C_COMPILER_TARGET=aarch64-linux-android29 \ -
DCMAKE_CXX_COMPILER_TARGET=aarch64-linux-android29 \ -
DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DGGML_LLAMAFILE=OFF \ ..
编译:
make -j16
4. 设备设置(ADB)
您必须将共享程序及可执行文件推送到设备上(您可以在“<path_where_you_created_this_repository>/build/bin”文件夹中查找到这些程序库)。请确保目标文件夹存在。
# 1. Create directory on device
adb -s <device_id> shell "mkdir -p /data/local/tmp/<directory to push the libs>"
# 2. Push Libraries (Required for runtime)
adb -s <device_id> push ./libllama.so <directory on the target /data/local/tmp/>
adb -s <device_id> push ./libggml-base.so <directory on the target /data/local/tmp/>
adb -s <device_id> push ./libggml.so <directory on the target /data/local/tmp/>
adb -s <device_id> push ./libggml-cpu.so <directory on the target /data/local/tmp/>
adb -s <device_id> push ./libmtmd.so <directory on the target /data/local/tmp/>
adb -s <device_id> push ./libomp.so <directory on the target /data/local/tmp/>
# 3. Push Executables
adb -s <device_id> push ./llama-batched-bench <directory on the target /data/local/tmp/>
adb -s <device_id> push ./llama-cli <directory on the target /data/local/tmp/>
# 4. Push Model (Example)
adb -s <device_id> shell "mkdir -p /data/local/tmp/models"
adb -s <device_id> push ./gemma-3-270m-it-Q4_0.gguf /data/local/tmp/models/
5. 基准测试(可扩展矩阵扩展与Neon)
adb -s <device_id> shell cd <directory on the target /data/local/tmp/>
利用可扩展矩阵扩展或NEON加速运行
使用“GGML_KLEIDIAI_SME=1”标志启用可扩展矩阵扩展优化;如要在NEON上运行,请在以下命令中使用“GGML_KLEIDIAI_SME=0”
LD_LIBRARY_PATH=. GGML_KLEIDIAI_SME=1 ./llama-batched-bench -m /data/local/tmp/
models/gemma-3-270m-it-Q4_0.gguf -c 2048 -b 2048 -ub 512 -npp 512 -ntg 200 -npl 1 -
t 8 -fa on
在骁龙平台上进行尝试
是否准备好动手尝试?请遵照上述步骤,利用所启用的可扩展矩阵扩展构建llama.cpp框架,并运行所包含的基准测试,从而在30分钟内尝试在骁龙平台上使用高通矩阵扩展加速。
在您自己的设备上测量首令牌输出时间和解码性能,然后调整模型大小、量化和线程,以了解高通矩阵扩展如何影响您的特定大语言模型工作负载。
在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通技术公司或其子公司(以下简称为“高通技术公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通技术公司或任何其他方的赞同或表述。本网站同样可以提供非高通技术公司网站和资源的链接或参考。高通技术公司对于可能通过本网站引用、访问、或链接的任何非高通技术公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。
骁龙与高通品牌产品均为高通技术公司和/或其子公司的产品。
关于作者
文努戈帕尔·雷迪·贡杜鲁鲁,高通技术公司首席工程师/经理
更多推荐



所有评论(0)