英特爾 Extension for Transformers 是什么?
英特爾 Extension for Transformers是英特爾推出的一個(gè)創(chuàng)新工具包,可基于英特爾 架構(gòu)平臺(tái),尤其是第四代英特爾 至強(qiáng) 可擴(kuò)展處理器(代號(hào) SapphireRapids,SPR)顯著加速基于Transformers的大語(yǔ)言模型( LargeLanguageModel,LLM)。其主要特性包括:
通過(guò)擴(kuò)展 Hugging Face transformers API 和利用英特爾 Neural Compressor,為用戶(hù)提供無(wú)縫的模型壓縮體驗(yàn); 提供采用低位量化內(nèi)核(NeurIPS 2023:在 CPU 上實(shí)現(xiàn)高效 LLM 推理)的 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 等常見(jiàn)的 LLM; 先進(jìn)的壓縮感知運(yùn)行時(shí)(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)稱(chēng)為“LLM 運(yùn)行時(shí)”),以及如何利用基于 Transformers 的 API 在英特爾 至強(qiáng) 可擴(kuò)展處理器上實(shí)現(xiàn)更高效的 LLM 推理和如何應(yīng)對(duì) LLM 在聊天場(chǎng)景中的應(yīng)用難題。
01LLM 運(yùn)行時(shí) (LLM Runtime)
英特爾 Extension for Transformers 提供的 LLM Runtime 是一種輕量級(jí)但高效的 LLM 推理運(yùn)行時(shí),其靈感源于 GGML ,且與 llama.cpp 兼容,具有如下特性:
內(nèi)核已針對(duì)英特爾 至強(qiáng) CPU 內(nèi)置的多種 AI 加速技術(shù)(如 AMX、VNNI),以及 AVX512F 和 AVX2 指令集進(jìn)行了優(yōu)化 ;
可提供更多量化選擇,例如:不同的粒度(按通道或按組)、不同的組大小(如:32/128);
擁有更優(yōu)的 KV 緩存訪(fǎng)問(wèn)以及內(nèi)存分配策略;
具備張量并行化功能,可助力在多路系統(tǒng)中進(jìn)行分布式推理。
LLM Runtime 的簡(jiǎn)化架構(gòu)圖如下:
圖 1. 英特爾 Extension for Transformers 的 LLM Runtime 簡(jiǎn)化架構(gòu)圖
02使用基于 Transformers 的 API
在 CPU 上實(shí)現(xiàn) LLM 高效推理
只需不到 9 行代碼,即可讓您在 CPU 上實(shí)現(xiàn)更出色的 LLM 推理性能。用戶(hù)可以輕松地啟用與 Transformers 類(lèi)似的 API 來(lái)進(jìn)行量化和推理。只需將 ‘load_in_4bit’ 設(shè)為 true,然后從 HuggingFace URL 或本地路徑輸入模型即可。下方提供了啟用僅限權(quán)重的 (weight-only) INT4 量化的示例代碼:
from transformers import AutoTokenizer, TextStreamer from intel_extension_for_transformers.transformers import AutoModelForCausalLM model_name = "Intel/neural-chat-7b-v3-1” prompt = "Once upon a time, there existed a little girl," 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ù)類(lèi)型 (dtype) 和權(quán)重?cái)?shù)據(jù)類(lèi)型組合,用戶(hù)可以按需修改設(shè)置。下方提供了如何使用這一功能的示例代碼:
from transformers import AutoTokenizer, TextStreamer from intel_extension_for_transformers.transformers import AutoModelForCausalLM, WeightOnlyQuantConfig model_name = "Intel/neural-chat-7b-v3-1” prompt = "Once upon a time, there existed a little girl," 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)
03性能測(cè)試
經(jīng)過(guò)持續(xù)努力,上述優(yōu)化方案的 INT4 性能得到了顯著提升。本文在搭載英特爾 至強(qiáng) 鉑金 8480+ 的系統(tǒng)上與 llama.cpp 進(jìn)行了性能比較;系統(tǒng)配置詳情如下:@3.8 GHz,56 核/路,啟用超線(xiàn)程,啟用睿頻,總內(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é)果,詳見(jiàn)下表:
表 1. LLM Runtime 與 llama.cpp 推理性能比較(輸入大小 = 32,輸出大小 = 32, beam = 1)
輸入大小為 1024、輸出大小為 32、beam 為 1 時(shí)的推理性能的測(cè)試結(jié)果,詳見(jiàn)下表:
表 2. LLM Runtime 與 llama.cpp 推理性能比較(輸入大小 = 1024,輸出大小 = 32, beam = 1)
根據(jù)上表 2 可見(jiàn):與同樣運(yùn)行在第四代英特爾 至強(qiáng) 可擴(kuò)展處理器上的 llama.cpp 相比,無(wú)論是首個(gè) token 還是下一個(gè) token,LLM Runtime都能顯著降低時(shí)延,且首個(gè) token 和下一個(gè) token 的推理速度分別提升多達(dá) 40 倍1(Baichuan-13B,輸入為 1024)和 2.68 倍2(MPT-7B,輸入為 1024)。llama.cpp 的測(cè)試采用的是默認(rèn)代碼庫(kù)。
而綜合表 1 和表 2 的測(cè)試結(jié)果,可得:與同樣運(yùn)行在第四代英特爾 至強(qiáng) 可擴(kuò)展處理器上的 llama.cpp 相比,LLM Runtime 能顯著提升諸多常見(jiàn) LLM 的整體性能:在輸入大小為 1024 時(shí),實(shí)現(xiàn) 3.58 到 21.5 倍的提升;在輸入大小為 32 時(shí),實(shí)現(xiàn) 1.76 到 3.43 倍的提升3。
04準(zhǔn)確性測(cè)試
英特爾 Extension for Transformers 可利用英特爾 Neural Compressor 中的 SignRound、RTN 和 GPTQ 等量化方法,并使用 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。
05更先進(jìn)的功能:滿(mǎn)足 LLM 更多場(chǎng)景應(yīng)用需求
同時(shí),LLM Runtime 還具備雙路 CPU 的張量并行化功能,是較早具備此類(lèi)功能的產(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)用難題:
01 對(duì)話(huà)不僅關(guān)乎 LLM 推理,對(duì)話(huà)歷史也很有用。
02 輸出長(zhǎng)度有限:LLM 模型預(yù)訓(xùn)練主要基于有限的序列長(zhǎng)度。因此,當(dāng)序列長(zhǎng)度超出預(yù)訓(xùn)練時(shí)使用的注意力窗口大小時(shí),其準(zhǔn)確性便會(huì)降低。
03 效率低下:在解碼階段,基于 Transformers 的 LLM 會(huì)存儲(chǔ)所有先前生成的 token 的鍵值狀態(tài) (KV),從而導(dǎo)致內(nèi)存使用過(guò)度,解碼時(shí)延增加。
關(guān)于第一個(gè)問(wèn)題,LLM Runtime 的對(duì)話(huà)功能通過(guò)納入更多對(duì)話(huà)歷史數(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í)延。
06Streaming 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ǔ)言模型)
此外,與 llama.cpp 不同,本優(yōu)化方案還引入了“n_keep”和“n_discard”等參數(shù)來(lái)增強(qiáng) Streaming LLM 策略。用戶(hù)可使用前者來(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 緩存上下文完全被填滿(mǎn)前不產(chǎn)生額外開(kāi)銷(xiāo)。
“shift operation” 依賴(lài)于旋轉(zhuǎn)的交換性和關(guān)聯(lián)性,或復(fù)數(shù)乘法。例如:如果某個(gè) token 的 K-張量初始放置位置為 m 并且旋轉(zhuǎn)了 m×θi for i∈0,d/2 ,那么當(dāng)它需要移動(dòng)到 m-1 這個(gè)位置時(shí),則可以旋轉(zhuǎn)回到 -1×θi for i∈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:
from transformers import AutoTokenizer, TextStreamer from intel_extension_for_transformers.transformers import AutoModelForCausalLM, WeightOnlyQuantConfig model_name = "Intel/neural-chat-7b-v1-1" # Hugging Face model_id or local model woq_config = WeightOnlyQuantConfig(compute_dtype="int8", weight_dtype="int4") prompt = "Once upon a time, a little girl" 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) # Recommend n_keep=4 to do attention sinks (four initial tokens) and n_discard=-1 to drop half rencetly tokens when meet length threshold 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 推理的解決方案,并且在一系列常見(jiàn) LLM 上驗(yàn)證了其通用性以及展現(xiàn)了其相對(duì)于其他基于 CPU 的開(kāi)源解決方案的性能優(yōu)勢(shì)。未來(lái),我們還將進(jìn)一步提升 CPU 張量庫(kù)和跨節(jié)點(diǎn)并行性能。
歡迎您試用英特爾 Extension for Transformers,并在英特爾 平臺(tái)上更高效地運(yùn)行 LLM 推理!也歡迎您向代碼倉(cāng)庫(kù) (repository) 提交修改請(qǐng)求 (pull request) 、問(wèn)題或疑問(wèn)。期待您的反饋!
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
19805瀏覽量
233531 -
英特爾
+關(guān)注
關(guān)注
61文章
10168瀏覽量
173931 -
cpu
+關(guān)注
關(guān)注
68文章
11033瀏覽量
215995 -
LLM
+關(guān)注
關(guān)注
1文章
319瀏覽量
680
原文標(biāo)題:英特爾? Extension for Transformers 讓 LLM CPU 推理加速達(dá)40x + 攻克聊天場(chǎng)景應(yīng)用難題!
文章出處:【微信號(hào):英特爾中國(guó),微信公眾號(hào):英特爾中國(guó)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
對(duì)比解碼在LLM上的應(yīng)用

AI推理CPU當(dāng)?shù)溃珹rm驅(qū)動(dòng)高效引擎

【飛凌嵌入式OK3576-C開(kāi)發(fā)板體驗(yàn)】rkllm板端推理
基于Tengine實(shí)現(xiàn)yolov4的cpu推理

如何實(shí)現(xiàn)高效的部署醫(yī)療影像推理
mlc-llm對(duì)大模型推理的流程及優(yōu)化方案

怎樣使用Accelerate庫(kù)在多GPU上進(jìn)行LLM推理呢?

自然語(yǔ)言處理應(yīng)用LLM推理優(yōu)化綜述

解鎖LLM新高度—OpenVINO? 2024.1賦能生成式AI高效運(yùn)行
基于CPU的大型語(yǔ)言模型推理實(shí)驗(yàn)

LLM大模型推理加速的關(guān)鍵技術(shù)
基于A(yíng)rm平臺(tái)的服務(wù)器CPU在LLM推理方面的能力

新品| LLM630 Compute Kit,AI 大語(yǔ)言模型推理開(kāi)發(fā)平臺(tái)

新品 | Module LLM Kit,離線(xiàn)大語(yǔ)言模型推理模塊套裝

詳解 LLM 推理模型的現(xiàn)狀

評(píng)論