0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用基于Transformers的API在CPU上實現(xiàn)LLM高效推理

英特爾中國 ? 來源:英特爾中國 ? 2024-01-22 11:11 ? 次閱讀

英特爾 Extension for Transformers 是什么?

英特爾 Extension for Transformers是英特爾推出的一個創(chuàng)新工具包,可基于英特爾 架構(gòu)平臺,尤其是第四代英特爾 至強(qiáng) 可擴(kuò)展處理器(代號 SapphireRapids,SPR)顯著加速基于Transformers的大語言模型( LargeLanguageModel,LLM)。其主要特性包括:

通過擴(kuò)展 Hugging Face transformers API 和利用英特爾 Neural Compressor,為用戶提供無縫的模型壓縮體驗; 提供采用低位量化內(nèi)核(NeurIPS 2023:在 CPU 上實現(xiàn)高效 LLM 推理)的 LLM 推理運(yùn)行時,支持 Falcon、 LLaMA、MPT、 Llama2、 BLOOM、 OPT、 ChatGLM2、GPT-J-6B、Baichuan-13B-Base、Baichuan2-13B-Base、Qwen-7B、Qwen-14B 和 Dolly-v2-3B 等常見的 LLM; 先進(jìn)的壓縮感知運(yùn)行時(NeurIPS 2022:在 CPU 上實現(xiàn)快速蒸餾 和 QuaLA-MiniLM:量化長度自適應(yīng) MiniLM;NeurIPS 2021:一次剪枝,一勞永逸:對預(yù)訓(xùn)練語言模型進(jìn)行稀疏/剪枝)。

本文將重點介紹其中的 LLM 推理運(yùn)行時(簡稱為“LLM 運(yùn)行時”),以及如何利用基于 Transformers 的 API 在英特爾 至強(qiáng) 可擴(kuò)展處理器上實現(xiàn)更高效的 LLM 推理和如何應(yīng)對 LLM 在聊天場景中的應(yīng)用難題。

01LLM 運(yùn)行時 (LLM Runtime)

英特爾 Extension for Transformers 提供的 LLM Runtime 是一種輕量級但高效的 LLM 推理運(yùn)行時,其靈感源于 GGML ,且與 llama.cpp 兼容,具有如下特性:

內(nèi)核已針對英特爾 至強(qiáng) CPU 內(nèi)置的多種 AI 加速技術(shù)(如 AMX、VNNI),以及 AVX512F 和 AVX2 指令集進(jìn)行了優(yōu)化 ;

可提供更多量化選擇,例如:不同的粒度(按通道或按組)、不同的組大?。ㄈ纾?2/128);

擁有更優(yōu)的 KV 緩存訪問以及內(nèi)存分配策略;

具備張量并行化功能,可助力在多路系統(tǒng)中進(jìn)行分布式推理。

LLM Runtime 的簡化架構(gòu)圖如下:

caabf816-b769-11ee-8b88-92fbcf53809c.png

圖 1. 英特爾 Extension for Transformers 的 LLM Runtime 簡化架構(gòu)圖

02使用基于 Transformers 的 API

在 CPU 上實現(xiàn) LLM 高效推理

