基于Llama2和OpenVIN打造聊天機(jī)器人_第1頁(yè)
基于Llama2和OpenVIN打造聊天機(jī)器人_第2頁(yè)
基于Llama2和OpenVIN打造聊天機(jī)器人_第3頁(yè)
基于Llama2和OpenVIN打造聊天機(jī)器人_第4頁(yè)
基于Llama2和OpenVIN打造聊天機(jī)器人_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第第頁(yè)基于Llama2和OpenVIN打造聊天機(jī)器人

|(英特爾)(AI)軟件(工程師)楊亦誠(chéng)

指導(dǎo)|

英特爾

OpenVINO

布道師武卓博士

排版|

李擎

基于Llama2和OpenVINO打造聊天(機(jī)器人)

Llama2是Meta發(fā)布了其(最新)的大型語(yǔ)言模型,Llama2是基于Transf(or)mer的人工(神經(jīng)網(wǎng)絡(luò)),以一系列單詞作為輸入,遞歸地預(yù)測(cè)下一個(gè)單詞來(lái)生成文本。

這是一款開(kāi)源且免費(fèi)的(人工智能)模型。此前,由于開(kāi)源協(xié)議問(wèn)題,Llama1雖然功能強(qiáng)大,但并不可免費(fèi)商用。然而,這一次Meta終于推出了免費(fèi)商用版本Llama2,借這一機(jī)會(huì),我們分享一下如何基于Llama2和OpenVINO工具套件來(lái)打造一款聊天機(jī)器人。

注1:由于Llama2對(duì)在模型轉(zhuǎn)換和運(yùn)行過(guò)程中對(duì)內(nèi)存的占用較高,(推薦)使用支持128Gb以上內(nèi)存的的服務(wù)器終端作為測(cè)試平臺(tái)。

注2:本文僅分享部署Llama2原始預(yù)訓(xùn)練模型的方法,如需獲得自定義知識(shí)的能力,需要對(duì)原始模型進(jìn)行Fine-tune;如需獲得更好的推理性能,可以使用量化后的模型版本。

模型導(dǎo)出

第一步,我們需要(下載)Llama2

模型,并將其導(dǎo)出為OpenVINO所支持的IR格式模型進(jìn)行部署,這里我們使用Op(ti)mum-(Intel)所提供的(接口),直接從HuggingFace倉(cāng)庫(kù)中下載并生成IR模型。

ov_model=OVModelForCausalLM.from_pretrained(args.model_id,com(pi)le=False,from_transforme(rs)=True)

ov_model.save_pretrained(model_path)

不過(guò)在這之前,我們首先需要向Meta申請(qǐng)模型下載的許可,方可開(kāi)始下載,具體如何發(fā)送申請(qǐng)可以參考Llama2倉(cāng)庫(kù)中的說(shuō)明和引導(dǎo):https://huggingface.co/meta-llama/Llama-2-7b-hf

在運(yùn)行項(xiàng)目倉(cāng)庫(kù)中的export_ir.py腳本后,會(huì)在本地指定路徑中生成openvino_model.bin和openvino_model.xml,前者為模型參數(shù)文件,后者為模型結(jié)構(gòu)文件。

模型部署(方案一)

由于目前HuggingFace的Transformer以及Optimum庫(kù)都已經(jīng)支持了Llama2系列模型的部署,一種比較簡(jiǎn)便和快捷的做法是,直接使用Optimum-Intel來(lái)運(yùn)行整個(gè)Llama2pipeline,由于Optimum中已經(jīng)預(yù)置了完整的(問(wèn)答)類模型pipeline:

ModelForCausalLM,并進(jìn)行了深度的集成,所以我們只需要調(diào)用少量接口,并可以輕松調(diào)用OpenVINO推理后端,實(shí)現(xiàn)一個(gè)簡(jiǎn)單問(wèn)答任務(wù)的部署。

ov_model=OVModelForCausalLM.from_pretrained(model_path,compile=False,device=args.device)ov_pile()genera(te)_ids=ov_model.generate(inputs.input_ids,max_length=args.max_sequence_length)output_text=tokenizer.batch_decode(generate_ids,skip_special_tokens=True,

clean_up_tokenization_sp(ac)es=False)[0]

