基于Llama2和OpenVIN打造聊天机器人_第1页
基于Llama2和OpenVIN打造聊天机器人_第2页
基于Llama2和OpenVIN打造聊天机器人_第3页
基于Llama2和OpenVIN打造聊天机器人_第4页
基于Llama2和OpenVIN打造聊天机器人_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页基于Llama2和OpenVIN打造聊天机器人

|(英特尔)(AI)软件(工程师)杨亦诚

指导|

英特尔

OpenVINO

布道师武卓博士

排版|

李擎

基于Llama2和OpenVINO打造聊天(机器人)

Llama2是Meta发布了其(最新)的大型语言模型,Llama2是基于Transf(or)mer的人工(神经网络),以一系列单词作为输入,递归地预测下一个单词来生成文本。

这是一款开源且免费的(人工智能)模型。此前,由于开源协议问题,Llama1虽然功能强大,但并不可免费商用。然而,这一次Meta终于推出了免费商用版本Llama2,借这一机会,我们分享一下如何基于Llama2和OpenVINO工具套件来打造一款聊天机器人。

注1:由于Llama2对在模型转换和运行过程中对内存的占用较高,(推荐)使用支持128Gb以上内存的的服务器终端作为测试平台。

注2:本文仅分享部署Llama2原始预训练模型的方法,如需获得自定义知识的能力,需要对原始模型进行Fine-tune;如需获得更好的推理性能,可以使用量化后的模型版本。

模型导出

第一步,我们需要(下载)Llama2

模型,并将其导出为OpenVINO所支持的IR格式模型进行部署,这里我们使用Op(ti)mum-(Intel)所提供的(接口),直接从HuggingFace仓库中下载并生成IR模型。

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

ov_model.save_pretrained(model_path)

不过在这之前,我们首先需要向Meta申请模型下载的许可,方可开始下载,具体如何发送申请可以参考Llama2仓库中的说明和引导:https://huggingface.co/meta-llama/Llama-2-7b-hf

在运行项目仓库中的export_ir.py脚本后,会在本地指定路径中生成openvino_model.bin和openvino_model.xml,前者为模型参数文件,后者为模型结构文件。

模型部署(方案一)

由于目前HuggingFace的Transformer以及Optimum库都已经支持了Llama2系列模型的部署,一种比较简便和快捷的做法是,直接使用Optimum-Intel来运行整个Llama2pipeline,由于Optimum中已经预置了完整的(问答)类模型pipeline:

ModelForCausalLM,并进行了深度的集成,所以我们只需要调用少量接口,并可以轻松调用OpenVINO推理后端,实现一个简单问答任务的部署。

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]

这里再简单介绍下什么是Optimum。Optimum库是HuggingFace为了方便(开发者)在不同的(硬件)平台部署来自Transformer和Diffuser库的模型,所打造的部署工具,其中的Optimum-Intel库则支持在Intel平台部署模型时,调用OpenVINO工具套件作为模型的推理后端,提升任务性能。

最终效果如下:

“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仍属于“黑箱”模式,开发者无法充分自定义内在的运行逻辑,所以这里使用的第二种方式则是在脱离Optimum库的情况,仅用OpenVINO的原生接口部署Llama2模型,并重构pipeline。

整个重构后pipeline如下图所示,Prompt提示会送入Tokenizer进行分词和词向量编码,然后有OpenVINO推理获得结果(蓝色部分),来到后处理部分,我们会把推理结果进行进一步的采样和解码,最后生成常规的文本信息。这里为了简化流程,仅使用了Top-K作为筛选方法。

图:Llama2问答任务流程

整个pipeline的大部分代码都可以套用文本生成任务的常规流程,其中比较复杂一些的是OpenVINO推理部分的工作,由于Llama2文本生成任务需要完成多次递归迭代,并且每次迭代会存在cache缓存,因此我们需要为不同的迭代轮次分别准备合适的输入数据。接下来我们详细解构一下模型的运行逻辑:

图:Llama2模型输入输出原理

Llama2模型的输入主要由三部分组成:

·input_ids

是向量化后的提示输入

·attention_mask

用来描述输入数据的长度,input_ids需要被计算的数据所在对应位置的attention_mask值用1表示,需要在计算时被丢弃数据用0表示

·past_key_values.x

是由一连串数据构成的集合,用来保存每次迭代过程中可以被共享的cache.

Llama2模型的输出则由两部分组成:

·Logits为模型对于下一个词的预测,或者叫nexttoken

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

整个pipeline在运行时会对Llama2模型进行多次迭代,每次迭代会递归生成对答案中下一个词的预测,直到最终答案长度超过预设值max_sequence_length,或者预测的下一个词为终止符eos_token_id。

·第一次迭代

如图所示在一次迭代时(N=1)input_ids为提示语句,此时我们还需要利用Tokenizer分词器将原始文本转化为输入向量,而由于此时无法利用cache进行加速,past_key_values.x系列向量均为空值。

·第N次迭代

当第一次迭代完成后,会输出对于答案中第一个词的预测Logits,以及cache数据,我们可以将这个Logits作为下一次迭代的input_ids再输入到模型中进行下一次推理(N=2),此时我们可以利用到上次迭代中的cache数据也就是present.x,而无需将完整的“提示+预测词”一并送入模型,从而减少一些部分重复的计算量。这样周而复始,将当前的预测词所谓一次迭代的输入,就可以逐步生成所有的答案。

聊天机器人

除了Llama2基础版本,Meta还发布了LLaMA-2-chat,使用来自人类反馈的强化学习来确保安全性和帮助性,专门用于构建聊天机器人。相较于问答模型模式中一问一答的形式,聊天模式则需要构建更为完整的对话,此时模型在生成答案的过程中还需要考虑到之前对话中的信息,并将其作为cache数据往返于每次迭代过程中,因此这里我们需要额外设计一个模板,用于构建每一次的输入数据,让模型能够给更充分理解哪些是历史对话,哪些是新的对话问题。

图:Llama2聊天任务流程

这里的text模板是由“引导词+历史记录+当前问题(提示)”三部分构成:

·引导词:描述当前的任务,引导模型做出合适的反馈

·历史记录:记录聊天的历史数据,包含每一组问题和答案

·当前问题:类似问答模式中的问题

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框架构建构建聊天机器人的web

UI和后台处理逻辑,同时希望该聊天机器人可以做到实时交互,实时交互意味着我们不希望聊天机器人在生成完整的文本后再将其输出在可视化界面中,因为这个需要用户等待比较长的时间来获取结果,我们希望在用户在使用过程中可以逐步看到模型所预测的每一个词,并依次呈现。因此需要利用HuggingFace的TextIteratorStreamer组件,基于其构建一个流式的数据处理pipeline,此处的streamer为一个可以被迭代的对象,我可以依次获取模型迭代过程中每一次的预测结果,并将其依次添加到最终答案中,并逐步呈现。

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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论