只需不到 9 行代碼,即可讓您在 CPU 上實現(xiàn)更出色的 LLM 推理性能。用戶可以輕松地啟用與 Transformers 類似的 API 來進(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)重存儲為 4 位,以 8 位進(jìn)行計算。但也支持不同計算數(shù)據(jù)類型 (dtype) 和權(quán)重數(shù)據(jù)類型組合,用戶可以按需修改設(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性能測試

經(jīng)過持續(xù)努力,上述優(yōu)化方案的 INT4 性能得到了顯著提升。本文在搭載英特爾 至強(qiáng) 鉑金 8480+ 的系統(tǒng)上與 llama.cpp 進(jìn)行了性能比較;系統(tǒng)配置詳情如下:@3.8 GHz,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 時的推理性能測試結(jié)果,詳見下表:

cace5726-b769-11ee-8b88-92fbcf53809c.png

表 1. LLM Runtime 與 llama.cpp 推理性能比較(輸入大小 = 32,輸出大小 = 32, beam = 1)

輸入大小為 1024、輸出大小為 32、beam 為 1 時的推理性能的測試結(jié)果,詳見下表:

cad26e10-b769-11ee-8b88-92fbcf53809c.png

表 2. LLM Runtime 與 llama.cpp 推理性能比較(輸入大小 = 1024,輸出大小 = 32, beam = 1)

根據(jù)上表 2 可見:與同樣運(yùn)行在第四代英特爾 至強(qiáng) 可擴(kuò)展處理器上的 llama.cpp 相比,無論是首個 token 還是下一個 token,LLM Runtime都能顯著降低時延,且首個 token 和下一個 token 的推理速度分別提升多達(dá) 40 倍1(Baichuan-13B,輸入為 1024)和 2.68 倍2(MPT-7B,輸入為 1024)。llama.cpp 的測試采用的是默認(rèn)代碼庫。

而綜合表 1 和表 2 的測試結(jié)果,可得:與同樣運(yùn)行在第四代英特爾 至強(qiáng) 可擴(kuò)展處理器上的 llama.cpp 相比,LLM Runtime 能顯著提升諸多常見 LLM 的整體性能:在輸入大小為 1024 時,實現(xiàn) 3.58 到 21.5 倍的提升;在輸入大小為 32 時,實現(xiàn) 1.76 到 3.43 倍的提升3。

04準(zhǔn)確性測試

英特爾 Extension for Transformers 可利用英特爾 Neural Compressor 中的 SignRound、RTN 和 GPTQ 等量化方法,并使用 lambada_openai、piqa、winogrande 和 hellaswag 數(shù)據(jù)集驗證了 INT4 推理準(zhǔn)確性。下表是測試結(jié)果平均值與 FP32 準(zhǔn)確性的比較。

caef9dfa-b769-11ee-8b88-92fbcf53809c.png

表 3. INT4 與 FP32 準(zhǔn)確性對比

從上表 3 可以看出,多個模型基于 LLM Runtime 進(jìn)行的 INT4 推理準(zhǔn)確性損失微小,幾乎可以忽略不記。我們驗證了很多模型,但由于篇幅限制此處僅羅列了部分內(nèi)容。如您欲了解更多信息或細(xì)節(jié),請訪問此鏈接:https://medium.com/@NeuralCompressor/llm-performance-of-intel-extension-for-transformers-f7d061556176。

05更先進(jìn)的功能:滿足 LLM 更多場景應(yīng)用需求

同時,LLM Runtime 還具備雙路 CPU 的張量并行化功能,是較早具備此類功能的產(chǎn)品之一。未來,還會進(jìn)一步支持雙節(jié)點。

然而,LLM Runtime 的優(yōu)勢不僅在于其更出色的性能和準(zhǔn)確性,我們也投入了大量的精力來增強(qiáng)其在聊天應(yīng)用場景中的功能,并且解決了 LLM 在聊天場景中可能會遇到的以下應(yīng)用難題:

01 對話不僅關(guān)乎 LLM 推理,對話歷史也很有用。

02 輸出長度有限:LLM 模型預(yù)訓(xùn)練主要基于有限的序列長度。因此,當(dāng)序列長度超出預(yù)訓(xùn)練時使用的注意力窗口大小時,其準(zhǔn)確性便會降低。

03 效率低下:在解碼階段,基于 Transformers 的 LLM 會存儲所有先前生成的 token 的鍵值狀態(tài) (KV),從而導(dǎo)致內(nèi)存使用過度,解碼時延增加。

關(guān)于第一個問題,LLM Runtime 的對話功能通過納入更多對話歷史數(shù)據(jù)以及生成更多輸出加以解決,而 llama.cpp 目前尚未能很好地應(yīng)對這一問題。

關(guān)于第二和第三個問題,我們將流式 LLM (Steaming LLM) 集成到英特爾 Extension for Transformers 中,從而能顯著優(yōu)化內(nèi)存使用并降低推理時延。

06Streaming LLM

與傳統(tǒng) KV 緩存算法不同,我們的方法結(jié)合了注意力匯聚 (Attention Sink)(4 個初始 token)以提升注意力計算的穩(wěn)定性,并借助滾動 KV 緩存保留最新的 token,這對語言建模至關(guān)重要。該設(shè)計具有強(qiáng)大的靈活性,可無縫集成到能夠利用旋轉(zhuǎn)位置編碼 RoPE 和相對位置編碼 ALiBi 的自回歸語言模型中。

cb0ccee8-b769-11ee-8b88-92fbcf53809c.png

圖 2. Steaming LLM 的 KV 緩存(圖片來源:通過注意力下沉實現(xiàn)高效流式語言模型)

此外,與 llama.cpp 不同,本優(yōu)化方案還引入了“n_keep”和“n_discard”等參數(shù)來增強(qiáng) Streaming LLM 策略。用戶可使用前者來指定要在 KV 緩存中保留的 token 數(shù)量,并使用后者來確定在已生成的 token 中要舍棄的數(shù)量。為了更好地平衡性能和準(zhǔn)確性,系統(tǒng)默認(rèn)在 KV 緩存中舍棄一半的最新 token。

同時,為進(jìn)一步提高性能,我們還將 Streaming LLM 添加到了 MHA 融合模式中。如果模型是采用旋轉(zhuǎn)位置編碼 (RoPE) 來實現(xiàn)位置嵌入,那么只需針對現(xiàn)有的 K-Cache 應(yīng)用“移位運(yùn)算 (shift operation)”,即可避免對先前生成的、未被舍棄的 token 進(jìn)行重復(fù)計算。這一方法不僅充分利用了長文本生成時的完整上下文大小,還能在 KV 緩存上下文完全被填滿前不產(chǎn)生額外開銷。

“shift operation” 依賴于旋轉(zhuǎn)的交換性和關(guān)聯(lián)性,或復(fù)數(shù)乘法。例如:如果某個 token 的 K-張量初始放置位置為 m 并且旋轉(zhuǎn)了 m×θi for i∈0,d/2 ,那么當(dāng)它需要移動到 m-1 這個位置時,則可以旋轉(zhuǎn)回到 -1×θi for i∈0,d/2 。這正是每次舍棄 n_discard 個 token 的緩存時發(fā)生的事情,而此時剩余的每個 token 都需要“移動” n_discard 個位置。下圖以 “n_keep = 4、n_ctx = 16、n_discard = 1”為例,展示了這一過程。

cb2e6e04-b769-11ee-8b88-92fbcf53809c.png

圖 3. Ring-Buffer KV-Cache 和 Shift-RoPE 工作原理

需要注意的是:融合注意力層無需了解上述過程。如果對 K-cache 和 V-cache 進(jìn)行相同的洗牌,注意力層會輸出幾乎相同的結(jié)果(可能存在因浮點誤差導(dǎo)致的微小差異)。

您可通過以下代碼啟動 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é)論與展望

