如何将 HuggingFace 的 Seq2seq 模型转换为 onnx 格式

Posted

技术标签:

【中文标题】如何将 HuggingFace 的 Seq2seq 模型转换为 onnx 格式【英文标题】:how to convert HuggingFace's Seq2seq models to onnx format 【发布时间】:2021-05-12 11:58:56 【问题描述】:

我正在尝试将 HuggingFace 的变形金刚模型中的 Pegasus 新闻编辑室转换为 ONNX 格式。我遵循了 Huggingface 发布的 this 指南。安装 prereqs 后,我运行了以下代码:

!rm -rf onnx/
from pathlib import Path
from transformers.convert_graph_to_onnx import convert

convert(framework="pt", model="google/pegasus-newsroom", output=Path("onnx/google/pegasus-newsroom.onnx"), opset=11)

并得到这些错误:

ValueError                                Traceback (most recent call last)
<ipython-input-9-3b37ed1ceda5> in <module>()
      3 from transformers.convert_graph_to_onnx import convert
      4 
----> 5 convert(framework="pt", model="google/pegasus-newsroom", output=Path("onnx/google/pegasus-newsroom.onnx"), opset=11)
      6 
      7 

6 frames
/usr/local/lib/python3.6/dist-packages/transformers/models/pegasus/modeling_pegasus.py in forward(self, input_ids, attention_mask, encoder_hidden_states, encoder_attention_mask, head_mask, encoder_head_mask, past_key_values, inputs_embeds, use_cache, output_attentions, output_hidden_states, return_dict)
    938             input_shape = inputs_embeds.size()[:-1]
    939         else:
--> 940             raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds")
    941 
    942         # past_key_values_length

ValueError: You have to specify either decoder_input_ids or decoder_inputs_embeds

我以前从未见过此错误。有什么想法吗?

【问题讨论】:

【参考方案1】:

Pegasus 是一个seq2seq 模型,你不能使用这种方法直接转换一个seq2seq 模型(编码器-解码器模型)。 guide 用于编码器模型 BERT。使用此方法可以转换任何仅编码器或仅解码器转换器模型。

要转换seq2seq 模型(编码器-解码器),您必须将它们拆分并分别转换,将编码器转换为 onnx,将解码器转换为 onnx。你可以关注this guide(它是为T5完成的,也是seq2seq模型)

为什么会出现此错误?

同时转换PyTorch to onnx

_ = torch.onnx._export(
                        model,
                        dummy_input,
                        ...
                       )

您需要为编码器和解码器separately 提供一个虚拟变量。默认情况下,使用此方法进行转换时,它会为编码器提供虚拟变量。由于这种转换方法不接受这个 seq2seq 模型的解码器,它不会给解码器一个虚拟变量,你会得到上述错误。 ValueError: You have to specify either decoder_input_ids or decoder_inputs_embeds

【讨论】:

以上是关于如何将 HuggingFace 的 Seq2seq 模型转换为 onnx 格式的主要内容,如果未能解决你的问题,请参考以下文章

如何将拥抱脸模型用于 NLP音频分类和计算机视觉

批处理如何在 pytorch 的 seq2seq 模型中工作?

如何使用Tensorflow构建Seq2seq模型

Huggingface 微调 - 如何在预训练的基础上构建自定义模型

如何在 Huggingface 中从 CSV 加载自定义数据集

seq2seq 入门