清華大學(xué)汪玉教授團(tuán)隊(duì)力作《高效深度學(xué)習(xí)》出版:有效降低大模型應(yīng)用成本
共 14417字,需瀏覽 29分鐘
·
2024-07-03 18:08
--文末贈(zèng)書--
以 ChatGPT、CoPilot 等應(yīng)用為代表,大型語言模型的應(yīng)用已經(jīng)在各個(gè)領(lǐng)域展示出極大的潛力,甚至有望引領(lǐng)人機(jī)交互范式的巨大改變。然而,隨著大語言模型規(guī)模的增長,模型的計(jì)算和存儲(chǔ)開銷與實(shí)際可用的硬件資源之間的矛盾日益加劇。在這個(gè)背景下,高效深度學(xué)習(xí)領(lǐng)域顯得尤為關(guān)鍵,得到了廣泛關(guān)注。
本文節(jié)選自《高效深度學(xué)習(xí):模型壓縮與設(shè)計(jì)(全彩)》一書。
作者是清華大學(xué)電子工程系汪玉教授團(tuán)隊(duì),致力于提供通用人工智能算力解決方案。
近期,汪玉團(tuán)隊(duì)在“高效大模型”推理方向做了一系列新工作,包括“Skeleton-of-Thought:Large Language Models Can Do Parallel Decoding”的高效算法設(shè)計(jì)工作、“FlashDecoding++:Faster Large Language Model Inference on GPUs”的 GPU 軟件算子設(shè)計(jì)工作,以及“FlightLLM:Efficient Large Language Model Inference witha Complete Mapping Flow on FPGAs”的 FPGA 硬件加速器設(shè)計(jì)工作等。
汪玉教授團(tuán)隊(duì)在高效深度學(xué)習(xí)方法論上的認(rèn)知總結(jié)為本書,希望通過本書的出版幫助對(duì)這個(gè)領(lǐng)域感興趣的讀者,推動(dòng)領(lǐng)域的發(fā)展。
除了 Encoder-Decoder結(jié)構(gòu),還有兩種常用的 Transformer 模型結(jié)構(gòu),分別是 Encoder-only 結(jié)構(gòu)和 Decoder-only結(jié)構(gòu)。顧名思義,這兩種結(jié)構(gòu)分別僅包含編碼器和解碼器。Encoder-only 結(jié)構(gòu)的代表模型包括BERT、RoBERTa等。2021 年 OpenAI 發(fā)布 GPT 系列模型后,Decoder-only 結(jié)構(gòu)逐漸成為主流,其代表模型包括 GPT、OPT、LLaMA 等。下面以常用的 Decoder-only 結(jié)構(gòu)為例,介紹基于 Transformer 的大語言模型的基本組成和推理過程。
Decoder-only 的 Transformer 模型由若干個(gè) Transformer 模塊重復(fù)堆疊而成,其中每個(gè)模塊包含多頭自注意力(Multi-Head self-Attention,MHA)模塊、前饋神經(jīng)網(wǎng)絡(luò)(Feed ForwardNetwork,F(xiàn)FN)模塊和層歸一化操作,如圖 10.1 所示。
Transformer 模型的完整推理流程通常包括預(yù)處理、模型推理和后處理三個(gè)步驟。其中,預(yù)處理將用戶提供的文本切分成詞塊序列用于模型推理,后處理則將模型推理得到的詞塊序列轉(zhuǎn)換成文本反饋給用戶。通常,使用預(yù)訓(xùn)練的分詞器(Tokenizer)完成上述詞塊序列和文本之間的轉(zhuǎn)換,常見的分詞器包括 BPE、SentencePiece等。模型推理時(shí),大語言模型需要進(jìn)行多次模型前向推理,每次前向推理均基于已有的詞塊序列生成一個(gè)新詞塊。若每次前向推理時(shí),均將新生成詞塊拼接在已有詞塊序列之后,并對(duì)整個(gè)詞塊序列進(jìn)行前向計(jì)算,就會(huì)產(chǎn)生大量的重復(fù)計(jì)算,增加模型端到端的推理延時(shí)。
為了解決該問題,Pope 等人提出了 Key-Value 緩存技術(shù)。該技術(shù)的核心思想是,每次進(jìn)行前向推理時(shí),無須重新計(jì)算多頭注意力機(jī)制中的 Key 和 Value 矩陣,而是可以復(fù)用先前的計(jì)算結(jié)果進(jìn)行完整的多頭自注意力計(jì)算。因此,可以將每次前向推理得到的 Key 和 Value 矩陣存儲(chǔ)起來,以便在后續(xù)的計(jì)算中復(fù)用。Key-Value 緩存技術(shù)用額外存儲(chǔ)量換取了計(jì)算量的減少,被廣泛應(yīng)用于主流大語言模型推理引擎中。采用 Key-Value 緩存技術(shù)之后,可以將模型推理分為以下兩個(gè)階段。
(1)預(yù)填充階段(Prefill Stage): 在該階段中,模型接收初始輸入文本并計(jì)算得到初始的Key-Value 緩存用以之后的詞塊生成。
(2)解碼階段(Decoding Stage): 在該階段中,模型逐一生成詞塊。產(chǎn)生每個(gè)詞塊時(shí),模型會(huì)將初始的輸入和已經(jīng)產(chǎn)生的詞塊拼接在一起作為輸入,并根據(jù)模型輸出的概率分布采樣當(dāng)前詞塊。
效率瓶頸
筆者將大語言模型推理時(shí)的效率瓶頸歸因于以下三個(gè)方面。
(1)模型規(guī)模大。大語言模型擁有數(shù)十億至數(shù)千億的龐大參數(shù)量,例如 Meta 發(fā)布的開源大語言模型 LLaMA系列中最大的模型擁有 700 億個(gè)參數(shù)。龐大的參數(shù)量會(huì)帶來巨大的存儲(chǔ)開銷、訪存開銷及計(jì)算開銷。
(2)注意力模塊開銷大。注意力模塊是 Transformer 模型的核心組件之一。以 LLaMA-7B 模型為例,當(dāng)輸入序列長度為 8 000 個(gè)詞塊時(shí),預(yù)填充階段的注意力模塊的延時(shí)占總延時(shí)的 71.8%。
(3)解碼方式開銷大。大語言模型推理過程的解碼階段會(huì)依次、逐個(gè)地生成新詞塊。每生成一個(gè)新詞塊都需要進(jìn)行一次模型前向推理,這意味著模型的所有參數(shù)需要完成一次從 GPU顯存到 GPU 計(jì)算核心上的加載過程。這樣的負(fù)載計(jì)算強(qiáng)度低,在 GPU 平臺(tái)上運(yùn)行時(shí)訪存受限,不能充分利用 GPU 的算力,在批大?。˙atch Size)較小時(shí)尤為顯著。隨著解碼的進(jìn)行,詞塊序列的長度不斷增長,導(dǎo)致所需的 Key-Value 緩存空間持續(xù)增大。若無合適的存儲(chǔ)管理機(jī)制,可能導(dǎo)致內(nèi)存碎片和非連續(xù)訪存,增加存儲(chǔ)開銷和訪存開銷。
優(yōu)化路徑
1. 模型層次優(yōu)化
模型層次優(yōu)化通過調(diào)整模型實(shí)現(xiàn)延時(shí)、吞吐率、存儲(chǔ)等目標(biāo),包括模型結(jié)構(gòu)設(shè)計(jì)和模型壓縮兩方面。其中,模型結(jié)構(gòu)設(shè)計(jì)方法通常需要較大的訓(xùn)練開銷,主要包括以下三點(diǎn)。
(1)混合專家動(dòng)態(tài)推理:對(duì)于給定的輸入,僅激活部分專家模塊完成推理,讓大參數(shù)量的模型能擁有更高的推理效率。
(2)低復(fù)雜度注意力機(jī)制:降低注意力算子的平方復(fù)雜度。
(3)多查詢注意力(Multi-Query Attention,MQA)機(jī)制:減小注意力算子的存儲(chǔ)量和訪存量。
2. 系統(tǒng)層次優(yōu)化
系統(tǒng)層次優(yōu)化通過設(shè)計(jì)軟硬件系統(tǒng)無損地加速模型推理。針對(duì)大語言模型推理的訪存受限特性,許多工作通過優(yōu)化計(jì)算圖、實(shí)現(xiàn)融合算子來降低訪存開銷。代表性工作為 FlashAt-tention,它通過算子融合和分塊計(jì)算技術(shù)避免了注意力圖在顯存和高速緩存之間的搬運(yùn),大幅降低了推理過程中預(yù)填充階段或訓(xùn)練過程的訪存和存儲(chǔ)開銷。
2023 年,筆者團(tuán)隊(duì)提出的FlashDecoding++ 對(duì)大語言模型的兩類主要計(jì)算都進(jìn)行了進(jìn)一步優(yōu)化。對(duì)于注意力計(jì)算,F(xiàn)lashDecoding++ 基于注意力輸入的數(shù)值分布特性,引入預(yù)設(shè)好的最大值,去除了 FlashAt-tention 中的額外更新操作。對(duì)于線性層計(jì)算,F(xiàn)lashDecoding++ 實(shí)現(xiàn)了解碼階段矩陣乘算子的針對(duì)性優(yōu)化,并通過預(yù)先建立的映射表,動(dòng)態(tài)選擇大語言模型中所有線性層的最優(yōu)底層實(shí)現(xiàn),實(shí)現(xiàn)了端到端推理性能的提升。
服務(wù)系統(tǒng)軟件(Serving Systems Software)旨在提高系統(tǒng)吞吐率。批次化技術(shù)是提升服務(wù)器系統(tǒng)軟件效率的必備技術(shù),它將多個(gè)用戶的查詢打包成一個(gè)批次,以提升硬件利用效率,從而提高整體吞吐率。隨后的研究對(duì)批次化技術(shù)進(jìn)行了各種改進(jìn)和變體。模型并行(Model Parallelism)和計(jì)算/存儲(chǔ)卸載(Offloading)等技術(shù)也常被用于提升大語言模型訓(xùn)練或推理的吞吐率?;诮o定的計(jì)算圖和硬件配置,這些技術(shù)決定輸入計(jì)算圖上計(jì)算和存儲(chǔ)的切分、硬件資源的分配,以及時(shí)序調(diào)度。
此外,高效內(nèi)存管理技術(shù)也是服務(wù)系統(tǒng)中重要的組成部分。在硬件加速器設(shè)計(jì)方面,筆者團(tuán)隊(duì)提出了一種面向現(xiàn)場(chǎng)可編程門陣列(Field-Programmable Gate Array,F(xiàn)PGA)的大語言模型輕量化部署流程 FlightLLM,首次在單塊 Xilinx U280FPGA 上實(shí)現(xiàn)了 LLaMA2-7B 的高效推理。
3. 解碼方式優(yōu)化
在大語言模型的推理過程中,自回歸式的解碼階段占據(jù)了主要的端到端延時(shí)。由于詞塊之間存在前后依賴關(guān)系,多個(gè)詞塊對(duì)應(yīng)的計(jì)算無法并行進(jìn)行,導(dǎo)致 GPU 計(jì)算單元的利用率極低。針對(duì)這一問題,解決思路可分為以下三類。
(1)猜測(cè)解碼技術(shù)(Speculative Decoding)。這類技術(shù)的核心思想是先使用更廉價(jià)的方式猜測(cè)接下來的候選詞塊序列,再使用大語言模型并行地驗(yàn)證并接收其中匹配大語言模型驗(yàn)證結(jié)果的詞塊。
(2)非自回歸式解碼技術(shù)(Non-Autoregressive Generation,NAG)。這些工作設(shè)計(jì)專用解碼方式并行采樣相鄰的若干個(gè)詞塊,且大多需要額外的模型設(shè)計(jì)或訓(xùn)練。為了保證生成質(zhì)量,許多非自回歸式解碼方法會(huì)迭代多次修正生成結(jié)果。
(3)筆者團(tuán)隊(duì)提出了思維骨架(Skeleton-of-Thought,SoT),利用大語言模型的規(guī)劃和指令跟隨能力實(shí)現(xiàn)并行生成,從而優(yōu)化計(jì)算利用率和端到端延時(shí)。具體地,思維骨架通過提示詞引導(dǎo)大語言模型組織答案的提綱或框架,再并行解碼提綱中的每個(gè)要點(diǎn)。
上述三類工作分別實(shí)現(xiàn)了大語言模型的連續(xù)并行驗(yàn)證、連續(xù)并行采樣、分段并行生成,能提升計(jì)算利用率,減少端到端生成延時(shí)。
模型量化可以從優(yōu)化問題的視角來看,即在滿足硬件約束的前提下,通過優(yōu)化量化格式、量化參數(shù)和量化值,最小化模型的算法性能損失。按工作流程來分類,模型量化可分為訓(xùn)練后量化和量化感知訓(xùn)練兩種。
在研究量化之前,首先需要明確兩個(gè)不同的過程。
1. 離線的模型量化過程
運(yùn)行量化算法將高位寬、高精度的權(quán)重轉(zhuǎn)換為低位寬的權(quán)重。若需要對(duì)激活值進(jìn)行量化,并且不是在線統(tǒng)計(jì)激活值量化參數(shù),則還需要確定激活值的量化參數(shù)。
2. 在線量化推理過程
這是從離線過程得到量化模型,再用量化模型做推理的過程。根據(jù)是否使用低精度計(jì)算,將在線推理階段分為以下兩類。
(1)使用低精度計(jì)算:計(jì)算單元采用低精度。一個(gè)典型的流程如下:執(zhí)行兩個(gè) INT8 低精度數(shù)的低精度乘法后進(jìn)行累加,累加器一般需要更大位寬(如 INT32),最后還需要對(duì)位寬放大的累加輸出做再量化,將輸出量化回 INT8。
(2)使用高精度計(jì)算: 將低位寬表示的權(quán)重或激活值去量化為高位寬高精度表示,然后使用高精度計(jì)算單元進(jìn)行計(jì)算。最后,可能需要將計(jì)算結(jié)果量化回低位寬表示,如用于降低訓(xùn)練時(shí)激活值的存儲(chǔ)和通信開銷等。
相比于量化傳統(tǒng)小模型,量化大語言模型存在以下新挑戰(zhàn)和新需求。
(1)算法性能上:大語言模型權(quán)重包含分布范圍更廣的離群值,且保留這些離群值對(duì)模型精度很關(guān)鍵。對(duì)離群權(quán)重的保留會(huì)導(dǎo)致小權(quán)重的舍入誤差較大。
(2)推理效率上:在不同場(chǎng)景下,大語言模型推理的效率瓶頸不同,需要不同的量化方法。大語言模型在不同階段、不同批大小、不同輸入文本長度的效率瓶頸分析如圖 10.2 所示。
在預(yù)填充階段,當(dāng)輸入文本較長或批大小較大時(shí),模型中線性層的計(jì)算訪存比 I 將大于 I0(I0 表示對(duì)應(yīng) Roofline 拐點(diǎn)的計(jì)算強(qiáng)度),推理瓶頸為計(jì)算瓶頸。反之,當(dāng)輸入文本較短或批大小較小時(shí),推理瓶頸為權(quán)重訪存瓶頸。在解碼階段,僅有批大小會(huì)影響效率瓶頸,與預(yù)填充階段類似,當(dāng)批大小較大時(shí),模型中線性層的實(shí)際計(jì)算訪存比 I 將大于 I0,推理瓶頸為計(jì)算瓶頸。反之,當(dāng)批大小較小時(shí),推理瓶頸為權(quán)重訪存瓶頸。對(duì)于瓶頸為權(quán)重訪存瓶頸的場(chǎng)景,常用“僅權(quán)重量化方法”(Weight-only Quantization)降低權(quán)重的訪存量,實(shí)現(xiàn)推理加速。對(duì)于瓶頸為計(jì)算瓶頸的場(chǎng)景,由于“僅權(quán)重量化方法”不使用低精度計(jì)算單元,甚至還會(huì)引入額外的去量化計(jì)算開銷,因而并不能實(shí)現(xiàn)推理加速。此時(shí),需依賴使用低精度計(jì)算的“權(quán)重激活量化方法”(Weight-activation Quantization)加速推理,在這些方法里,權(quán)重和激活值都被量化為低位寬和低精度。
研究者針對(duì)上述特點(diǎn)設(shè)計(jì)了適合大語言模型的量化算法,表 10.1 總結(jié)了若干個(gè)大語言模型量化方法在量化格式、量化參數(shù)、量化值等多個(gè)維度的策略選取以及量化效果。
從主要目的來看,LLM.int8()、SmoothQuant和 AWQ的目的是保持算法性能。這些工作均針對(duì)大語言模型中的權(quán)重離群值進(jìn)行特殊處理,更好地平衡截?cái)嗪蜕崛胝`差。GPTQ的目的是加速離線量化過程,其基于已有的 OBQ方法做改進(jìn)。LUT-GEMM的目的是加速在線量化推理。FlexGen的目的是降低在線量化推理過程的內(nèi)存開銷。從量化方式來看,GPTQ、LUT-GEMM和 AWQ僅量化權(quán)重,計(jì)算時(shí)會(huì)將低精度權(quán)重去量化為高精度表示,再和高精度的激活值進(jìn)行計(jì)算;而 LLM.int8()、SmoothQuant同時(shí)量化了權(quán)重和激活值,使用了高效的低精度計(jì)算;除了量化權(quán)重,F(xiàn)lexGen還量化了 Key-Value 緩存這一類激活值。下面列出這幾個(gè)代表工作所使用的方法。
(1)GPTQ:傳統(tǒng)量化算法 OBQ基于逐層重建誤差最小化原則,對(duì)矩陣的每一行采用逐權(quán)重量化。具體來說,OBQ 對(duì)每一行選取其最優(yōu)的權(quán)重量化順序,選取方法依賴重建誤差相對(duì)于當(dāng)前未被量化權(quán)重的二階梯度信息(Hessian 矩陣)。OBQ 的計(jì)算復(fù)雜度非常高,原因是在每個(gè)權(quán)重被量化后,Hessian 矩陣都需要更新。若不同行所選取的量化順序不同,則每一行量化過程中都要進(jìn)行大量的 Hessian 矩陣計(jì)算,計(jì)算開銷大。針對(duì)該問題,GPTQ 提出了所有行都使用相同的權(quán)重量化順序,即按照統(tǒng)一、從左往右的順序量化權(quán)重矩陣的所有行。此時(shí),不同行在量化過程中所使用的多個(gè) Hessian 矩陣是完全相同的,因此僅需要在一行的量化過程中計(jì)算 Hessian 矩陣,即可復(fù)用在其他行的量化過程中,實(shí)現(xiàn)量化過程的加速。
(2)LUT-GEMM:當(dāng)前的僅權(quán)重量化方法一般會(huì)將權(quán)重去量化操作和高精度矩陣乘操作融合在一個(gè)算子里,以降低訪存開銷,但是去量化操作仍然引入了額外的計(jì)算開銷。為降低去量化操作的計(jì)算開銷,LUT-GEMM 設(shè)計(jì)了基于查找表(Look-Up-Table,LUT)的去量化操作。這種去量化方法可簡單地支持均勻量化和非均勻量化格式的去量化。在數(shù)據(jù)格式層面,作者使用了一種基于可學(xué)習(xí)量化間隔的非均勻量化格式。
(3)AWQ:在大語言模型中,不同通道的權(quán)重并非同等重要。作者觀察到,激活值中存在離群數(shù)據(jù)的輸入通道對(duì)應(yīng)的權(quán)重通道更為重要。為了更有效地保存重要通道的權(quán)重,作者采用了重參數(shù)化技術(shù),并通過網(wǎng)格搜索的方法選擇重參數(shù)化系數(shù),以最小化重建誤差。
(4)LLM.int8():在大語言模型中,激活值的數(shù)據(jù)范圍顯著大于權(quán)重的數(shù)據(jù)范圍,這使得激活值更難以被量化為低精度。作者發(fā)現(xiàn)激活值中的離群數(shù)據(jù)僅分布在少數(shù)通道中?;谶@一觀察,為了降低激活值的量化誤差,作者按照輸入通道將激活值和權(quán)重拆分為兩個(gè)部分,包含離群數(shù)據(jù)的激活值和權(quán)重通道以 FP16 格式存儲(chǔ),其他激活值和權(quán)重通道量化為 INT8 格式存儲(chǔ)。這兩部分矩陣分別進(jìn)行 FP16 和 INT8 的矩陣乘法,將 INT8 數(shù)據(jù)的計(jì)算結(jié)果去量化,再將兩部分的計(jì)算結(jié)果相加,得到最終結(jié)果。
(5)SmoothQuant:如上所述,大語言模型中的激活值比權(quán)重更難量化,并且激活值中離群數(shù)據(jù)僅分布于少數(shù)通道。為了縮小激活值中離群數(shù)據(jù)通道的數(shù)據(jù)范圍,作者使用重參數(shù)化技術(shù)擴(kuò)大權(quán)重中對(duì)應(yīng)通道的數(shù)據(jù)范圍,使權(quán)重和激活值均易于量化。
(6)FlexGen:在大批次(批大小 ? 1)推理時(shí),存儲(chǔ)和訪存開銷的主要來源是模型權(quán)重量和 Key-Value 緩存量。為了實(shí)現(xiàn)更大的吞吐率,作者通過將權(quán)重和 Key-Value 緩存量化為 4-bit 來減小存儲(chǔ)和訪存開銷。
大語言模型是一類能夠解決多種任務(wù)的通用模型,因此充分了解不同量化方案對(duì)任務(wù)性能的影響,能夠切實(shí)地指導(dǎo)實(shí)際應(yīng)用場(chǎng)景中量化方案的選取。
限時(shí)優(yōu)惠,快快搶購吧!
互動(dòng)有獎(jiǎng)
按以下方式與博文菌互動(dòng),即有機(jī)會(huì)獲贈(zèng)圖書!
活動(dòng)方式:在評(píng)論區(qū)留言參與“你如何看待大模型的加速和壓縮”等話題互動(dòng),屆時(shí)會(huì)在參與的小伙伴中抽取1名幸運(yùn)鵝贈(zèng)送圖書盲盒一份!
說明:留言區(qū)收到回復(fù)“恭喜中獎(jiǎng)”者將免費(fèi)獲贈(zèng)本圖書,中獎(jiǎng)?wù)哒?qǐng)?jiān)谑盏酵ㄖ?4小時(shí)內(nèi)將您的“姓名+電話+快遞地址”留言至原評(píng)論下方處即可,隱私信息不會(huì)被放出,未在規(guī)定時(shí)間內(nèi)回復(fù)視作自動(dòng)放棄兌獎(jiǎng)資格。
活動(dòng)時(shí)間:截至7月8日開獎(jiǎng)。
快快拉上你的小伙伴參與進(jìn)來吧~~
溫馨提示:可以將“博文視點(diǎn)”設(shè)為星標(biāo),以免錯(cuò)過贈(zèng)書活動(dòng)哦!
發(fā)布:劉恩惠
審核:陳歆懿
如果喜歡本文 歡迎 在看丨留言丨分享至朋友圈 三連 < PAST · 往期回顧 > ![]()
書單 | 7月新書速遞!
