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



我正在尝试将HuggingFace的变压器模型中的Pegasus新闻编辑室转换为ONNX格式。我遵循了Huggingface出版的指南。在安装了先决条件之后,我运行了下面的代码:

!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

我以前从未见过这个错误。什么好主意吗?

Pegasus是seq2seq模型,您不能使用此方法直接转换seq2seq模型(编码器-解码器模型)。guide用于BERT,它是一个编码器模型。任何唯一编码器或唯一解码器变压器模型都可以使用此方法进行转换。

要转换seq2seq模型(编码器-解码器),您必须将它们分开并分别转换,编码器到onnx和解码器到onnx。你可以按照这个指南(这是为T5做的,它也是一个seq2seq模型)

为什么会出现这个错误?

转换PyTorch为onnx

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

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

从Transformers库导出规范模型的ONNX在Optimum library (pip install optimum)中得到开箱即用的支持:

optimum-cli export onnx --model t5-small --task seq2seq-lm-with-past --for-ort t5_small_onnx/

将给出:

.
└── t5_small_onnx
├── config.json
├── decoder_model.onnx
├── decoder_with_past_model.onnx
├── encoder_model.onnx
├── special_tokens_map.json
├── spiece.model
├── tokenizer_config.json
└── tokenizer.json

您可以查看optimum-cli export onnx --help了解更多细节。很酷的是,该模型可以直接与ONNX运行时一起使用(例如在这里)ORTModelForSeq2SeqLM。

Pegasus本身还不支持,但很快就会支持:https://github.com/huggingface/optimum/pull/620

免责声明:我是这个库的贡献者。

相关内容

  • 没有找到相关文章

最新更新