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

news2025/1/17 9:03:17

点击蓝字

关注我们,让开发变得更有趣

作者 | 英特尔 AI 软件工程师 杨亦诚

指导 | 英特尔 OpenVINO 布道师 武卓博士

排版 | 李擎

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

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

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

项目仓库地址:

https://github.com/OpenVINO-dev-contest/llama2.openvino

0df7823f42c64ed9b15115d1303b4261.png

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

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

OpenVINO™

51644de6bd6f06d9b79570a18ee326e3.gif

模型导出

第一步,我们需要下载 Llama2  模型,并将其导出为OpenVINO™ 所支持的 IR 格式模型进行部署,这里我们使用 Optimum-Intel 所提供的接口,直接从 Hugging Face 仓库中下载并生成 IR 模型。

ov_model = OVModelForCausalLM.from_pretrained(args.model_id,
                                                  compile=False,
                                                  from_transformers=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 ,前者为模型参数文件,后者为模型结构文件。

c78dc5970b544db8a049505cdd9cc95e.gif

模型部署(方案一)

由于目前 Hugging Face 的 Transformer 以及 Optimum 库都已经支持了 Llama2 系列模型的部署,一种比较简便和快捷的做法是,直接使用 Optimum-Intel 来运行整个 Llama2 pipeline,由于 Optimum 中已经预置了完整的问答类模型 pipeline:  ModelForCausalLM,并进行了深度的集成, 所以我们只需要调用少量接口,并可以轻松调用 OpenVINO™ 推理后端,实现一个简单问答任务的部署。

ov_model = OVModelForCausalLM.from_pretrained(model_path,
                                                  compile=False,
                                                  device=args.device)
ov_model.compile()
generate_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_spaces=False)[0]

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

最终效果如下:

“Response: what is openvino ?

OpenVINO is an open-source software framework for deep learning inference that is designed to run on a variety of platforms, including CPUs, GPUs, and FPGAs. It is developed by the OpenVINO Project, which is a collaboration between Intel and the Linux Foundation.

OpenVINO provides a set of tools and libraries for developers to build, optimize, and deploy deep learning models for inference. It supports popular deep learning frameworks such as TensorFlow, PyTorch, and Caffe, and provides a number of features to improve the performance“

OpenVINO™

211a2939a1a8112e949743401b188c01.gif

模型部署(方案二)

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

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

fdeeb5658fb5289b7585feaf78bfdc9d.png

图:Llama2问答任务流程

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

3045ff529cfb788821d29b62f88542c9.png

图:Llama2模型输入输出原理

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

· input_ids 是向量化后的提示输入

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

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

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

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

· 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,而无需将完整的“提示+预测词”一并送入模型,从而减少一些部分重复的计算量。这样周而复始,将当前的预测词所谓一次迭代的输入,就可以逐步生成所有的答案。

OpenVINO™

1055d2103f8b71f65dca59247352ab9a.gif

聊天机器人

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

ebcd72309d2ad3a10c26163e2769e8b9.png

图:Llama2聊天任务流程

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

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

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

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

def build_inputs(history: list[tuple[str, str]],
                 query: str,
                 system_prompt=DEFAULT_SYSTEM_PROMPT) -> str:
    texts = [f'[INST] <<SYS>>\n{system_prompt}\n<</SYS>>\n\n']
    for user_input, response in history:
        texts.append(
            f'{user_input.strip()} [/INST] {response.strip()} </s><s> [INST] ')
    texts.append(f'{query.strip()} [/INST]')
    return ''.join(texts)

我们采用 streamlit 框架构建构建聊天机器人的 web  UI 和后台处理逻辑,同时希望该聊天机器人可以做到实时交互,实时交互意味着我们不希望聊天机器人在生成完整的文本后再将其输出在可视化界面中,因为这个需要用户等待比较长的时间来获取结果,我们希望在用户在使用过程中可以逐步看到模型所预测的每一个词,并依次呈现。因此需要利用 Hugging Face 的 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 = Thread(target=self.ov_model.generate, kwargs=generate_kwargs)
        t.start()


        # Pull the generated text from the streamer, and update the model output.
        model_output = ""
        for new_text in streamer:
            model_output += new_text
            yield model_output
        return model_output

当完成任务构建后,我们可以通过 streamlit run chat_streamlit.py 命令启动聊天机器,并访问本地地址进行测试。这里选择了几个常用配置参数,方便开发者根据机器人的回答准确性进行调整:

· max_tokens: 生成句子的最大长度。

· top-k: 从置信度对最高的k个答案中随机进行挑选,值越高生成答案的随机性也越高。