本文基于上述實踐經(jīng)驗,提供了一個在英特爾 至強(qiáng)可擴(kuò)展處理器上實現(xiàn)高效的低位 (INT4) LLM 推理的解決方案,并且在一系列常見 LLM 上驗證了其通用性以及展現(xiàn)了其相對于其他基于 CPU 的開源解決方案的性能優(yōu)勢。未來,我們還將進(jìn)一步提升 CPU 張量庫和跨節(jié)點并行性能。

歡迎您試用英特爾 Extension for Transformers,并在英特爾 平臺上更高效地運(yùn)行 LLM 推理!也歡迎您向代碼倉庫 (repository) 提交修改請求 (pull request) 、問題或疑問。期待您的反饋!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    18924

    瀏覽量

    227195
  • 英特爾
    +關(guān)注

    關(guān)注

    60

    文章

    9745

    瀏覽量

    170639
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10698

    瀏覽量

    209324
  • LLM
    LLM
    +關(guān)注

    關(guān)注

    0

    文章

    247

    瀏覽量

    279

原文標(biāo)題:英特爾? Extension for Transformers 讓 LLM CPU 推理加速達(dá)40x + 攻克聊天場景應(yīng)用難題!

文章出處:【微信號:英特爾中國,微信公眾號:英特爾中國】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    對比解碼LLM的應(yīng)用

    為了改進(jìn)LLM推理能力,University of California聯(lián)合Meta AI實驗室提出將Contrastive Decoding應(yīng)用于多種任務(wù)的LLM方法。實驗表明,所提方法能有效改進(jìn)
    發(fā)表于 09-21 11:37 ?502次閱讀
    對比解碼<b class='flag-5'>在</b><b class='flag-5'>LLM</b><b class='flag-5'>上</b>的應(yīng)用

    【飛凌嵌入式OK3576-C開發(fā)板體驗】rkllm板端推理

    交叉編譯 完成模型的量化構(gòu)建后,就能夠目標(biāo)硬件平臺OK3576實現(xiàn)模型的推理功能了。 板端推理
    發(fā)表于 08-31 22:45

    RK3399Pro的Python api與RKNN C api推理速度一樣嗎

    看了RK3399Pro的相關(guān)文檔,感覺有兩套API:一套是Toolkit的Python api,另一個是RKNN C api。這個理解對嗎?另外想問一下,使用這兩套API
    發(fā)表于 05-09 15:33

    基于Tengine實現(xiàn)yolov4的cpu推理講解

    本期講解便是基于 Tengine 實現(xiàn) yolov4的 cpu推理。完成動機(jī):主要是為了熟悉tengine的推理部署流程一、模型轉(zhuǎn)換采用下面鏈接中yolov4的...
    的頭像 發(fā)表于 12-15 00:19 ?750次閱讀

    基于Tengine實現(xiàn)yolov4的cpu推理

    本期講解便是基于 Tengine 實現(xiàn) yolov4的 cpu推理。完成動機(jī):主要是為了熟悉tengine的推理部署流程一、模型轉(zhuǎn)換采用下面鏈接中yolov4的...
    發(fā)表于 01-26 17:48 ?4次下載
    基于Tengine<b class='flag-5'>實現(xiàn)</b>yolov4的<b class='flag-5'>cpu</b><b class='flag-5'>推理</b>

    如何實現(xiàn)高效的部署醫(yī)療影像推理

    加速的 AI 推理部分,然而數(shù)據(jù)前后處理部分往往是放在 CPU 執(zhí)行的。對于一些比較大的數(shù)據(jù),比如 CT 或者 MR 這種 3D 圖像,CPU
    的頭像 發(fā)表于 04-09 08:18 ?1240次閱讀

    mlc-llm對大模型推理的流程及優(yōu)化方案

    比如RWKV和給定的device信息一起編譯為TVM中的runtime.Module(linux編譯的產(chǎn)物就是.so文件)提供mlc-llm的c++推理接口調(diào)用 。
    發(fā)表于 09-26 12:25 ?729次閱讀
    mlc-<b class='flag-5'>llm</b>對大模型<b class='flag-5'>推理</b>的流程及優(yōu)化方案

    主流大模型推理框架盤點解析

    vLLM是一個開源的大模型推理加速框架,通過PagedAttention高效地管理attention中緩存的張量,實現(xiàn)了比HuggingFace Transformers高14-24倍
    發(fā)表于 10-10 15:09 ?4348次閱讀
    主流大模型<b class='flag-5'>推理</b>框架盤點解析

    Hugging Face LLM部署大語言模型到亞馬遜云科技Amazon SageMaker推理示例

    ?本篇文章主要介紹如何使用新的Hugging Face LLM推理容器將開源LLMs,比如BLOOM大型語言模型部署到亞馬遜云科技Amazon SageMaker進(jìn)行推理的示例。我們將部署12B
    的頭像 發(fā)表于 11-01 17:48 ?767次閱讀
    Hugging Face <b class='flag-5'>LLM</b>部署大語言模型到亞馬遜云科技Amazon SageMaker<b class='flag-5'>推理</b>示例

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

    大型語言模型(llm)已經(jīng)徹底改變了自然語言處理領(lǐng)域。隨著這些模型規(guī)模和復(fù)雜性的增長,推理的計算需求也顯著增加。
    的頭像 發(fā)表于 12-01 10:24 ?1299次閱讀
    怎樣使用Accelerate庫<b class='flag-5'>在</b>多GPU上進(jìn)行<b class='flag-5'>LLM</b><b class='flag-5'>推理</b>呢?

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

    當(dāng)前,業(yè)界將傳統(tǒng)優(yōu)化技術(shù)引入 LLM 推理的同時,同時也探索從大模型自回歸解碼特點出發(fā),通過調(diào)整推理過程和引入新的模型結(jié)構(gòu)來進(jìn)一步提升
    發(fā)表于 04-10 11:48 ?446次閱讀
    自然語言處理應(yīng)用<b class='flag-5'>LLM</b><b class='flag-5'>推理</b>優(yōu)化綜述

    解鎖LLM新高度—OpenVINO? 2024.1賦能生成式AI高效運(yùn)行

    LLM 的發(fā)展仍保持著驚人的速度。盡管現(xiàn)有的 LLM 已經(jīng)具備強(qiáng)大的功能,但通過 OpenVINO? 的優(yōu)化和推理加速,可以對這些復(fù)雜模型的執(zhí)行進(jìn)行精煉,實現(xiàn)更快、更
    的頭像 發(fā)表于 05-10 10:36 ?379次閱讀

    基于CPU的大型語言模型推理實驗

    隨著計算和數(shù)據(jù)處理變得越來越分散和復(fù)雜,AI 的重點正在從初始訓(xùn)練轉(zhuǎn)向更高效的AI 推理。Meta 的 Llama3 是功能強(qiáng)大的公開可用的大型語言模型 (LLM)。本次測試采用開源 LLM
    的頭像 發(fā)表于 07-18 14:28 ?286次閱讀
    基于<b class='flag-5'>CPU</b>的大型語言模型<b class='flag-5'>推理</b>實驗

    LLM大模型推理加速的關(guān)鍵技術(shù)

    LLM(大型語言模型)大模型推理加速是當(dāng)前人工智能領(lǐng)域的一個研究熱點,旨在提高模型處理復(fù)雜任務(wù)時的效率和響應(yīng)速度。以下是對LLM大模型推理
    的頭像 發(fā)表于 07-24 11:38 ?493次閱讀

    基于Arm平臺的服務(wù)器CPULLM推理方面的能力

    部署任務(wù)的默認(rèn)首選平臺。但在推理領(lǐng)域,除了 GPU 和加速器之外,還有其他可行的選擇。長期以來,CPU 一直被用于傳統(tǒng)的 AI 和機(jī)器學(xué)習(xí) (ML) 用例,由于 CPU 能夠處理廣泛多樣的任務(wù)且部署起來更加靈活,因此當(dāng)企業(yè)和開發(fā)
    的頭像 發(fā)表于 09-02 10:39 ?200次閱讀
    基于Arm平臺的服務(wù)器<b class='flag-5'>CPU</b><b class='flag-5'>在</b><b class='flag-5'>LLM</b><b class='flag-5'>推理</b>方面的能力