跳转到主要内容
博客

如何使用 DialoGPT 和 PyTorch 构建交互式聊天生成模型

作者: 2023年10月3日2024年11月16日暂无评论

在过去几个月里,人们对交互式聊天生成(或对话响应生成)模型的关注度大大增加。ChatGPT 和 Google Bard 等对话响应生成模型席卷了人工智能领域。交互式聊天生成的目的是回答人类提出的各种问题,这些基于人工智能的模型利用自然语言处理 (NLP) 生成几乎与人类生成的对话无异的对话。

本文展示了一个代码示例,说明了如何基于 Hugging Face 的预训练 DialoGPT 模型创建交互式聊天,并增加了Intel® Extension for PyTorch 以对模型执行动态量化。

入门

为何选择 DialoGPT?

DialoGPT(成式训练换器)是一个大规模的预训练对话响应生成模型,它通过从 Reddit 评论链和讨论串中提取的 1.47 亿个类似对话的交流进行训练。DialoGPT 由微软于 2019 年提出。其主要目标是创建能够针对各种对话主题生成自然响应的开放域聊天机器人。利用 DialoGPT 的对话响应生成系统能够生成更适用、更丰富、更多样化和更具上下文特异性的回复。

DialoGPT 架构

DialoGPT 架构基于 GPT-2 模型。它被表述为自回归语言模型,并使用多层 Transformer 作为模型架构。GPT-2 由 OpenAI 提出。GPT-2 模型在通用文本数据上进行训练,而 DialoGPT 在 Reddit 讨论串上进行训练。

让我们看看 GPT-2 架构。通用 Transformer 架构中有两种类型的块:

  • 编码器 – 包含自注意力层和前馈神经网络
  • 解码器 – 类似于编码器,但自注意力层被掩码

自注意力层允许一个位置查看当前单词右侧的标记(文本中的后续单词),而掩码自注意力层则阻止这种情况发生。

self-attention layer vs masked self-attention layer

GPT-2 是使用 Transformer 解码器块构建的。这意味着在架构中使用了以下层:

  1. 嵌入层 – 负责将输入文本转换为嵌入(每个单词转换为固定长度的向量表示)
  2. Transformer 解码器 – 包含多个带有掩码自注意力和前馈神经网络层的解码器块
  3. 输出层 – 负责将从解码器获得的嵌入转换为单词

GPT-2 架构(和 DialoGPT 架构)如下图所示。

GPT-2 architecture

由于该模型基于 Transformer 架构,它存在重复和复制输入的问题。为了避免重复,我们可以使用 Top-K 采样和 Top-p 采样。

  • Top-K 采样 – 过滤出 K 个最有可能的下一个词,并将概率质量重新分配到这 K 个词中。
  • Top-p 采样 – 不仅选择最有可能的 K 个词,还选择累积概率超过概率 p 的最小可能词集。

然后,概率质量在集合中的词之间重新分配。因此,词集的大小可以根据下一个词的概率分布动态地增加和减少。

使用 Intel® Extension for PyTorch 进行量化

什么是量化?

量化是指系统地降低模型中所有或某些层的精度。这意味着将高精度类型(例如深度学习中主要使用的单精度浮点 (FP32))转换为低精度类型(例如 FP16 (16 位) 或 INT8 (8 位))。

这有助于实现:

  • 更低的内存带宽
  • 更小的存储空间
  • 在精度损失最小或没有损失的情况下实现更高的性能

量化对于基于 Transformer 架构(如 BERT 或 GPT)的大型模型尤为重要。

量化有两种类型:

  • 静态量化 – 静态量化对模型的权重和激活进行量化。当内存带宽和计算节省都很重要时,使用这种量化。
  • 动态量化 – 在动态量化中,权重提前量化,但激活在推理过程中动态量化。

Intel Extension for PyTorch: Intel 扩展为 PyTorch 提供了最新的特性和优化,以在英特尔® 硬件上实现额外的性能提升。了解如何单独安装它,或将其作为 Intel® AI Analytics Toolkit 的一部分获取。

该扩展可以作为 Python* 模块加载,也可以作为 C++ 库链接。Python 用户可以通过导入 intel_extension_for_pytorch 动态启用它。

  • CPU 教程提供了有关适用于 Intel CPU 的 Intel Extension for PyTorch 的详细信息。源代码可在master 分支中获取。
  • GPU 教程提供了有关适用于 Intel GPU 的 Intel Extension for PyTorch 的详细信息。源代码可在xpu-master 分支中获取。

