由英特尔提供

在过去几个月里,对交互式聊天生成(或对话式响应生成)模型的关注大幅增加。ChatGPT 和 Google Bard 等对话式响应生成模型在 AI 界引起了轰动。交互式聊天生成的目的是回答人类提出的各种问题,这些基于 AI 的模型使用自然语言处理(NLP)生成几乎与人类生成的对话难以区分的对话。

本文展示了如何使用 Hugging Face 的预训练 DialoGPT 模型创建交互式聊天,并添加 Intel® Extension for PyTorch 以在模型上执行动态量化的代码示例。

开始使用

为什么选择 DialoGPT?

DialoGPT(对话生成预训练 Transformer)是一个大规模预训练的对话响应生成模型,该模型在从 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 使用变压器解码器块构建。这意味着在架构中使用了以下层:

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

以下为 GPT-2 架构(以及 DialoGPT 架构)。

GPT-2 architecture

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

  • Top-K 采样 - 过滤出最可能的 K 个后续单词,并将概率质量重新分配到这 K 个后续单词上。
  • Top-p 采样 - 而不是仅选择最可能的 K 个单词,选择累积概率超过概率 p 的最小单词集。

然后将概率质量重新分配到该集中的单词上。因此,单词集的大小可以根据下一个单词的概率分布动态增加或减少。

使用英特尔® PyTorch 扩展进行量化

什么是量化?

量化是对模型中所有或部分层进行系统性地降低精度。这意味着将高精度类型,如深度学习中广泛使用的单精度浮点数(FP32),转换为低精度类型,如 FP16(16 位)或 INT8(8 位)。

这有助于实现,

  • 较低的内存带宽
  • 较低的存储
  • 在最小化至零精度损失的情况下实现更高的性能

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

量化有两种类型:

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

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

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

  • 这篇 CPU 教程详细介绍了 Intel 扩展 PyTorch 针对 Intel CPU 的信息。源代码可在 master 分支找到。
  • 这篇 GPU 教程详细介绍了 Intel 扩展 PyTorch 针对 Intel GPU 的信息。源代码可在 xpu-master 分支找到。

如何使用 Intel 扩展 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®扩展 Transformers)和 Hugging Face 主类中的 Auto Classes。这些允许我们通过给定的名称自动找到相关的模型。它还允许开发者在不进行重大代码更改的情况下轻松更改模型,如下所示:
    tokenizer = AutoTokenizer.from_pretrained(model)
    model = AutoModelForCausalLM.from_pretrained(model)
    

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

  2. 执行模型的动态量化:
    1. 使用 Intel Extension for PyTorch 库的默认动态量化配置创建配置。
    2. 准备模型。
    3. 将模型从 FP32 转换为 INT8。
      详细步骤在上文已解释。
  3. 响应生成:响应生成的第一步是将输入句子编码,如下代码所示:
    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) 
    

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

  4. 交互式对话的准备:在响应生成后,最后一步是添加交互。这可以通过使用简单的 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 分析工具包和 Intel Extension for PyTorch,以构建各种端到端 AI 应用。

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

想了解更多关于新一代第 4 代英特尔® 至强® 可扩展处理器的详细信息,请访问英特尔 AI 解决方案平台门户,在那里您可以了解英特尔如何赋能开发者在这些强大的 CPU 上运行端到端 AI 管道。

有用资源

探索更多 AI 代码示例

查看所有代码示例