T-MAC 是一種創新的基于查找表(LUT)的方法,專為在 CPU 上高效執行低比特大型語言模型(LLMs)推理而設計,無需權重反量化,支持混合精度矩陣乘法(mpGEMM),顯著降低了推理開銷并提升了計算速度。

為增強設備上的智能性,在邊緣設備部署大型語言模型(LLMs)成為了一個趨勢,比如微軟的 Windows 11 AI + PC。
目前部署的大語言模型多會量化到低比特。然而,低比特 LLMs 在推理過程中需要進行低精度權重和高精度激活向量的混合精度矩陣乘法(mpGEMM)。現有的系統由于硬件缺乏對 mpGEMM 的原生支持,不得不將權重反量化以進行高精度計算。這種間接的方式導致了顯著的推理開銷,并且無法隨著比特數進一步降低而獲得加速。
為此,微軟亞洲研究院、中國科學技術大學、中國科學院大學的研究人員聯合開發了 T-MAC。T-MAC 采用基于查找表(LUT)的計算范式,無需反量化,直接支持混合精度矩陣乘,其高效的推理性能以及其統一且可擴展的特性為在資源受限的邊緣設備上實際部署低比特 LLMs 鋪平了道路。
代碼: https://github.com/microsoft / T-MAC 論文: https://www.arxiv.org/pdf/2407.00088
此外,當前大模型的部署普遍依賴于專用加速器,如 NPU 和 GPU 等,而 T-MAC 可以擺脫專用加速器的依賴,僅利用 CPU 部署 LLMs,推理速度甚至能夠超過同一片上的專用加速器,使 LLMs 可以部署在各類包括 PC、手機、樹莓派等邊緣端設備。T-MAC 現已開源。
在 CPU 上高效部署低比特大語言模型
T-MAC 的關鍵創新在于采用基于查找表(LUT)的計算范式,而非傳統的乘累加(MAC)計算范式。T-MAC 利用查找表直接支持低比特計算,從而消除了其他系統中必須的反量化 (dequantization) 操作,并且顯著減少了乘法和加法操作的數量。
經過實驗,T-MAC 展現出了卓越的性能:在配備了最新高通 Snapdragon X Elite 芯片組的 Surface AI PC 上,3B BitNet-b1.58 模型的生成速率可達每秒 48 個 token,2bit 7B llama 模型的生成速率可達每秒 30 個 token,4bit 7B llama 模型的生成速率可達每秒 20 個 token。
這甚至超越了 NPU 的性能!
當部署 llama-2-7b-4bit 模型時,盡管使用 NPU 可以生成每秒 10.4 個 token,但 CPU 在 T-MAC 的助力下,僅使用兩核便能達到每秒 12.6 個 token,最高甚至可以飆升至每秒 22 個 token。
這些都遠超人類的平均閱讀速度,相比于原始的 llama.cpp框架提升了 4 至 5 倍。
即使在較低端的設備如 Raspberry Pi 5 上,T-MAC 針對 3B BitNet-b1.58 也能達到每秒 11 個 token 的生成速率。T-MAC 也具有顯著的功耗優勢:達到相同的生成速率,T-MAC 所需的核心數僅為原始 llama.cpp的 1/4 至 1/6,降低能耗的同時也為其它應用留下計算資源。
值得注意的是,T-MAC 的計算性能會隨著比特數的降低而線性提高,這一現象在基于反量化去實現的 GPU 和 NPU 中是難以觀察到的。但 T-MAC 能夠在 2 比特下實現單核每秒 10 個 token,四核每秒 28 個 token,大大超越了 NPU 的性能。

圖 1 BitNet on T-MAC vs llama.cppon Apple M2

圖 2 在不同端側設備 CPU(Surface Laptop 7, NVIDIA AGX Orin, Apple M2-Ultra)的各核數下 T-MAC 和 llama.cpp的 token 生成速度可達 llama.cpp的 4-5 倍。達到相同的生成速率,T-MAC 所需的核心數僅為原始 llama.cpp的 1/4 至 1/6 矩陣乘不需乘,只需查表 (LUT)
對于低比特參數 (weights),T-MAC 將每一個比特單獨進行分組(例如,一組 4 個比特),這些比特與激活向量相乘,預先計算所有可能的部分和,然后使用 LUT 進行存儲。
之后,T-MAC 采用移位和累加操作來支持從 1 到 4 的可擴展位數。通過這種方法,T-MAC 拋棄了 CPU 上效率不高的 FMA(乘加)指令,轉而使用功耗更低效率也更高的 TBL / PSHUF(查表)指令。