這里再簡(jiǎn)單介紹下什么是Optimum。Optimum庫(kù)是HuggingFace為了方便(開(kāi)發(fā)者)在不同的(硬件)平臺(tái)部署來(lái)自Transformer和Diffuser庫(kù)的模型,所打造的部署工具,其中的Optimum-Intel庫(kù)則支持在Intel平臺(tái)部署模型時(shí),調(diào)用OpenVINO工具套件作為模型的推理后端,提升任務(wù)性能。

最終效果如下:

“Response:whatisopenvino?

OpenVINOisanopen-sourcesoftwareframeworkfordeeplearninginferencethatisdesignedtorunonavarietyofplatforms,including(CPU)s,(GPU)s,and(FPGA)s.ItisdevelopedbytheOpenVINOProject,whichisacollaborationbetweenIntelandthe(Linux)Foundation.

OpenVINOprovidesasetoftoolsandlibrariesfordeveloperstobuild,optimize,anddeploydeeplearningmodelsforinference.Itsupportspopulardeeplearningframeworkssuchas(TensorFlow),PyTorch,andCaffe,andprovidesanumberoffeaturestoimprovethepe(rf)ormance“

模型部署(方案二)

由于Optimum仍屬于“黑箱”模式,開(kāi)發(fā)者無(wú)法充分自定義內(nèi)在的運(yùn)行邏輯,所以這里使用的第二種方式則是在脫離Optimum庫(kù)的情況,僅用OpenVINO的原生接口部署Llama2模型,并重構(gòu)pipeline。

整個(gè)重構(gòu)后pipeline如下圖所示,Prompt提示會(huì)送入Tokenizer進(jìn)行分詞和詞向量編碼,然后有OpenVINO推理獲得結(jié)果(藍(lán)色部分),來(lái)到后處理部分,我們會(huì)把推理結(jié)果進(jìn)行進(jìn)一步的采樣和解碼,最后生成常規(guī)的文本信息。這里為了簡(jiǎn)化流程,僅使用了Top-K作為篩選方法。

圖:Llama2問(wèn)答任務(wù)流程

整個(gè)pipeline的大部分代碼都可以套用文本生成任務(wù)的常規(guī)流程,其中比較復(fù)雜一些的是OpenVINO推理部分的工作,由于Llama2文本生成任務(wù)需要完成多次遞歸迭代,并且每次迭代會(huì)存在cache緩存,因此我們需要為不同的迭代輪次分別準(zhǔn)備合適的輸入數(shù)據(jù)。接下來(lái)我們?cè)敿?xì)解構(gòu)一下模型的運(yùn)行邏輯:

圖:Llama2模型輸入輸出原理

Llama2模型的輸入主要由三部分組成:

·input_ids

是向量化后的提示輸入

·attention_mask

用來(lái)描述輸入數(shù)據(jù)的長(zhǎng)度,input_ids需要被計(jì)算的數(shù)據(jù)所在對(duì)應(yīng)位置的attention_mask值用1表示,需要在計(jì)算時(shí)被丟棄數(shù)據(jù)用0表示

·past_key_values.x

是由一連串?dāng)?shù)據(jù)構(gòu)成的集合,用來(lái)保存每次迭代過(guò)程中可以被共享的cache.

Llama2模型的輸出則由兩部分組成:

·Logits為模型對(duì)于下一個(gè)詞的預(yù)測(cè),或者叫nexttoken

·present.x則可以被看作cache,直接作為下一次迭代的past_key_values.x值

整個(gè)pipeline在運(yùn)行時(shí)會(huì)對(duì)Llama2模型進(jìn)行多次迭代,每次迭代會(huì)遞歸生成對(duì)答案中下一個(gè)詞的預(yù)測(cè),直到最終答案長(zhǎng)度超過(guò)預(yù)設(shè)值max_sequence_length,或者預(yù)測(cè)的下一個(gè)詞為終止符eos_token_id。

·第一次迭代

如圖所示在一次迭代時(shí)(N=1)input_ids為提示語(yǔ)句,此時(shí)我們還需要利用Tokenizer分詞器將原始文本轉(zhuǎn)化為輸入向量,而由于此時(shí)無(wú)法利用cache進(jìn)行加速,past_key_values.x系列向量均為空值。

