用BigDL-LLM 即刻加速百億級(jí)參數(shù)LLM推理
我們正邁入一個(gè)由大語(yǔ)言模型(Large Language Model, LLM)驅(qū)動(dòng)的 AI 新時(shí)代,LLM在諸如客戶服務(wù)、虛擬助理、內(nèi)容創(chuàng)作、編程輔助等各類應(yīng)用中正發(fā)揮著越來(lái)越重要的作用。
然而,隨著 LLM 規(guī)模不斷擴(kuò)大,運(yùn)行大模型所需的資源消耗也越來(lái)越大,導(dǎo)致其運(yùn)行也越來(lái)越慢,這給 AI 應(yīng)用開發(fā)者帶來(lái)了相當(dāng)大的挑戰(zhàn)。
為此,英特爾最近推出了一個(gè)名為BigDL-LLM[1]的大模型開源庫(kù),可助力 AI 開發(fā)者和研究者在英特爾? 平臺(tái)上加速優(yōu)化大語(yǔ)言模型,提升大語(yǔ)言模型在英特爾? 平臺(tái)上的使用體驗(yàn)。
下面就展示了使用 BigDL-LLM 加速過(guò)的 330 億參數(shù)的大語(yǔ)言模型 Vicuna-33b-v1.3[2]在一臺(tái)搭載英特爾? 至強(qiáng)? 鉑金 8468 處理器的服務(wù)器上運(yùn)行的實(shí)時(shí)效果。
△在一臺(tái)搭載英特爾? 至強(qiáng)? 鉑金 8468 處理器的服務(wù)器上運(yùn)行 330 億參數(shù)大語(yǔ)言模型的實(shí)際速度(實(shí)時(shí)錄屏)
BigDL-LLM:英特爾? 平臺(tái)上的開源大語(yǔ)言模型加速庫(kù)
BigDL-LLM 是一個(gè)針對(duì)大語(yǔ)言模型的優(yōu)化加速庫(kù),是開源 BigDL 的一部分,通過(guò) Apache 2.0 許可證發(fā)布。
它提供了各種低精度優(yōu)化(例如 INT4/INT5/INT8),并可利用多種英特爾? CPU集成的硬件加速技術(shù)(AVX/VNNI/AMX 等)和最新的軟件優(yōu)化,來(lái)賦能大語(yǔ)言模型在英特爾? 平臺(tái)上實(shí)現(xiàn)更高效的優(yōu)化和更為快速的運(yùn)行。
BigDL-LLM 的一大重要特性是:對(duì)基于 Hugging Face Transformers API 的模型,只需改動(dòng)一行代碼即可對(duì)模型進(jìn)行加速,理論上可以支持運(yùn)行任何 Transformers 模型,這對(duì)熟悉 Transformers API 的開發(fā)者非常友好。
除了 Transformers API,很多人也會(huì)使用 LangChain 來(lái)開發(fā)大語(yǔ)言模型應(yīng)用。
為此,BigDL-LLM 也提供便于使用的 LangChain 的集成[3],從而讓開發(fā)者能夠輕松使用 BigDL-LLM 來(lái)開發(fā)新應(yīng)用或遷移現(xiàn)有的、基于 Transformers API 或 LangChain API 的應(yīng)用。
此外,對(duì)于一般的 PyTorch 大語(yǔ)言模型(沒(méi)有使用 Transformer 或 LangChain API 的模型),也可使用 BigDL-LLM optimize_model API 一鍵加速來(lái)提升性能。詳情請(qǐng)參閱 GitHub README[4]以及官方文檔[5]。
BigDL-LLM 還提供了大量常用開源 LLM的加速樣例(e.g. 使用 Transformers API 的樣例[6]和使用 LangChain API 的樣例[7],以及教程(包括配套 jupyter notebooks)[8] ,方便開發(fā)者快速上手嘗試。
安裝和使用:簡(jiǎn)便的安裝過(guò)程和易用的 API 接口
安裝 BigDL-LLM 非常簡(jiǎn)便,只需執(zhí)行如下所示的這一行命令即可。
pip install --pre --upgrade bigdl-llm[all]
△若代碼顯示不全,請(qǐng)左右滑動(dòng)
使用 BigDL-LLM對(duì)大模型進(jìn)行加速也是非常容易的(這里僅用 Transformers 風(fēng)格 API 進(jìn)行舉例)。
使用 BigDL-LLM Transformer 風(fēng)格 API 對(duì)模型加速,只需要改動(dòng)模型加載部分,后續(xù)使用過(guò)程與原生 Transformers 完全一致。
而用 BigDL-LLM API 加載模型的方式與 Transformers API 也幾乎一致——用戶只需要更改 import,在 from_pretrained 參數(shù)中設(shè)置 load_in_4bit=True 即可。
BigDL-LLM 會(huì)在加載模型的過(guò)程中對(duì)模型進(jìn)行 4-bit 低精度量化,并在后續(xù)推理過(guò)程中利用各種軟硬件加速技術(shù)優(yōu)化其執(zhí)行。
#Load Hugging Face Transformers model with INT4 optimizations
from bigdl.llm. transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained('/path/to/model/', load_in_4bit=True)
△若代碼顯示不全,請(qǐng)左右滑動(dòng)
示例:快速實(shí)現(xiàn)一個(gè)基于大語(yǔ)言模型的語(yǔ)音助手應(yīng)用
下文將以 LLM 常見應(yīng)用場(chǎng)景“語(yǔ)音助手”為例,展示采用 BigDL-LLM 快速實(shí)現(xiàn) LLM 應(yīng)用的案例。通常情況下,語(yǔ)音助手應(yīng)用的工作流程分為以下兩個(gè)部分:
△圖 1. 語(yǔ)音助手工作流程示意
- 語(yǔ)音識(shí)別——使用語(yǔ)音識(shí)別模型(本示例采用了 Whisper 模型[9] )將用戶的語(yǔ)音轉(zhuǎn)換為文本;
- 文本生成——將 1 中輸出的文本作為提示語(yǔ) (prompt),使用一個(gè)大語(yǔ)言模型(本示例采用了 Llama2[10] )生成回復(fù)。
以下是本文使用 BigDL-LLM 和 LangChain[11] 來(lái)搭建語(yǔ)音助手應(yīng)用的過(guò)程:
在語(yǔ)音識(shí)別階段:第一步,加載預(yù)處理器 processor 和語(yǔ)音識(shí)別模型 recog_model。本示例中使用的識(shí)別模型 Whisper 是一個(gè) Transformers 模型。
只需使用 BigDL-LLM 中的 AutoModelForSpeechSeq2Seq 并設(shè)置參數(shù) load_in_4bit=True,就能夠以 INT4 精度加載并加速這一模型,從而顯著縮短模型推理用時(shí)。
#processor = WhisperProcessor .from_pretrained(recog_model_path)
recog_model = AutoModelForSpeechSeq2Seq .from_pretrained(recog_model_path, load_in_4bit=True)
△若代碼顯示不全,請(qǐng)左右滑動(dòng)
第二步,進(jìn)行語(yǔ)音識(shí)別。首先使用處理器從輸入語(yǔ)音中提取輸入特征,然后使用識(shí)別模型預(yù)測(cè) token,并再次使用處理器將 token 解碼為自然語(yǔ)言文本。
input_features = processor(frame_data,
sampling_rate=audio.sample_rate,
return_tensor=“pt”).input_features
predicted_ids = recogn_model.generate(input_features, forced_decoder_ids=forced_decoder_ids)
text = processor.batch_decode(predicted_ids, skip_special_tokens=True)[0]
△若代碼顯示不全,請(qǐng)左右滑動(dòng)
在文本生成階段,首先使用 BigDL-LLM 的 TransformersLLM API 創(chuàng)建一個(gè) LangChain 語(yǔ)言模型(TransformersLLM 是在 BigDL-LLM 中定義的語(yǔ)言鏈 LLM 集成)。
您可以使用這個(gè) API 加載任何一個(gè) Hugging Face Transformers 模型。
llm = TransformersLLM . from_model_id(
model_id=llm_model_path,
model_kwargs={"temperature": 0,
"max_length": args.max_length,
"trust_remote_code": True},
)
△若代碼顯示不全,請(qǐng)左右滑動(dòng)
然后,創(chuàng)建一個(gè)正常的對(duì)話鏈 LLMChain,并將已經(jīng)創(chuàng)建的 llm 設(shè)置為輸入?yún)?shù)。
# The following code is complete the same as the use-case
voiceassistant_chain = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
memory=ConversationBufferWindowMemory(k=2),
)
△若代碼顯示不全,請(qǐng)左右滑動(dòng)
這個(gè)鏈條將會(huì)記錄所有的對(duì)話歷史,并將對(duì)話歷史適當(dāng)?shù)馗袷交癁榇笳Z(yǔ)言模型的提示語(yǔ),用于生成回復(fù)。這時(shí)候只需要將識(shí)別模型生成的文本作為 “human_input” 輸入即可,代碼如下:
response_text = voiceassistant_chain .predict(human_input=text,
stop=”\n\n”)
△若代碼顯示不全,請(qǐng)左右滑動(dòng)
最后,將語(yǔ)音識(shí)別和文本生成步驟放入循環(huán)中,即可在多輪對(duì)話中與該“語(yǔ)音助手”交談。您可訪問(wèn)底部 [12] 鏈接,查看完整的示例代碼,并使用自己的電腦進(jìn)行嘗試。快用 BigDL-LLM 來(lái)快速搭建自己的語(yǔ)音助手吧!
作者簡(jiǎn)介
英特爾公司 AI 資深架構(gòu)師黃晟盛,英特爾公司 AI 框架工程師黃凱,英特爾院士、大數(shù)據(jù)技術(shù)全球 CTO、BigDL項(xiàng)目創(chuàng)始人戴金權(quán),都在從事大數(shù)據(jù)和 AI 相關(guān)工作。