圖 3 混合精度 GEMV 基于現有反量化的實現范式 vs T-MAC 基于查找表的新范式 以比特為核心的計算,取代以數據類型為核心的計算
傳統的基于反量化的計算,實際上是以數據類型為核心的計算,這種方式需要對每一種不同的數據類型單獨定制。
每種激活和權重的位寬組合,如 W4A16(權重 int4 激活 float16)和 W2A8,都需要特定的權重布局和計算內核。
舉個例子,W3 的布局需要將 2 位和另外 1 位分開打包,并利用不同的交錯或混洗方法進行內存對齊或快速解碼。然后,相應的計算內核需要將這種特定布局解包到硬件支持的數據類型進行執行。
而 T-MAC 通過從比特的視角觀察低比特矩陣乘計算,只需為單獨的一個比特設計最優的數據結構,然后通過堆疊的方式擴展到更高的 2/3/4 比特。
同時,對于不同精度的激活向量(float16 / float32 / int8),僅有構建表的過程需要發生變化,在查表的時候不再需要考慮不同的數據結構。

圖 4以比特為核心的查表計算混合精度 GEMV
同時,傳統基于反量化的方法,從 4-比特降低到 3/2/1-比特時,盡管內存占用更少,但是計算量并未減小,而且由于反量化的開銷不減反增,性能反而可能會更差。
但 T-MAC 的計算量隨著比特數降低能夠線性減少,從而在更低比特帶來更好加速,為最新的工作 BitNet,EfficientQAT 等發布的 1-比特 / 2-比特模型提供了高效率的部署方案。
圖 5 使用不同端側設備 CPU 的單核,T-MAC 在 4 到 1 比特的混合精度 GEMV 算子相較 llama.cpp加速 3-11 倍。T-MAC 的 GEMM 耗時能隨著比特數減少線性減少,而基于反量化的 llama.cpp無法做到(1 比特 llama.cpp的算子性能由其 2 比特實現推算得到) 高度優化的算子實現
基于比特為核心的計算具有許多優勢,但將其實現在 CPU 上仍具有不小的挑戰:
(1)與激活和權重的連續數據訪問相比,表的訪問是隨機的。表在快速片上內存中的駐留對于最終的推理性能尤為重要; (2)然而,片上內存是有限的,查找表(LUT)方法相比傳統的 mpGEMV 增大了片上內存的使用。這是因為查找表需要保存激活向量與所有可能的位模式相乘的結果。這比激活本身要多得多。
圖 6 T-MAC 與 llama.cpp在計算數據流上的不同
為此,微軟亞洲研究院的研究員們深入探究了基于查表的計算數據流,為這種計算范式設計了高效的數據結構和計算流程,其中包括:
1. 將 LUT 存入片上內存,以利用 CPU 上的查表向量指令(TBL / PSHUF)提升隨機訪存性能。
2. 改變矩陣 axis 計算順序,以盡可能提升放入片上內存的有限 LUT 的數據重用率。
3. 為查表單獨設計最優矩陣分塊(Tiling)方式,結合 autotvm 搜索最優分塊參數
4. 參數 weights 的布局優化
a)weights 重排,以盡可能連續訪問并提升緩存命中率 b)weights 交錯,以提升解碼效率5.對 Intel / ARM CPU 做針對性優化,包括
a)寄存器重排以快速建立查找表 b)通過取平均數指令做快速 8-比特累加研究員們在一個基礎實現上,一步步應用各種優化,最終相對于 SOTA 低比特算子獲得顯著加速:

圖 7:在實現各種優化后,T-MAC 4-比特算子最終相對于 llama.cpp獲得顯著加速
廣告聲明:文內含有的對外跳轉鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節省甄選時間,結果僅供參考,所有文章均包含本聲明。





京公網安備 11011402013531號