作者:英特爾公司 沈海豪、羅嶼、孟恒宇、董波、林俊
編者按:
只需不到9行代碼,就能在CPU上實(shí)現(xiàn)出色的LLM推理性能。英特爾Extension for Transformer創(chuàng)新工具包中的LLM Runtime為諸多模型顯著降低時(shí)延,且首個(gè)token和下一個(gè)token的推理速度分別提升多達(dá)40倍和2.68倍,還能滿足更多場(chǎng)景應(yīng)用需求。
英特爾Extension for Transformer是什么?
英特爾Extension for Transformers[1]是英特爾推出的一個(gè)創(chuàng)新工具包,可基于英特爾架構(gòu)平臺(tái),尤其是第四代英特爾至強(qiáng)可擴(kuò)展處理器(代號(hào)Sapphire Rapids[2],SPR)顯著加速基于Transformer的大語(yǔ)言模型(Large Language Model,LLM)。其主要特性包括:
-
通過(guò)擴(kuò)展Hugging Face transformers API[3]和利用英特爾Neural Compressor[4],為用戶提供無(wú)縫的模型壓縮體驗(yàn);
-
提供采用低位量化內(nèi)核(NeurIPS 2023:在CPU上實(shí)現(xiàn)高效LLM推理[5])的LLM推理運(yùn)行時(shí),支持Falcon、LLaMA、MPT、Llama2、 BLOOM、OPT、ChatGLM2、GPT-J-6B、Baichuan-13B-Base、Baichuan2-13B-Base、Qwen-7B、Qwen-14B和Dolly-v2-3B等常見的LLM[6];
-
先進(jìn)的壓縮感知運(yùn)行時(shí)[7](NeurIPS 2022:在CPU上實(shí)現(xiàn)快速蒸餾和QuaLA-MiniLM:量化長(zhǎng)度自適應(yīng)MiniLM;NeurIPS 2021:一次剪枝,一勞永逸:對(duì)預(yù)訓(xùn)練語(yǔ)言模型進(jìn)行稀疏/剪枝)。
本文將重點(diǎn)介紹其中的LLM推理運(yùn)行時(shí)(簡(jiǎn)稱為“LLM運(yùn)行時(shí)”),以及如何利用基于Transformer的API在英特爾至強(qiáng)可擴(kuò)展處理器上實(shí)現(xiàn)更高效的LLM推理和如何應(yīng)對(duì)LLM在聊天場(chǎng)景中的應(yīng)用難題。
LLM運(yùn)行時(shí)(LLM Runtime)
英特爾Extension for Transformers提供的LLM Runtime[8]是一種輕量級(jí)但高效的LLM推理運(yùn)行時(shí),其靈感源于GGML[9],且與llama.cpp[10]兼容,具有如下特性:
-
內(nèi)核已針對(duì)英特爾至強(qiáng)CPU內(nèi)置的多種AI加速技術(shù)(如 AMX、VNNI)以及AVX512F和AVX2指令集進(jìn)行了優(yōu)化;
-
可提供更多量化選擇,例如:不同的粒度(按通道或按組)、不同的組大小(如:32/128);
-
擁有更優(yōu)的KV緩存訪問(wèn)以及內(nèi)存分配策略;
-
具備張量并行化功能,可助力在多路系統(tǒng)中進(jìn)行分布式推理。
LLM Runtime的簡(jiǎn)化架構(gòu)圖如下:
△圖1.英特爾 Extension for Transformers的LLM Runtime簡(jiǎn)化架構(gòu)圖
使用基于Transformer的API,在CPU上實(shí)現(xiàn)LLM高效推理
只需不到9行代碼,即可讓您在CPU上實(shí)現(xiàn)更出色的LLM推理性能。用戶可以輕松地啟用與Transformer類似的API來(lái)進(jìn)行量化和推理。只需將 ‘load_in_4bit’設(shè)為true,然后從HuggingFace URL或本地路徑輸入模型即可。下方提供了啟用僅限權(quán)重的(weight-only)INT4量化的示例代碼:
fromtransformersimportAutoTokenizer,TextStreamer
fromintel_extension_for_transformers.transformersimportAutoModelForCausalLM
model_name="Intel/neural-chat-7b-v3-1”
prompt="Onceuponatime,thereexistedalittlegirl,"
tokenizer=AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
inputs=tokenizer(prompt,return_tensors="pt").input_ids
streamer=TextStreamer(tokenizer)
model=AutoModelForCausalLM.from_pretrained(model_name,load_in_4bit=True)
outputs=model.generate(inputs,streamer=streamer,max_new_tokens=300)
△可左滑看完整版
默認(rèn)設(shè)置為:將權(quán)重存儲(chǔ)為4位,以8位進(jìn)行計(jì)算。但也支持不同計(jì)算數(shù)據(jù)類型(dtype)和權(quán)重?cái)?shù)據(jù)類型組合,用戶可以按需修改設(shè)置。下方提供了如何使用這一功能的示例代碼:
fromtransformersimportAutoTokenizer,TextStreamer
fromintel_extension_for_transformers.transformersimportAutoModelForCausalLM,WeightOnlyQuantConfig
model_name="Intel/neural-chat-7b-v3-1”
prompt="Onceuponatime,thereexistedalittlegirl,"
woq_config=WeightOnlyQuantConfig(compute_dtype="int8",weight_dtype="int4")
tokenizer=AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
inputs=tokenizer(prompt,return_tensors="pt").input_ids
streamer=TextStreamer(tokenizer)
model=AutoModelForCausalLM.from_pretrained(model_name,quantization_config=woq_config)
outputs=model.generate(inputs,streamer=streamer,max_new_tokens=300)
△可左滑看完整版
性能測(cè)試
經(jīng)過(guò)持續(xù)努力,上述優(yōu)化方案的INT4性能得到了顯著提升。本文在搭載英特爾至強(qiáng)鉑金8480+的系統(tǒng)上與llama.cpp進(jìn)行了性能比較;系統(tǒng)配置詳情如下:@3.8GHz,56核/路,啟用超線程,啟用睿頻,總內(nèi)存 256 GB (16 x 16 GB DDR5 4800 MT/s [4800 MT/s]),BIOS 3A14.TEL2P1,微代碼0x2b0001b0,CentOS Stream 8。
當(dāng)輸入大小為32、輸出大小為32、beam為1時(shí)的推理性能測(cè)試結(jié)果,詳見下表:
△表1.LLM Runtime與llama.cpp推理性能比較(輸入大小=32,輸出大小=32,beam=1)
輸入大小為1024、輸出大小為32、beam為1時(shí)的推理性能的測(cè)試結(jié)果,詳見下表:
△表2.LLM Runtime與llama.cpp推理性能比較(輸入大小=1024,輸出大小=32,beam=1)
根據(jù)上表2可見:與同樣運(yùn)行在第四代英特爾至強(qiáng)可擴(kuò)展處理器上的llama.cpp相比,無(wú)論是首個(gè)token還是下一個(gè)token,LLM Runtime都能顯著降低時(shí)延,且首個(gè)token和下一個(gè)token的推理速度分別提升多達(dá) 40 倍[a](Baichuan-13B,輸入為1024)和2.68倍[b](MPT-7B,輸入為1024)。llama.cpp的測(cè)試采用的是默認(rèn)代碼庫(kù)[10]。
而綜合表1和表2的測(cè)試結(jié)果,可得:與同樣運(yùn)行在第四代英特爾至強(qiáng)可擴(kuò)展處理器上的llama.cpp相比,LLM Runtime能顯著提升諸多常見LLM的整體性能:在輸入大小為1024時(shí),實(shí)現(xiàn)3.58到21.5倍的提升;在輸入大小為32時(shí),實(shí)現(xiàn)1.76到3.43倍的提升[c]。
準(zhǔn)確性測(cè)試
英特爾Extension for Transformers可利用英特爾Neural Compressor中的SignRound[11]、RTN和GPTQ[12]等量化方法,并使用lambada_openai、piqa、winogrande和hellaswag數(shù)據(jù)集驗(yàn)證了 INT4 推理準(zhǔn)確性。下表是測(cè)試結(jié)果平均值與FP32準(zhǔn)確性的比較。
△表3.INT4與FP32準(zhǔn)確性對(duì)比
從上表3可以看出,多個(gè)模型基于LLM Runtime進(jìn)行的INT4推理準(zhǔn)確性損失微小,幾乎可以忽略不記。我們驗(yàn)證了很多模型,但由于篇幅限制此處僅羅列了部分內(nèi)容。如您欲了解更多信息或細(xì)節(jié),請(qǐng)?jiān)L問(wèn)此鏈接:https://medium.com/@NeuralCompressor/llm-performance-of-intel-extension-for-transformers-f7d061556176。
更先進(jìn)的功能:滿足LLM更多場(chǎng)景應(yīng)用需求
同時(shí),LLM Runtime[8]還具備雙路CPU的張量并行化功能,是較早具備此類功能的產(chǎn)品之一。未來(lái),還會(huì)進(jìn)一步支持雙節(jié)點(diǎn)。
然而,LLM Runtime的優(yōu)勢(shì)不僅在于其更出色的性能和準(zhǔn)確性,我們也投入了大量的精力來(lái)增強(qiáng)其在聊天應(yīng)用場(chǎng)景中的功能,并且解決了LLM 在聊天場(chǎng)景中可能會(huì)遇到的以下應(yīng)用難題:
-
對(duì)話不僅關(guān)乎LLM推理,對(duì)話歷史也很有用。
-
輸出長(zhǎng)度有限:LLM模型預(yù)訓(xùn)練主要基于有限的序列長(zhǎng)度。因此,當(dāng)序列長(zhǎng)度超出預(yù)訓(xùn)練時(shí)使用的注意力窗口大小時(shí),其準(zhǔn)確性便會(huì)降低。
-
效率低下:在解碼階段,基于Transformer的LLM會(huì)存儲(chǔ)所有先前生成的token的鍵值狀態(tài)(KV),從而導(dǎo)致內(nèi)存使用過(guò)度,解碼時(shí)延增加。
關(guān)于第一個(gè)問(wèn)題,LLM Runtime的對(duì)話功能通過(guò)納入更多對(duì)話歷史數(shù)據(jù)以及生成更多輸出加以解決,而llama.cpp目前尚未能很好地應(yīng)對(duì)這一問(wèn)題。
關(guān)于第二和第三個(gè)問(wèn)題,我們將流式LLM(Steaming LLM)集成到英特爾Extension for Transformers中,從而能顯著優(yōu)化內(nèi)存使用并降低推理時(shí)延。
Streaming LLM
與傳統(tǒng)KV緩存算法不同,我們的方法結(jié)合了注意力匯聚(Attention Sink)(4個(gè)初始token)以提升注意力計(jì)算的穩(wěn)定性,并借助滾動(dòng)KV緩存保留最新的token,這對(duì)語(yǔ)言建模至關(guān)重要。該設(shè)計(jì)具有強(qiáng)大的靈活性,可無(wú)縫集成到能夠利用旋轉(zhuǎn)位置編碼RoPE和相對(duì)位置編碼ALiBi的自回歸語(yǔ)言模型中。
△圖2.Steaming LLM的KV緩存(圖片來(lái)源:通過(guò)注意力下沉實(shí)現(xiàn)高效流式語(yǔ)言模型[13])
此外,與llama.cpp不同,本優(yōu)化方案還引入了“n_keep”和“n_discard”等參數(shù)來(lái)增強(qiáng)Streaming LLM策略。用戶可使用前者來(lái)指定要在KV緩存中保留的token數(shù)量,并使用后者來(lái)確定在已生成的token中要舍棄的數(shù)量。為了更好地平衡性能和準(zhǔn)確性,系統(tǒng)默認(rèn)在KV緩存中舍棄一半的最新token。
同時(shí),為進(jìn)一步提高性能,我們還將Streaming LLM添加到了MHA融合模式中。如果模型是采用旋轉(zhuǎn)位置編碼(RoPE)來(lái)實(shí)現(xiàn)位置嵌入,那么只需針對(duì)現(xiàn)有的K-Cache應(yīng)用“移位運(yùn)算(shift operation)”,即可避免對(duì)先前生成的、未被舍棄的token進(jìn)行重復(fù)計(jì)算。這一方法不僅充分利用了長(zhǎng)文本生成時(shí)的完整上下文大小,還能在KV緩存上下文完全被填滿前不產(chǎn)生額外開銷。
“shift operation”依賴于旋轉(zhuǎn)的交換性和關(guān)聯(lián)性,或復(fù)數(shù)乘法。例如:如果某個(gè)token的K-張量初始放置位置為m并且旋轉(zhuǎn)了m×θifor i ∈ [0,d/2),那么當(dāng)它需要移動(dòng)到m-1這個(gè)位置時(shí),則可以旋轉(zhuǎn)回到(-1)×θifori ∈ [0,d/2)。這正是每次舍棄n_discard個(gè)token的緩存時(shí)發(fā)生的事情,而此時(shí)剩余的每個(gè)token都需要“移動(dòng)”n_discard個(gè)位置。下圖以“n_keep=4、n_ctx=16、n_discard=1”為例,展示了這一過(guò)程。
△圖3.Ring-Buffer KV-Cache和Shift-RoPE工作原理
需要注意的是:融合注意力層無(wú)需了解上述過(guò)程。如果對(duì)K-cache和V-cache進(jìn)行相同的洗牌,注意力層會(huì)輸出幾乎相同的結(jié)果(可能存在因浮點(diǎn)誤差導(dǎo)致的微小差異)。
您可通過(guò)以下代碼啟動(dòng)Streaming LLM:
fromtransformersimportAutoTokenizer,TextStreamer
fromintel_extension_for_transformers.transformersimportAutoModelForCausalLM,WeightOnlyQuantConfig
model_name="Intel/neural-chat-7b-v1-1"#HuggingFacemodel_idorlocalmodel
woq_config=WeightOnlyQuantConfig(compute_dtype="int8",weight_dtype="int4")
prompt="Onceuponatime,alittlegirl"
tokenizer=AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)
inputs=tokenizer(prompt,return_tensors="pt").input_ids
streamer=TextStreamer(tokenizer)
model=AutoModelForCausalLM.from_pretrained(model_name,quantization_config=woq_config,trust_remote_code=True)
#Recommendn_keep=4todoattentionsinks(fourinitialtokens)andn_discard=-1todrophalfrencetlytokenswhenmeetlengththreshold
outputs=model.generate(inputs,streamer=streamer,max_new_tokens=300,ctx_size=100,n_keep=4,n_discard=-1)
△可左滑看完整版
結(jié)論與展望
本文基于上述實(shí)踐經(jīng)驗(yàn),提供了一個(gè)在英特爾至強(qiáng)可擴(kuò)展處理器上實(shí)現(xiàn)高效的低位(INT4)LLM推理的解決方案,并且在一系列常見LLM上驗(yàn)證了其通用性以及展現(xiàn)了其相對(duì)于其他基于CPU的開源解決方案的性能優(yōu)勢(shì)。未來(lái),我們還將進(jìn)一步提升CPU張量庫(kù)和跨節(jié)點(diǎn)并行性能。
歡迎您試用英特爾Extension for Transformers[1],并在英特爾平臺(tái)上更高效地運(yùn)行LLM推理!也歡迎您向代碼倉(cāng)庫(kù)(repository)提交修改請(qǐng)求 (pull request)、問(wèn)題或疑問(wèn)。期待您的反饋!
特別致謝
在此致謝為此篇文章做出貢獻(xiàn)的英特爾公司人工智能資深經(jīng)理張瀚文及工程師許震中、余振滔、劉振衛(wèi)、丁藝、王哲、劉宇澄。
[a]根據(jù)表2 Baichuan-13B的首個(gè)token測(cè)試結(jié)果計(jì)算而得。
[b]根據(jù)表2 MPT-7B的下一個(gè)token測(cè)試結(jié)果計(jì)算而得。
[c]當(dāng)輸入大小為1024時(shí),整體性能=首個(gè)token性能+1023下一個(gè)token性能;當(dāng)輸入大小為32時(shí),整體性能=首個(gè)token性能+31下一個(gè)token性能。
參考鏈接:
[1]英特爾Extension for Transformers
https://github.com/intel/intel-extension-for-transformers
[2]Sapphire Rapids
https://www.intel.cn/content/www/cn/zh/products/docs/processors/xeon-accelerated/4th-gen-xeon-scalable-processors.html
[3]Hugging Face transformers
https://github.com/huggingface/transformers
[4]英特爾Neural Compressor
https://github.com/intel/neural-compressor
[5]NeurIPS 2023:在CPU上實(shí)現(xiàn)高效LLM推理
https://arxiv.org/pdf/2311.00502.pdf
[6]常見LLM:
Falcon:https://falconllm.tii.ae/
LLaMA:https://ai.meta.com/blog/large-language-model-llama-meta-ai/
MPT:https://www.mosaicml.com/blog/mpt-7b
Llama2:https://ai.meta.com/llama/
BLOOM:https://huggingface.co/bigscience/bloom
OPT:https://arxiv.org/abs/2205.01068
ChatGLM2:https://github.com/THUDM/ChatGLM2-6B
GPT-J-6B:https://huggingface.co/EleutherAI/gpt-j-6b
Baichuan-13B-Base:https://huggingface.co/baichuan-inc/Baichuan-13B-Base
Baichuan2-13B-Base:https://huggingface.co/baichuan-inc/Baichuan2-13B-Base
Qwen-7B:https://huggingface.co/Qwen/Qwen-7B
Qwen-14B:https://huggingface.co/Qwen/Qwen-14B
Dolly-v2-3B:https://huggingface.co/databricks/dolly-v2-3b
[7]先進(jìn)的壓縮感知運(yùn)行時(shí)
NeurIPS 2022:在 CPU 上實(shí)現(xiàn)快速蒸餾
https://arxiv.org/abs/2211.07715
QuaLA-MiniLM:量化長(zhǎng)度自適應(yīng) MiniLM
https://arxiv.org/abs/2210.17114
NeurIPS 2021:一次剪枝,一勞永逸:對(duì)預(yù)訓(xùn)練語(yǔ)言模型進(jìn)行稀疏/剪枝
https://arxiv.org/abs/2111.05754
[8]LLM Runtime
https://github.com/intel/intel-extension-for-transformers/tree/main/intel_extension_for_transformers/llm/runtime/graph
[9]GGML
https://github.com/ggerganov/ggml
[10]llama.cpp
https://github.com/ggerganov/llama.cpp
[11]SignRound
https://arxiv.org/abs/2309.05516
[12]GPTQ
https://arxiv.org/abs/2210.17323
[13]通過(guò)注意力下沉實(shí)現(xiàn)高效流式語(yǔ)言模型
http://arxiv.org/abs/2309.17453
本文轉(zhuǎn)載自:量子位-
英特爾
+關(guān)注
關(guān)注
60文章
9880瀏覽量
171488 -
cpu
+關(guān)注
關(guān)注
68文章
10824瀏覽量
211138
原文標(biāo)題:用上這個(gè)工具包,大模型推理性能加速達(dá)40倍
文章出處:【微信號(hào):英特爾中國(guó),微信公眾號(hào):英特爾中國(guó)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論