簡體   English   中英

如何將 HuggingFace 的 Seq2seq 模型轉換為 onnx 格式

[英]how to convert HuggingFace's Seq2seq models to onnx format

我正在嘗試將 HuggingFace 的變形金剛 model 中的 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 model,不能使用這種方法直接轉換一個seq2seq model(編碼器-解碼器模型)。 guide適用於編碼器 model 的 BERT。 任何僅編碼器或僅解碼器變壓器 model 都可以使用此方法進行轉換。

要轉換seq2seq model(編碼器-解碼器),您必須將它們拆分並分別轉換,將編碼器轉換為 onnx,將解碼器轉換為 onnx。 您可以遵循本指南(它是為 T5 完成的,它也是一個seq2seq模型)

你為什么會收到這個錯誤?

同時將PyTorch 轉換為 onnx

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

您需要分別為編碼器和解碼器提供一個虛擬變量。 默認情況下,使用此方法進行轉換時,它會為編碼器提供虛擬變量。 由於這種轉換方法不接受這個 seq2seq model 的解碼器,它不會給解碼器一個虛擬變量,你會得到上述錯誤。 ValueError: You have to specify either decoder_input_ids or decoder_inputs_embeds

Optimum庫支持從 Transformers 庫中導出規范模型的 ONNX( 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 export onnx --help以獲取更多詳細信息。 很酷的是 model 然后可以直接與 ONNX 運行時一起使用(例如此處) ORTModelForSeq2SeqLM

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

免責聲明:我是這個庫的貢獻者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM