在很多開發(fā)者印象中,大模型是巨大而昂貴的,想把模型訓(xùn)練出來和部署執(zhí)行都很困難。這很自然,任何新技術(shù)都會(huì)經(jīng)歷一個(gè)從昂貴到便宜,少數(shù)人用到普及的過程。但這個(gè)過程可能 比很多人想像的都要快:從大模型推理技術(shù)的角度來看,當(dāng)下我們可能正處在價(jià)格加速下跌,普及程度快速提高的拐點(diǎn)時(shí)刻。
本文基于2023年10月大模型推理技術(shù)的現(xiàn)狀,概要敘述了要想讓大模型跑得快和便宜,我們目前都有哪些辦法,各解決什么問題,以及相關(guān)的應(yīng)用場景,希望對(duì)讀者有用。
通過我和有道AI團(tuán)隊(duì)的調(diào)研,評(píng)估多套系統(tǒng),通讀相關(guān)文獻(xiàn)和論文,結(jié)合實(shí)際的經(jīng)驗(yàn),目前大模型推理加速技術(shù)棧大體可以分成三層:
通過將技術(shù)分層,希望可以將不同技術(shù)的相關(guān)關(guān)系可以展示更清楚。這三層是個(gè)棧的關(guān)系,上面層建立在下面層的基礎(chǔ)上,提供更多的加速比。一個(gè)具體的系統(tǒng),可以只使用線性代數(shù)計(jì)算庫這一層加速,也可以使用下面兩層,或者全部三層來進(jìn)行加速。
在當(dāng)下,如果進(jìn)行聊天等常用場景的大規(guī)模應(yīng)用,很多時(shí)候直接應(yīng)用vLLM這樣的大模型調(diào)度引擎,已經(jīng)可以取得相對(duì)較好的推理性能,并不需要做額外的大量優(yōu)化工作。如果碰上系統(tǒng)不能覆蓋到的場景,例如新的模型架構(gòu),一些特定的工作負(fù)荷特性,或者更高的性能要求,團(tuán)隊(duì)則可能還需要進(jìn)行一些定制開發(fā)。好在大部分這些加速技術(shù)都是開源或者有開源替代,因此在大模型推理這個(gè)領(lǐng)域內(nèi),定制開發(fā)的可行性是比較好的。
下面,我們花主要的篇幅,分層講解一下這三層去都有哪些技術(shù)和項(xiàng)目,分別扮演什么角色,方便大家跟蹤和理解。
1.線性代數(shù)計(jì)算庫
線性代數(shù)加速是機(jī)器學(xué)習(xí)以及科學(xué)計(jì)算領(lǐng)域的基礎(chǔ)技術(shù),歷史可以一直追溯到上世紀(jì)70年代的Fortran語言BLAS庫(Basic Linear Algebra Subprograms),其中定義了矩陣乘法、矩陣和向量乘法等數(shù)十個(gè)標(biāo)準(zhǔn)函數(shù)。線性代數(shù)層的加速主要依賴以下優(yōu)化:
GPU多核計(jì)算能力:通過調(diào)用CUDA、OpenCL等API,來利用GPU的并行能力。
CPU SIMD和多核 :單指令多數(shù)據(jù)SIMD在x86上有SSEx和AVX等指令,在ARM上有NEON和SVE,都廣泛被使用,也有的庫通過OpenMP再疊加多核能力。
Tiling分塊:矩陣乘法GEMM作為機(jī)器學(xué)習(xí)關(guān)鍵操作,可以通過Tiling的方法,大幅減少對(duì)于內(nèi)存帶寬的需求,提高速度。Tiling是HPC的經(jīng)典優(yōu)化,有興趣可以看相關(guān)文章,比如《深入淺出GPU優(yōu)化系列:GEMM優(yōu)化(一)》。
對(duì)于比較低并發(fā)度的硬件平臺(tái),比如嵌入式或者手機(jī)平臺(tái),以及模型架構(gòu)固定的應(yīng)用,直接調(diào)用線性代數(shù)庫是可行的部署大模型的辦法。使用Huggingface Transformers這樣的沒有針對(duì)推理優(yōu)化的PyTorch庫進(jìn)行推理,基本上可以認(rèn)為就是只使用到了線性代數(shù)庫的優(yōu)化效果。而對(duì)于較大吞吐量的應(yīng)用來說,僅僅使用線性代數(shù)層的優(yōu)化,往往導(dǎo)致性能不足。
神經(jīng)網(wǎng)絡(luò)執(zhí)行引擎是機(jī)器學(xué)習(xí)特別是神經(jīng)網(wǎng)絡(luò)發(fā)展起來后,平臺(tái)開發(fā)者推出的通用推理加速服務(wù),包括TensorRT、Tensorflow Serving,TVM/MLC等,手機(jī)上高通的SNPE因?yàn)槭褂昧藞D計(jì)算,也可以認(rèn)為是一個(gè)相對(duì)簡單的執(zhí)行引擎。和線性代數(shù)層的優(yōu)化不同,執(zhí)行引擎能夠看到整個(gè)神經(jīng)網(wǎng)絡(luò)的架構(gòu),也能夠同時(shí)處理多個(gè)來自客戶端的請(qǐng)求,所以可以使用涉及多個(gè)算子、整個(gè)模型,以及多個(gè)請(qǐng)求間的優(yōu)化來提高執(zhí)行效率。執(zhí)行引擎一般有這些辦法將模型推理進(jìn)一步加速:
Operator Fusion 算子融合:因?yàn)閮?nèi)存帶寬往往是一大瓶頸,所以簡單將多個(gè)相鄰的算子找準(zhǔn)機(jī)會(huì)合并起來計(jì)算,就可以減少對(duì)數(shù)據(jù)的掃描而大幅提升性能,所以Fusion是算子間優(yōu)化的重要步驟,可以手工進(jìn)行,也可以由執(zhí)行引擎自動(dòng)進(jìn)行。
Quantization 量化:隨著GPU對(duì)數(shù)據(jù)結(jié)構(gòu)支持的多元化,當(dāng)前推理的基線數(shù)據(jù)類型已經(jīng)是FP16,比幾年前的FP32提高了不少速度。即便如此,將模型量化為INT8進(jìn)行推理,依然可以提高較多速度,而在手機(jī)平臺(tái)上,量化推理能進(jìn)一步降低能耗。
Distribution 分布式:使用多卡推理,以及通信加速,來提升能推理的模型規(guī)模和速度。
Batching 批量化:將多個(gè)請(qǐng)求合并處理,是提高性能的另外一個(gè)關(guān)鍵辦法,這個(gè)能大幅提高性能的原因主要有兩個(gè):1. 合并請(qǐng)求可以增大代數(shù)運(yùn)算的矩陣規(guī)模,而下層代數(shù)庫處理越大的矩陣規(guī)模,相對(duì)性能越高。2. 合并請(qǐng)求可以減少對(duì)靜態(tài)的模型參數(shù)矩陣的掃描次數(shù),減少內(nèi)存帶寬消耗。
3.大模型調(diào)度引擎
大模型調(diào)度引擎是2022年開始新出現(xiàn)的一層抽象。為什么有了執(zhí)行引擎還需要大模型調(diào)度引擎?主要是因?yàn)榇蠹蚁MM(jìn)一步優(yōu)化推理性能,而大模型架構(gòu)相對(duì)固定(Transformer架構(gòu)及變形),通過專門針對(duì)大模型而不是更通用的神經(jīng)網(wǎng)絡(luò)進(jìn)行推理優(yōu)化,就可以利用大模型架構(gòu)的特點(diǎn)和算法特性,來進(jìn)一步提高性能。
圖1. vLLM系統(tǒng)結(jié)構(gòu)
雖然發(fā)展時(shí)間很短,大模型引擎層目前已經(jīng)有這樣一些加速方法:
KV Cache:這是fairseq等系統(tǒng)很早就開始有的基礎(chǔ)方法,就是將transformer attention計(jì)算中的Key和Value張量集合緩存下來,避免每輸出一個(gè)token都重復(fù)計(jì)算。
Iteration-level scheduling 迭代層調(diào)度:這是2022年Orca引入的方法(參考文獻(xiàn)1),推理引擎默認(rèn)都是按請(qǐng)求批量化,而LLM推理需要多次迭代進(jìn)行自回歸計(jì)算,所以按“迭代”為單位進(jìn)行批量化,可以提高并行度和性能。
PagedAttention 分頁注意力: 這是今年vLLM引入的方法(參考文獻(xiàn)2),背后洞察是上面提到的KV cache占用大量GPU內(nèi)存,一個(gè)13B模型每個(gè)輸出token對(duì)應(yīng)的KV張量,需要800KB,而最長輸出長度2048個(gè)token的話,一個(gè)請(qǐng)求就需要1.6GB顯存。因此vLLM引入類似操作系統(tǒng)中的分頁機(jī)制,大幅減少了KV cache的碎片化,提高性能。
GPTQ量化。有一批研究專注于尋找更優(yōu)的量化方法,llama.cpp支持近期發(fā)表的GPTQ(參考文獻(xiàn)3),默認(rèn)將模型量化到4比特,大幅提升性能且準(zhǔn)確率下降很小。
大模型調(diào)度引擎還處在快速發(fā)展中,但已經(jīng)有了大幅的性能提高:
vLLM可以實(shí)現(xiàn)和HF Transformer相比14-24倍的性能提升。
MLC LLM 8月份實(shí)現(xiàn)了在Orange Pi 5 (Rockchip 3588S)上跑7B LLAMA 2,速度達(dá)到5 tokens/s.
相信隨著大模型推理加速技術(shù)的不斷突破,云端推理價(jià)格的快速下降,以及中小模型的本地化推理的普及,都將會(huì)能很快實(shí)現(xiàn)了。
以個(gè)人計(jì)算機(jī)先驅(qū)Butler Lampson的一句話結(jié)束:
大模型推理也是如此,又增加了一個(gè)大模型調(diào)度引擎層。
參考文獻(xiàn)
1.Orca: A Distributed Serving System for Transformer-Based Generative Models, Gyeong-In Yu, Joo Seong Jeong, Geon-Woo Kim, Soojeong Kim, Byung-Gon Chun, OSDI '22
2.vLLM: Easy, Fast, and Cheap LLM Serving with PagedAttention, Woosuk Kwon, Zhuohan Li, Siyuan Zhuang, Ying Sheng, Lianmin Zheng, Cody Yu, Joey Gonzalez, Hao Zhang, and Ion Stoica, SOSP '23
3.GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers, Elias Frantar, Saleh Ashkboos, Torsten Hoefler, Dan Alistarh, ICLR 2023
聯(lián)系客服