




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年建筑節(jié)能改造工程材料供應(yīng)與技術(shù)服務(wù)合同
- 2025年直播電商合作聯(lián)盟主播招募及分成執(zhí)行合同
- 2025年度大型活動(dòng)場(chǎng)地租賃及全面安全與網(wǎng)絡(luò)安全保障合同
- 2025年度綠色建筑產(chǎn)業(yè)園區(qū)建設(shè)技術(shù)研發(fā)與施工合同
- 2025公務(wù)員北京考試題及答案
- 人事基礎(chǔ)培訓(xùn)課件
- 一例賁門癌化療后Ⅳ度骨髓抑制的個(gè)體化護(hù)理查房
- 2025年度大型連鎖餐飲特色食材集中采購(gòu)合同
- 2025年化工原料運(yùn)輸安全責(zé)任合作協(xié)議
- 2025年智能電網(wǎng)基站天線租賃及信號(hào)優(yōu)化升級(jí)服務(wù)協(xié)議
- 金安橋水電站樞紐布置及主要技術(shù)問(wèn)題
- 鄭州城市職業(yè)學(xué)院輔導(dǎo)員考試題庫(kù)
- 2022公務(wù)員錄用體檢操作手冊(cè)(試行)
- 新課標(biāo)的變化與思想政治課的教學(xué)課件
- 動(dòng)物檢疫檢驗(yàn)考試題庫(kù)(含答案)
- 端子鉚壓標(biāo)準(zhǔn)規(guī)范
- 非法社會(huì)組織排查表
- 關(guān)于設(shè)置老年病醫(yī)院(醫(yī)療機(jī)構(gòu))的可行性報(bào)告
- 2023年隆回縣體育教師招聘筆試模擬試題及答案
- GB/T 30146-2013公共安全業(yè)務(wù)連續(xù)性管理體系要求
- GCP培訓(xùn)教學(xué)講解課件
評(píng)論
0/150
提交評(píng)論