Arm 生成式AI 人工智慧 LLM 行動裝置 量化 CPU

行動裝置解鎖邊緣LLM應用(2)

2023年,生成式AI的應用如雨後春筍般冒出,而在邊緣端運行大型語言模型(LLM)具有隱私安全及快速回應等優勢,行動裝置因此陸續開始探索邊緣LLM的可能性。本文以Arm實際示範成果為例,說明可協助行動裝置實現邊緣LLM應用的關鍵技術。
Pixabay

三項技術加持 邊緣LLM部署有門道

(承前文)前述範例中,一切運算皆於邊緣端的行動裝置在地運行。下文將說明在安卓系統中,利用CPU部署LLM的一些訣竅。

int4位元量化

AI開發人員可以實驗各種新式的壓縮與量化技術,讓LLM尺寸變得更小,以便在不同地方快速運行。整數量化便是Arm的範例得以運行具有70億個參數的模型的關鍵要素,該案例所使用的量化技術為int4。

在搭載有限RAM的裝置上,要讓任何AI與機器學習(ML)模型變得精實以便高效率運行,量化是個關鍵技術。由於LLM擁有數十億個以原生方式儲存在浮點資料類型(如浮點32位元(FP32)與浮點16位元(FP16))中的可訓練參數,量化技術對於LLM來說不可或缺。舉例來說,搭載FP16權重(Weights)的LLaMA2-7B變異模型,至少需要14GB以上的RAM,對許多行動裝置來說,是高到難以企及的門檻。

把FP16的模型量化成4位元,可以將其尺寸縮減為原本的1/4,並把RAM的需求壓低至約4GB。基於Arm CPU所提供的軟體彈性,開發人員也可以降低每個參數值的位元數,以便產出更小型的模型。不過,需要留意的是,若把位元數降至2或3,可能會導致精確度顯著下降。

執行緒親和性

關於在CPU上運行工作負載,本文在此建議一個可以直接提升效能的秘訣:將CPU親和性(Affinity)設定至執行緒(Thread)。

一般而言,在部署CPU應用時,作業系統(OS)負責選擇執行緒要在哪個核心上運行。然而,此一決定並非總是基於是否能夠達成最理想的效能來進行判斷。倘若面對的是效能關鍵型應用,開發人員可以使用執行緒親和性,強制執行緒在特定的核心運行。

開發人員可以透過親和性遮罩(Affinity Mask)來指定執行緒親和性;親和性遮罩是一種位元遮罩(Bitmask),其中每個位元代表系統中一個CPU核心。例如,假設共有八個核心,其中有四個核心是Cortex-A715 CPU,並且已經被指定給位元遮罩的最高有效位元(0b1111 0000)。

要在每個Cortex-A715 CPU核心運行每個執行緒,我們應該在執行工作負載前,將執行緒親和性遮罩傳送給系統排程器。在安卓系統中,可以使用下列syscall函數來進行這項操作:

例如,假設擁有兩個執行緒,可以讓每個執行緒擁有下列的位元遮罩:

.執行緒1:位元遮罩0b1000 0000

.執行緒2:位元遮罩0b0100 0000

工作負載執行完畢後,需要將親和性遮罩重置回預設狀態,如以下程式碼片段所示:

執行緒親和性能夠輕鬆提升CPU工作負載的效能,不過,光靠int4量化與執行緒親和性,仍不足以為LLM取得最佳的效能,而我們深知低延遲對於這些模型來說至關重要,將影響整體的使用者體驗。為此,Arm團隊開發出高度優化的int4矩陣乘向量(Matrix-by-vector)與矩陣乘矩陣(Matrix-by-matrix)的CPU例程(Routine),以大幅提升效能。

int4矩陣乘矩陣與矩陣乘向量例程

對於LLM來說,矩陣乘矩陣與矩陣乘向量例程是效能關鍵的函數。利用SDOT與SMMLA指令,這些例程已經針對Cortex-A700系列CPU完成優化。與llama.cpp中的原生實作相比,Arm的例程可以協助將Time-to-first Token(編碼器)改善超過50%,而文本生成速率則提升20%。

邊緣LLM才剛起步

透過專屬的AI指令、CPU執行緒親和性與軟體優化的例程,可以為互動式用例帶來更佳的使用體驗,正如Arm於安卓手機實現的虛擬助理應用,展現了Time-to-first Token的立即回應性,以及比平均人類閱讀速度更快的文本產出速度,在所有Cortex-A700驅動的行動裝置上皆可達成上述效能。

不過,這只是LLM體驗的開端,隨著LLM變得越來越小且越發複雜,模型在邊緣行動裝置上的效能將持續提升。Arm與其生態系合作夥伴將持續增添全新的硬體精進與軟體優化技術,以加速CPU指令集的AI功能,像是供Armv9-A架構使用的可擴展矩陣延伸指令集(SME)。這些進展將在整個2024年與更遠的未來,為Arm架構的消費性電子裝置解鎖更多LLM次世代的應用場景。

(本文作者皆任職於Arm;中文版校閱者為Arm首席應用工程師余志誠)

行動裝置解鎖邊緣LLM應用(1)

行動裝置解鎖邊緣LLM應用(2)

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!