·第N次迭代

當(dāng)?shù)谝淮蔚瓿珊?,?huì)輸出對(duì)于答案中第一個(gè)詞的預(yù)測(cè)Logits,以及cache數(shù)據(jù),我們可以將這個(gè)Logits作為下一次迭代的input_ids再輸入到模型中進(jìn)行下一次推理(N=2),此時(shí)我們可以利用到上次迭代中的cache數(shù)據(jù)也就是present.x,而無(wú)需將完整的“提示+預(yù)測(cè)詞”一并送入模型,從而減少一些部分重復(fù)的計(jì)算量。這樣周而復(fù)始,將當(dāng)前的預(yù)測(cè)詞所謂一次迭代的輸入,就可以逐步生成所有的答案。

聊天機(jī)器人

除了Llama2基礎(chǔ)版本,Meta還發(fā)布了LLaMA-2-chat,使用來(lái)自人類反饋的強(qiáng)化學(xué)習(xí)來(lái)確保安全性和幫助性,專門用于構(gòu)建聊天機(jī)器人。相較于問(wèn)答模型模式中一問(wèn)一答的形式,聊天模式則需要構(gòu)建更為完整的對(duì)話,此時(shí)模型在生成答案的過(guò)程中還需要考慮到之前對(duì)話中的信息,并將其作為cache數(shù)據(jù)往返于每次迭代過(guò)程中,因此這里我們需要額外設(shè)計(jì)一個(gè)模板,用于構(gòu)建每一次的輸入數(shù)據(jù),讓模型能夠給更充分理解哪些是歷史對(duì)話,哪些是新的對(duì)話問(wèn)題。

圖:Llama2聊天任務(wù)流程

這里的text模板是由“引導(dǎo)詞+歷史記錄+當(dāng)前問(wèn)題(提示)”三部分構(gòu)成:

·引導(dǎo)詞:描述當(dāng)前的任務(wù),引導(dǎo)模型做出合適的反饋

·歷史記錄:記錄聊天的歷史數(shù)據(jù),包含每一組問(wèn)題和答案

·當(dāng)前問(wèn)題:類似問(wèn)答模式中的問(wèn)題

defbuild_inputs(history:list[tuple[str,str]],query:str,system_prompt=DEFAULT_SYSTEM_PROMPT)->str:texts=[f'[INST]>{system_prompt}>']foruser_input,responseinhistory:texts.append(f'{user_input.strip()}[/INST]{response.strip()}[INST]')texts.append(f'{query.strip()}[/INST]')

return

''.join(texts)

我們采用streamlit框架構(gòu)建構(gòu)建聊天機(jī)器人的web

UI和后臺(tái)處理邏輯,同時(shí)希望該聊天機(jī)器人可以做到實(shí)時(shí)交互,實(shí)時(shí)交互意味著我們不希望聊天機(jī)器人在生成完整的文本后再將其輸出在可視化界面中,因?yàn)檫@個(gè)需要用戶等待比較長(zhǎng)的時(shí)間來(lái)獲取結(jié)果,我們希望在用戶在使用過(guò)程中可以逐步看到模型所預(yù)測(cè)的每一個(gè)詞,并依次呈現(xiàn)。因此需要利用HuggingFace的TextIteratorStreamer組件,基于其構(gòu)建一個(gè)流式的數(shù)據(jù)處理pipeline,此處的streamer為一個(gè)可以被迭代的對(duì)象,我可以依次獲取模型迭代過(guò)程中每一次的預(yù)測(cè)結(jié)果,并將其依次添加到最終答案中,并逐步呈現(xiàn)。

streamer=TextIteratorStreamer(self.tokenizer,skip_prompt=True,skip_special_tokens=True)generate_kwargs=dict(model_inputs,streamer=streamer,max_new_tokens=max_generated_tokens,do_sample=True,top_p=top_p,temperature=float(temperature),top_k=top_k,eos_token_id=self.tokenizer.eos_token_id)t=Thre(ad)(target=self.ov_model.generate,kwargs=generate_kwargs)t.start()#Pullthegeneratedtextfromthestreamer,andupdatethemodeloutput.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論