本文將為你介紹如何利用 Arm i8mm 指令,具體來說,是通過帶符號 8 位整數(shù)矩陣乘加指令 smmla,來優(yōu)化 llama.cpp 中 Q6_K 和 Q4_K 量化模型推理。
llama.cpp 量化
llama.cpp 是一個開源的 C++ 庫,用于運行大語言模型 (LLM),針對加速 CPU 推理進行了優(yōu)化。通過量化等技術(例如 8 位或 4 位整數(shù)格式)來減少內存占用并加快計算速度,從而實現(xiàn)在消費級和服務器級硬件上高效部署模型。
llama.cpp 支持多種量化方式。量化可在模型精度和性能之間取得平衡。數(shù)據(jù)量越小,推理速度越快,但可能會因困惑度升高而致使精度降低。例如,Q8_0 采用 8 位整數(shù)表示一個數(shù)據(jù)點,而 Q6_K 則將數(shù)據(jù)量縮減至 6 位。
量化以塊為單位進行,同一個塊中的數(shù)據(jù)點共享一個縮放因子。例如,Q8_0 的處理以 32 個數(shù)據(jù)點為一個塊,具體過程如下:
從原始數(shù)據(jù)中提取 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 則更為復雜。如下圖所示,數(shù)據(jù)點分為兩個層級:
一個超級塊包含 256 個數(shù)據(jù)點,并對應一個浮點格式的超級塊縮放因子
每個超級塊由 16 個子塊組成。每個子塊包含 16 個數(shù)據(jù)點,這些數(shù)據(jù)點共享一個整數(shù)格式的子塊級縮放因子。

圖 1:Llama.cpp Q6_K 量化
利用 Arm i8mm 指令
優(yōu)化 llama.cpp
與大多數(shù)人工智能 (AI) 工作負載相同,在 LLM 推理過程中,大部分 CPU 周期都耗費在矩陣乘法運算上。Arm i8mm(具體是指 smmla 指令)能夠有效加速 8 位整數(shù)矩陣乘法運算。
為了說明 smmla 指令的作用及其高效性,假設我們要對下圖中的兩個矩陣進行乘法運算。

圖 2:矩陣乘法
按照教科書上的方法,我們可以逐一計算輸出矩陣中的四個標量,即第一個輸出標量是矩陣 x 的第一行與矩陣 y 的第一列的內積。依此類推,需要進行四次內積運算。
還有一種更高效的方法,即外積法。如下圖所示,我們可以用矩陣 x 的第一列乘以矩陣 y 的第一行,一次性得出四個部分輸出標量。將這兩個部分輸出相加就能得到結果,這樣只需要兩次外積運算即可。

圖 3:外積
smmla 指令實現(xiàn)了向量級別的外積運算,如下圖所示。請注意,vmmlaq_s32 是實現(xiàn) smmla 指令的編譯器內建函數(shù)。
每個輸入向量 (int8x16) 被拆分為兩個 int8x8 向量
計算四對 int8x8 向量的內積
將結果存儲到輸出向量 (int32x4) 的四個通道中

圖 4:smmla 指令
借助 smmla 指令,我們可以通過同時處理兩行和兩列來加速矩陣乘法。如下圖所示,計算步驟如下:
從矩陣 x 中加載兩行數(shù)據(jù) (int8x16) 到 vx0 和 vx1,從矩陣 y 中加載兩列數(shù)據(jù)到 vy0 和 vy1
對 vx0 和 vx1 進行“壓縮”操作,將這兩個向量的下半部分合并為一個向量,上半部分合并為另一個向量。這是確保 smmla 指令正確工作的必要步驟。對 vy0 和 vy1 執(zhí)行相同操作
使用兩條 smmla 指令計算四個臨時標量結果
處理下一個數(shù)據(jù)塊并累積臨時結果,直到處理完所有數(shù)據(jù)

圖 5:使用 smmla 指令進行矩陣乘法
我們利用 smmla 指令對 llama.cpp 的 Q6_K 和 Q4_K 矩陣乘法內核進行了優(yōu)化,并在 Arm Neoverse N2 平臺上進行了測試,觀察到性能有顯著提升。下圖展示了 Q6_K 優(yōu)化前后 llama.cpp 的性能對比,其中:
S_TG 代表詞元生成速度,數(shù)值越高代表性能越好
S_PP 代表提示詞預填充速度,數(shù)值越高代表性能越好

圖 6:Arm i8mm 提升 llama.cpp Q6_K 模型性能
上游補丁
[1]利用 Arm i8mm 優(yōu)化 llama.cpp Q6_K 內核:
https://github.com/ggml-org/llama.cpp/pull/13519
[2]利用 Arm i8mm 優(yōu)化 llama.cpp Q4_K 內核:
https://github.com/ggml-org/llama.cpp/pull/13886
-
ARM
+關注
關注
135文章
9552瀏覽量
391786 -
指令
+關注
關注
1文章
623瀏覽量
37523 -
開源
+關注
關注
3文章
4200瀏覽量
46108 -
模型
+關注
關注
1文章
3749瀏覽量
52091
原文標題:一文詳解如何利用 Arm i8mm 指令優(yōu)化 llama.cpp
文章出處:【微信號:Arm社區(qū),微信公眾號:Arm社區(qū)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
【飛騰派4G版免費試用】仙女姐姐的嵌入式實驗室之五~LLaMA.cpp及3B“小模型”O(jiān)penBuddy-StableLM-3B
將Deepseek移植到i.MX 8MP|93 EVK的步驟
《電子發(fā)燒友電子設計周報》聚焦硬科技領域核心價值 第21期:2025.07.21--2025.07.25
《電子發(fā)燒友電子設計周報》聚焦硬科技領域核心價值 第22期:2025.07.28--2025.08.1
【CIE全國RISC-V創(chuàng)新應用大賽】基于 K1 AI CPU 的大模型部署落地
ARM程序設計優(yōu)化策略與技術
基于ARM的除法運算優(yōu)化策略
如何優(yōu)化 Llama 3 的輸入提示
K1 AI CPU基于llama.cpp與Ollama的大模型部署實踐
Arm Neoverse N2平臺實現(xiàn)DeepSeek-R1滿血版部署
RISC-V CPU 上 3 倍推理加速!V-SEEK:在 SOPHON SG2042 上加速 14B LLM
利用Arm i8mm指令優(yōu)化llama.cpp
評論