· top-p: 从概率加起来为p的答案中随机进行挑选, 值越高生成答案的随机性也越高,一般情况下,top-p会在top-k之后使用。

· Temperature: 从生成模型中抽样包含随机性, 高温意味着更多的随机性,这可以帮助模型给出更有创意的输出。如果模型开始偏离主题或给出无意义的输出,则表明温度过高。

2e6aa3cd8e93175cdee4c64d6e4d3297.png

注3:由于Llama2模型比较大,首次硬件加载和编译的时间会相对比较久

OpenVINO™

4a37bf54daa5c6974983c05ede868c03.gif

总结

作为当前最火爆的开源大语言模型,Llama2 凭借在各大基准测试中出色的成绩,以及支持微调等特性被越来越多开发者所认可和使用。利用 Optimum-Intel 和 OpenVINO™ 构建 Llama2 系列任务可以进一步提升其模型在英特尔平台上的性能,并降低部署门槛。

参考资料

1.Optimum-Intel: 

https://github.com/huggingface/optimum-intel

2.Optimum:

https://huggingface.co/docs/optimum

3.GPT2 notebook samples: https://github.com/openvinotoolkit/openvino_notebooks/tree/dd77a4c47312fdfdc2e43e27aa488e2802733760/notebooks/223-text-prediction

4.Llama2 Hugging Face: 

https://huggingface.co/meta-llama/Llama-2-7b-chat-hf

OpenVINO™

--END--

你也许想了解(点击蓝字查看)⬇️➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型➡️ 开发者实战系列资源包来啦!➡️ 以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️ 还不知道如何用OpenVINO™作画?点击了解教程。➡️ 几行代码轻松实现对于PaddleOCR的实时推理,快来get!➡️ 使用OpenVINO 在“端—边—云”快速实现高性能人工智能推理➡️ 图片提取文字很神奇?试试三步实现OCR!➡️【Notebook系列第六期】基于Pytorch预训练模型,实现语义分割任务➡️使用OpenVINO™ 预处理API进一步提升YOLOv5推理性能
扫描下方二维码立即体验 
OpenVINO™ 工具套件 2023.0

点击 阅读原文 立即体验OpenVINO 2023.0

c38d3a9b600cf2a6dcba9a5cbada8d89.png

文章这么精彩,你有没有“在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloudAlibaba之Nacos服务的发现与注册中心(一)

一&#xff1a;搭建nacos服务 在windows上搭建&#xff1a; 下载nacos &#xff0c;我在本地下载的是2.1.0 Releases alibaba/nacos (github.com)https://github.com/alibaba/Nacos/releases SpringCloudAlibaba &#xff0c;SpringCoud及Spring Boot之间版本的对应关系在以…

大麦订单生成器 大麦一键生成订单截图

后台一键生成链接&#xff0c;独立后台管理 教程&#xff1a;修改数据库config/Conn 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

ACID特性、CAP理论、BASE原则详解

一、ACID 事务&#xff08;transaction&#xff09;&#xff1a;用户定义的一系列执行SQL的操作&#xff0c;这些操作要么完全执行&#xff0c;要么都不执行。 关系型数据库中的事务具有ACID特性 原子性(Atomicity)一致性&#xff08;Consistency&#xff09;隔离性&#xf…

红外NEC通信协议

