T5モデルは、要約、QA、QG、翻訳、テキスト生成など、いくつかのNLPタスクに使用できます。シーケンシャルテキストの生成は自然に遅く、より大きなT5モデルではさらに遅くなります。 FASTT5は、onnxRuntimeで実行することにより、T5モデルの推論を高速にします。また、それを量子化することにより、モデルサイズも減少します。
FASTT5ライブラリを使用すると、前処理されたT5モデルをONNXに変換し、それを量子化し、モデルを単一行のコードでONNXRUNTIMEで実行している出力としてモデルを提供できます。このプロセス全体をカスタマイズすることもできます。
PypiからFastT5をインストールできます。
pip install fastt5ソースからビルドしたい場合:
git clone https : // github . com / Ki6an / fastT5
cd fastT5
pip3 install - e .export_and_get_onnx_model()メソッドは、指定された前提条件のT5モデルをONNXにエクスポートし、それを量子化し、デフォルト設定でONNXRUNTIMEで実行します。この方法から返されたモデルは、Huggingfaceのgenerate()メソッドをサポートします。
モデルをQuantizeしたくない場合は、メソッドで
quantized=Falseを使用します。
from fastT5 import export_and_get_onnx_model
from transformers import AutoTokenizer
model_name = 't5-small'
model = export_and_get_onnx_model ( model_name )
tokenizer = AutoTokenizer . from_pretrained ( model_name )
t_input = "translate English to French: The universe is a dark forest."
token = tokenizer ( t_input , return_tensors = 'pt' )
tokens = model . generate ( input_ids = token [ 'input_ids' ],
attention_mask = token [ 'attention_mask' ],
num_beams = 2 )
output = tokenizer . decode ( tokens . squeeze (), skip_special_tokens = True )
print ( output )すでにエクスポートされているモデルを実行するには
get_onnx_model()を使用します
以下のコードの例に示すように、パイプライン全体をカスタマイズできます。
from fastT5 import ( OnnxT5 , get_onnx_runtime_sessions ,
generate_onnx_representation , quantize )
from transformers import AutoTokenizer
model_or_model_path = 't5-small'
# Step 1. convert huggingfaces t5 model to onnx
onnx_model_paths = generate_onnx_representation ( model_or_model_path )
# Step 2. (recommended) quantize the converted model for fast inference and to reduce model size.
quant_model_paths = quantize ( onnx_model_paths )
# step 3. setup onnx runtime
model_sessions = get_onnx_runtime_sessions ( quant_model_paths )
# step 4. get the onnx model
model = OnnxT5 ( model_or_model_path , model_sessions )
...デフォルトでは、FASTT5は現在のディレクトリにmodelsフォルダーを作成し、すべてのモデルを保存します。エクスポートされたモデルを保存するためのフォルダーのカスタムパスを提供できます。また、カスタムフォルダーパスに保存されている既にexported modelsを実行するには: get_onnx_model(onnx_models_path="/path/to/custom/folder/")
from fastT5 import export_and_get_onnx_model , get_onnx_model
model_name = "t5-small"
custom_output_path = "/path/to/custom/folder/"
# 1. stores models to custom_output_path
model = export_and_get_onnx_model ( model_name , custom_output_path )
# 2. run already exported models that are stored in custom path
# model = get_onnx_model(model_name, custom_output_path) T5はseq2seqモデル(エンコーダデコーダー)です。推論にデコーダーを繰り返し使用するため、モデル全体をONNXに直接エクスポートすることはできません。エンコーダーとデコーダーを個別にエクスポートする必要があります。
past_key_valuesには、事前に計算された隠された隠された状態(自己関節ブロックとクロスアテンションブロックのキーと値)が含まれています。
モデルは、一定の数の入力でのみエクスポートできます。これに反して、最初のステップのデコーダーはpast_key_valuesを取得せず、残りのステップデコーダーは実行します。この問題を回避するには、2つのデコーダーを作成できます。1つは、 past_key_values取得しない最初のステップ用で、もう1つはpast_key_valuesを使用する残りのステップのためにもう1つを作成できます。
次に、3つのモデルすべて(エンコーダー、デコーダー、init_decoder)をエクスポートします。次に、それらを量子化すると、 32bit 8bitに量子化することで、4倍のメモリ削減が得られます。追加のデコーダーがあるため、モデルサイズは3倍減少します。
最後に、ONNXランタイムで量子化されたモデルを実行します。
モデルがHuggingfaceの
generate()方法をサポートするため、推論は簡単です。
past_key_valuesを使用)。generate()メソッドを介してビーム検索と貪欲な検索などをサポートします。3Xに削減します。5Xスピードアップ、ビーム検索の場合は3-4X 。 ベンチマークは、英語からフランス語翻訳でテストされたT5ベースモデルの結果です。
次のグラフは、量子化されたONNXモデルの遅延と、1〜9から9までのビーム数のPytorchモデルの遅延を示しています。
次のヒートマップは、PytorchのLatencyとONNXモデルの比率がX倍速くなっていることを示しています。 ONNXモデルは、ほとんどの場合よりも優れています。ただし、モデルの速度は、より長いシーケンスの長さで低下します。
量子化されたモデルは前述のように軽量モデルであり、これらのモデルは元のモデルとほぼ同じ精度を持っています(次のセクションでは量子化されたモデルスコアが言及されています)。量子化されたONNXモデルは、ONNXモデルとPytorchモデルの両方に比べて最低のレイテンシを持っています。
このモデルは、貪欲な検索で平均で5.7倍、ビーム検索では3〜4倍のPytorchモデルよりも優れています。
注:結果は
AMD EPYC 7B12で生成され、これらの結果はデバイスごとに異なる場合があります。 ONNXモデルは通常、より多くのコアを備えたハイエンドCPUでうまく機能します。
結果は、3のビーム検索番号で英語からフランス語の翻訳についてテストされました。
| bleu_4 | 流星 | rouge_l | |
|---|---|---|---|
| T5-Small(Quant) | 0.240769 | 0.282342 | 0.468817 |
| T5-Small(Pytorch) | 0.254601 | 0.295172 | 0.492749 |
| T5ベース(Quant) | 0.267606 | 0.306019 | 0.499188 |
| T5ベース(Pytorch) | 0.268346 | 0.304969 | 0.503306 |
| T5-Large(Quant) | 0.286726 | 0.316845 | 0.503585 |
| T5-Large(Pytorch) | 0.294015 | 0.315774 | 0.508677 |
Huggingface Model Hubはプライベートモデルをサポートしています。 FASTT5を使用してT5のプライベートトレーニングバージョンを使用するには、最初に$ transformers-cli loginを使用してHuggingfaceエコシステムに認証されている必要があります。次に、FASTT5を使用すると、追加のインポートと呼び出しがあります。
from fastT5 import (
OnnxT5 ,
get_onnx_runtime_sessions ,
generate_onnx_representation ,
quantize ,
set_auth_token )
from transformers import AutoTokenizer
set_auth_token ( True )
# the rest of the code is the same as using a public model $ transformers-cli loginを呼び出すことができない場合、またはhttps://huggingface.co/settings/token(またはhttps://huggingface.co/organizations/org_name/settings/token for Organizations)にあるAPIキーを使用することを好む場合、あなたはそれをset_auth_tokenとして渡すことができます。環境変数HF_API_KEY=<redacted>を設定して、APIキーをコードにハードコーディングしないでください。
import os
from fastT5 import (
OnnxT5 ,
get_onnx_runtime_sessions ,
generate_onnx_representation ,
quantize ,
set_auth_token )
from transformers import AutoTokenizer
auth_token = os . environ . get ( "HF_API_KEY" )
set_auth_token ( auth_token )
# code proceeds as normal @ article { 2019 t5 ,
author = { Colin Raffel and Noam Shazeer and Adam Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi Zhou and Wei Li and Peter J . Liu },
title = { Exploring the Limits of Transfer Learning with a Unified Text - to - Text Transformer },
journal = { arXiv e - prints },
year = { 2019 },
archivePrefix = { arXiv },
eprint = { 1910.10683 },
}