0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用Arm i8mm指令优化llama.cpp

Arm社区 ? 来源:Arm社区 ? 2025-07-24 09:51 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文将为你介绍如何利用 Arm i8mm 指令,具体来说,是通过带符号 8 位整数矩阵乘加指令 smmla,来优化 llama.cpp 中 Q6_K 和 Q4_K 量化模型推理。

llama.cpp 量化

llama.cpp 是一个开源的 C++ 库,用于运行大语言模型 (LLM),针对加速 CPU 推理进行了优化。通过量化等技术(例如 8 位或 4 位整数格式)来减少内存占用并加快计算速度,从而实现在消费级和服务器级硬件上高效部署模型。

llama.cpp 支持多种量化方式。量化可在模型精度和性能之间取得平衡。数据量越小,推理速度越快,但可能会因困惑度升高而致使精度降低。例如,Q8_0 采用 8 位整数表示一个数据点,而 Q6_K 则将数据量缩减至 6 位。

量化以块为单位进行,同一个块中的数据点共享一个缩放因子。例如,Q8_0 的处理以 32 个数据点为一个块,具体过程如下:

从原始数据中提取 32 个浮点值,记为 f[0:32]

计算绝对值的最大值,即 mf = max(abs(f[0:32]))

计算缩放因子:scale_factor = mf / (max(int8)) = mf / 127

量化:q[i] = round(f[i] / scale_factor)

反量化:v[i] = q[i] * scale_factor

Q6_K 则更为复杂。如下图所示,数据点分为两个层级:

一个超级块包含 256 个数据点,并对应一个浮点格式的超级块缩放因子

每个超级块由 16 个子块组成。每个子块包含 16 个数据点,这些数据点共享一个整数格式的子块级缩放因子。

ad783d60-63c3-11f0-a6aa-92fbcf53809c.png

图 1:Llama.cpp Q6_K 量化

利用 Arm i8mm 指令

优化 llama.cpp

与大多数人工智能 (AI) 工作负载相同,在 LLM 推理过程中,大部分 CPU 周期都耗费在矩阵乘法运算上。Arm i8mm(具体是指 smmla 指令)能够有效加速 8 位整数矩阵乘法运算。

为了说明 smmla 指令的作用及其高效性,假设我们要对下图中的两个矩阵进行乘法运算。

ad863258-63c3-11f0-a6aa-92fbcf53809c.png

图 2:矩阵乘法

按照教科书上的方法,我们可以逐一计算输出矩阵中的四个标量,即第一个输出标量是矩阵 x 的第一行与矩阵 y 的第一列的内积。依此类推,需要进行四次内积运算。

还有一种更高效的方法,即外积法。如下图所示,我们可以用矩阵 x 的第一列乘以矩阵 y 的第一行,一次性得出四个部分输出标量。将这两个部分输出相加就能得到结果,这样只需要两次外积运算即可。

ad9ad348-63c3-11f0-a6aa-92fbcf53809c.png

图 3:外积

smmla 指令实现了向量级别的外积运算,如下图所示。请注意,vmmlaq_s32 是实现 smmla 指令的编译器内建函数。

每个输入向量 (int8x16) 被拆分为两个 int8x8 向量

计算四对 int8x8 向量的内积

将结果存储到输出向量 (int32x4) 的四个通道中

ada77fd0-63c3-11f0-a6aa-92fbcf53809c.png

图 4:smmla 指令

借助 smmla 指令,我们可以通过同时处理两行和两列来加速矩阵乘法。如下图所示,计算步骤如下:

从矩阵 x 中加载两行数据 (int8x16) 到 vx0 和 vx1,从矩阵 y 中加载两列数据到 vy0 和 vy1

对 vx0 和 vx1 进行“压缩”操作,将这两个向量的下半部分合并为一个向量,上半部分合并为另一个向量。这是确保 smmla 指令正确工作的必要步骤。对 vy0 和 vy1 执行相同操作

使用两条 smmla 指令计算四个临时标量结果

处理下一个数据块并累积临时结果,直到处理完所有数据

adb43112-63c3-11f0-a6aa-92fbcf53809c.png

图 5:使用 smmla 指令进行矩阵乘法

我们利用 smmla 指令对 llama.cpp 的 Q6_K 和 Q4_K 矩阵乘法内核进行了优化,并在 Arm Neoverse N2 平台上进行了测试,观察到性能有显著提升。下图展示了 Q6_K 优化前后 llama.cpp 的性能对比,其中:

S_TG 代表词元生成速度,数值越高代表性能越好

S_PP 代表提示词预填充速度,数值越高代表性能越好

adc4ffa6-63c3-11f0-a6aa-92fbcf53809c.png

图 6:Arm i8mm 提升 llama.cpp Q6_K 模型性能

上游补丁

[1]利用 Arm i8mm 优化 llama.cpp Q6_K 内核:

https://github.com/ggml-org/llama.cpp/pull/13519

[2]利用 Arm i8mm 优化 llama.cpp Q4_K 内核:

https://github.com/ggml-org/llama.cpp/pull/13886

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9361

    浏览量

    378077
  • 指令
    +关注

    关注

    1

    文章

    617

    浏览量

    36579
  • 开源
    +关注

    关注

    3

    文章

    3716

    浏览量

    43902
  • 模型
    +关注

    关注

    1

    文章

    3527

    浏览量

    50498

原文标题:一文详解如何利用 Arm i8mm 指令优化 llama.cpp

文章出处:【微信号:Arm社区,微信公众号:Arm社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    llama.cpp代码结构&调用流程分析

    llama.cpp 的代码结构比较直观,如下所示,为整体代码结构中的比较核心的部分的代码结构
    的头像 发表于 11-07 09:23 ?3612次阅读
    <b class='flag-5'>llama.cpp</b>代码结构&amp;调用流程分析

    大模型笔记之gem5运行模型框架LLama介绍

    LLama.cpp 支持x86,arm,gpu的编译。
    的头像 发表于 01-22 09:10 ?2363次阅读
    大模型笔记之gem5运行模型框架<b class='flag-5'>LLama</b>介绍

    【飞腾派4G版免费试用】仙女姐姐的嵌入式实验室之五~LLaMA.cpp及3B“小模型”OpenBuddy-StableLM-3B

    和语法规则,将这些词汇串联起来,形成一个完整的回答 关于LLaMALLaMA.cpp LLaMA全称是Large Language Model Meta AI,是由Meta AI研究人员发布的一个
    发表于 12-22 10:18

    [技术] 【飞凌嵌入式OK3576-C开发板体验】llama2.c部署

    llama2.c 是一个用纯 C 语言实现的轻量级推理引擎,无需依赖任何第三方库即可高效地进行推理任务。与 llama.cpp 相比,其代码更加直观易懂,并且可以在 PC、嵌入式 Linux 乃至
    发表于 09-18 23:58

    将Deepseek移植到i.MX 8MP|93 EVK的步骤

    此共享介绍了如何将 deepseek 移植到i.MX93EVK使用 llama.cpp 的 Yocto BSP 本文档使用的主要测试模型是在 deepseek 模型的基础上进行提炼和量化的 Qwen
    发表于 03-26 06:08

    使用 NPU 插件对量化的 Llama 3.1 8b 模型进行推理时出现“从 __Int64 转换为无符号 int 的错误”,怎么解决?

    安装了 OpenVINO? GenAI 2024.4。 使用以下命令量化 Llama 3.1 8B 模型: optimum-cli export openvino -m meta-llama
    发表于 06-25 07:20

    《电子发烧友电子设计周报》聚焦硬科技领域核心价值 第21期:2025.07.21--2025.07.25

    /p/ 技术看点: 1、德州仪器方案--如何限制PFC再浪涌电流 2、Arm方案--利用Arm i8mm
    发表于 07-25 20:03

    ARM程序设计优化策略与技术

    位来完成。实际上乘以任何一个整数都可以用移位和加法来代替乘法。ARM 7 中加法和移位可以通过一条指令来完成,且执行时间少于乘法指令。例如: i =
    发表于 07-07 11:06

    基于ARM的除法运算优化策略

    指令流水线的优化、针对寄存器分配进行的优化等。   ARM在硬件上不支持除法指令,编译器是通过调用C库函数来实现除法运算的,有许多不同类型的
    发表于 07-14 14:48

    介绍一些ARM NEON编程中常见的优化技巧

    NEON 优化技术在利用NEON优化程序时,有下述几项比较通用的优化技巧。2.1 降低数据依赖性在ARM v7-A NEON
    发表于 03-30 09:21

    ARM指令集详解

    ARM指令集详解 内容提要 ARM指令ARM指令集分类与
    发表于 03-09 09:39 ?263次下载
    <b class='flag-5'>ARM</b><b class='flag-5'>指令</b>集详解

    ARM指令系统

    ARM指令操作,ARM基础常用指令,使用新手学习
    发表于 12-20 22:27 ?0次下载

    如何优化 Llama 3 的输入提示

    优化输入提示(prompt engineering)是提高人工智能模型输出质量的关键步骤。对于Llama 3这样的模型,优化输入提示可以帮助模型更准确地理解用户的意图,从而生成更相关和高质量的内容
    的头像 发表于 10-27 14:39 ?839次阅读

    K1 AI CPU基于llama.cpp与Ollama的大模型部署实践

    AICPU芯片,已于今年4月份发布。下面我们以K1为例,结合llama.cpp来展示AICPU在大模型领域的优势。
    的头像 发表于 02-18 14:23 ?1005次阅读
    K1 AI CPU基于<b class='flag-5'>llama.cpp</b>与Ollama的大模型部署实践

    Arm Neoverse N2平台实现DeepSeek-R1满血版部署

    颇具优势。Arm 携手合作伙伴,在 Arm Neoverse N2 平台上使用开源推理框架 llama.cpp 实现 DeepSeek-R1 满血版的部署,目前已可提供线上服务。
    的头像 发表于 07-03 14:37 ?415次阅读
    <b class='flag-5'>Arm</b> Neoverse N2平台实现DeepSeek-R1满血版部署