一、NEC简介 红外(Infrared&#xff0c;IR)遥控是一种无线、非接触控制技术&#xff0c;常用于遥控器、无线键盘、鼠标等设备之间的通信。IR协议的工作原理是&#xff0c;发送方通过红外线发送一个特定的编码&#xff0c;接收方通过识别该编码来执行相应的操作。 IR协议是指红外…

JDK, JRE和JVM之间的区别和联系

JDK, JRE和JVM是与Java编程语言相关的三个重要的概念&#xff0c;它们分别代表Java Development Kit&#xff08;Java开发工具包&#xff09;、Java Runtime Environment&#xff08;Java运行时环境&#xff09;和Java虚拟机&#xff08;Java Virtual Machine&#xff09;。它们…

PHP8的运算符-PHP8知识详解

运算符是可以通过给出的一或多个值&#xff08;用编程行话来说&#xff0c;表达式&#xff09;来产生另一个值&#xff08;因而整个结构成为一个表达式&#xff09;的东西。 PHP8的运算符有很多&#xff0c;按类型分有一元运算符、二元运算符、三元运算符。 一元运算符只对一…

Java类与对象详解(2)

this引用 为什么要有this引用 先来看一个日期类的例子&#xff1a; ​ public class Date {public int year;public int month;public int day;//设置日期方法public void setDay(int y, int m, int d){//这里隐藏了一个Date this参数year y;month m;day d;}public void …

广州银行信用卡中心:强化数字引擎安全,实现业务稳步增长

广州银行信用卡中心是全国城商行中仅有的两家信用卡专营机构之一&#xff0c;拥有从金融产品研发至销售及后期风险控制、客户服务完整业务链条&#xff0c;曾获“2016年度最佳创新信用卡银行”。 数字引擎驱动业务增长 安全左移降低开发风险 近年来&#xff0c;广州银行信用卡…

fetch的使用和实现跨域及与axios的区别

一、作用 和axios作用类似&#xff0c;用于请求接口。它是XMLHttpRequest的一种替代方案。 二、安装 因为fetch有兼容性问题&#xff0c;所以我们安装升级版 whatwg-fetch cnpm i whatwg-fetch -S 三、使用 四、fetch和axios的区别 1&#xff0c;fetch返回的是一个未处理…

华为OD机试真题 Java 实现【TLV格式】【2023 B卷 200分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

聚焦 TimescaleDB VS TDengine 性能对比报告,IoT 场景下全面分析写入与查询

基于第三方基准性能测试平台 TSBS&#xff08;Time Series Benchmark Suite&#xff09; 标准数据集&#xff0c;TDengine 团队在 TSBS 的 IoT 场景中&#xff0c;预设了五种规模的卡车车队基础数据集&#xff0c;在相同的 AWS 云环境下对时序数据库&#xff08;Time Series Da…

【NLP概念源和流】 01-稀疏文档表示(第 1/20 部分)

一、介绍 自然语言处理(NLP)是计算方法的应用,不仅可以从文本中提取信息,还可以在其上对不同的应用程序进行建模。所有基于语言的文本都有系统的结构或规则,通常被称为形态学,例如“跳跃”的过去时总是“跳跃”。对于人类来说,这种形态学的理解是显而易见的。 在这篇介…

【FAQ】在Linux中使用curl访问EasyCVR,返回报错Unauthorized的原因排查

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;比如&#xff1a;视…

【C++刷题】经典简单题第一辑

数字在升序数组中出现的次数 class Solution { public:int GetNumberOfK(vector<int>& nums, int k){size_t left 0;size_t right nums.size();size_t mid1 -1;/** 用二分法的思想寻找 k 的边界*/// 寻找 k 的左边界下标while(left < right){mid1 left (ri…

yolov3-spp 训练结果分析:网络结果可解释性、漏检误检分析

1. valid漏检误检分析 ①为了探查第二层反向找出来的目标特征在最后一层detector上的意义&#xff01;——为什么最后依然可以框出来目标&#xff0c;且mAP还不错的&#xff1f; ②如何进一步提升和改进这个数据的效果&#xff1f;可以有哪些优化数据和改进的地方&#xff1f;让…

5分钟学会你创建搜狗百科

搜狗百科属于微信生态里的平台&#xff0c;搜狗百科不仅在搜狗搜索中展示&#xff0c;且可以在微信搜索中展示。那么搜狗百科该怎么创建呢&#xff1f;下面小马识途营销顾问分享下搜狗百科词条创建的流程。 1、要创建搜狗百科词条&#xff0c;首先需要在搜狗百科官网上注册一个…

【前端入门之旅】HTML中元素和标签有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 标签&#xff08;Tag&#xff09;⭐元素&#xff08;Element&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

实例028 为触摸屏程序添加虚拟键盘

实例说明 由于触摸屏没有键盘&#xff0c;只能利用屏幕操作。如果要输入数据或查找数据&#xff0c;需要制作一个虚拟键盘&#xff0c;以方便用户输入。本例介绍如何实现虚拟键盘的程序设计。运行本例&#xff0c;效果如图1.28所示。 技术要点 本例中用到了Lable控件的透明属…

【HarmonyOS】性能优化之低代码开发加载多张轮播图

【关键字】 HarmonyOS、低代码开发、Swiper组件、性能优化、分页加载 写在前面 目前使用DevEco Studio的低代码工具开发元服务时&#xff0c;通过实际测试发现&#xff0c;Swiper组件加载多张轮播图时加载显示耗时较长&#xff08;实际测试网络状态一般的情况下显示耗时达到8…

好的CRM有哪些优点及功能?

市面上有很多CRM品牌&#xff0c;很多初次选型的企业没有深入的了解&#xff0c;不知道如何选择适合自己的CRM软件。小编认为&#xff0c;CRM选型无非就是靠谱和适合。这里有一款值得信赖的CRM软件推荐——Zoho CRM。 一、什么是Zoho CRM&#xff1f; Zoho CRM是一款SaaS云端…