如何使用 Intel Extension for PyTorch 执行动态量化?

以下是使用动态量化将现有 FP32 模型量化为 INT8 模型的步骤:

  1. 准备量化配置 – 我们可以使用带有 ipex.quantization.default_dynamic_qconfig 的默认动态量化配置。
  2. 使用 ipex.quantization.prepare 方法准备 FP32 模型(提供输入参数,例如要量化的 FP32 模型、准备好的配置、示例输入以及量化是否应在原地进行的信息)。
  3. 将模型从 FP32 转换为 INT8 – 使用 ipex.quantization.convert 方法进行转换。输入模型将是步骤 2 中准备好的模型。

我们还鼓励您查看 Intel® Neural Compressor 工具,该工具可自动实现量化、剪枝和知识蒸馏等流行的模型压缩技术,适用于多个深度学习框架

代码示例

以下步骤在代码示例中实现:

  1. 加载模型和分词器:在此步骤中使用了Transformers 库(查看Intel® Extension for Transformers)和Hugging Face 主类中可用的自动类。这些允许我们通过给定名称自动找到相关模型。它还允许开发人员轻松更改模型,而无需对代码进行重大更改,如下所示:
tokenizer = AutoTokenizer.from_pretrained(model)
model = AutoModelForCausalLM.from_pretrained(model)

模型参数被指定为分词器的输入,模型初始化只是预训练 DialoGPT 模型的路径。在此示例中,我们使用“microsoft/DialoGPT-large”。如果您资源有限,可以使用“microsoft/DialoGPT-medium”或“microsoft/DialoGPT-small”模型并获得可比较的结果。

  1. 对模型进行动态量化
    1. 使用 Intel Extension for PyTorch 库中的默认动态量化配置创建配置。
    2. 准备模型。
    3. 将模型从 FP32 转换为 INT8。
      上述部分详细解释了这些步骤。
  2. 响应生成:响应生成的第一步是对输入句子进行编码,如下图代码所示:
new_input_ids = tokenizer.encode(input(">> You:") + tokenizer.eos_token, return_tensors='pt')

在此示例中,我们希望模型保存历史记录,因此我们将输入句子以令牌的形式添加到聊天历史记录中。

bot_input_ids = torch.cat([chat_history_ids, new_input_ids], dim=-1) if chat_round > 0 else new_input_ids

文本生成可以通过 `model.generate` 函数完成,我们可以在其中指定所有重要参数,如保存的聊天历史记录、响应的令牌长度以及 Top-K 和 Top-p 采样的使用。

chat_history_ids = model.generate(bot_input_ids, do_sample=True, max_length=2000, top_k=50, top_p=0.95, pad_token_id=tokenizer.eos_token_id) 

最后一步是解码并打印响应

  1. 互动对话准备:响应生成之后,最后一步是添加互动。这可以通过使用简单的 for 循环来完成。基于初始化的分词器、模型和空聊天历史记录,可以生成多轮响应。
for chat_round in range(n):
chat_history_ids = generate_response(
tokenizer,
model,
chat_round,
chat_history_ids
)

互动聊天生成的一个例子将如下图所示。

An example of interactive chat generation

下一步是什么?

开始使用 Intel Extension for PyTorch 和 DialoGPT 构建交互式聊天生成模型。立即下载并试用 Intel AI Analytics ToolkitIntel Extension for PyTorch,亲身体验构建各种端到端 AI 应用程序。

我们鼓励您查看并整合英特尔的其他AI/ML 框架优化端到端工具组合到您的 AI 工作流程中,并了解统一的、开放的、基于标准的oneAPI 编程模型,该模型构成了英特尔AI 软件产品组合的基础,可帮助您准备、构建、部署和扩展您的 AI 解决方案。

有关全新第四代英特尔® 至强® 可扩展处理器的更多详细信息,请访问英特尔人工智能解决方案平台门户,您可以在其中了解英特尔如何助力开发者在这些强大的 CPU 上运行端到端人工智能管道。

有用资源

探索更多人工智能代码示例

查看所有代码示例