著者| huggingface
コンパイル| VKの
ソース| Githubに
注:これはTorchScriptを用いて行った実験の開始で、我々はまだ模索しているモデルの可変入力サイズを備えています。それは私たちの注目の的である、私たちは、今後のリリースで我々の分析を深め、よりコードサンプル、およびより柔軟な実装では、Pythonコードの比較ベンチマークに基づいており、TorchScriptをコンパイルされますされます。
Pytorchの文書によると、「TorchScriptはPyTorchコードから直列化可能と最適化モデルを作成する方法です。」Pytorch 2つのモジュールがJIT和TRACE
開発者は、このような効率重視C ++プログラムなどの他のプログラムで再利用することができ、そのモデルをエクスポートすることができます。
私たちはできるインタフェースを提供変圧器は、彼らが異なる環境のパイソンベースのプログラムPytorchに再利用できるように、TorchScriptにモデルをエクスポートすることを。ここでは、ノートにこれらのモデルTorchScriptと一緒に使用する場合、それらは問題だけでなく、エクスポートすることができるように、我々のモデルを使用する方法について説明します。
輸出モデルは2つのことが必要になります。
- 前方伝搬モデルを実行するための仮想入力。
- あなたは使用する必要がある
torchscript
モデルをインスタンス化するためにロゴを。
必要性は、開発者がいくつかのことに注意を払う必要があることを意味します。これらの詳細は以下。
意味
TorchScriptサイン和解縛ら重み
その中のリポジトリの言語モデルのほとんどのため、このフラグは必要であるEmbedding
層とは、Decoding
右のレイヤーを結合量の関係を持ちます。TorchScript再輸出にバインディング右のモデルを許可されていないので、アンバンドリング重量を進めることが必要です。
するために、この手段torchscript
インスタンス化されたモデルに署名を行いEmbedding
層をし、Decoding
層を分離し、それは予期しない結果につながる、トレーニングしながら、それらにすべきではないことを意味します。
これらのモデルは、重量がバインドされていないので、モデルが第一言語(言語モデルヘッド)をモデル化しないためには、そうではありません。これらのモデルはできませんtorchscript
状況の看板の下で安全に引き出します。
仮想(ダミー)入力と標準的な長さ
繁殖前の仮想モデルを入力します。層中の伝播の場合、入力値、Pytorch各テンソルに対して実行異なる動作を追跡します。その後のモデルを作成するためにそれらのレコードを使用して「トラックを。」
入力トレースのサイズの相対が作成されます。従って、仮想入力の大きさによって制限され、そして任意の他の配列の長さまたはバッチサイズには適用されません。あなたが別のサイズを使用しようとすると、次のエラーが発生し、例えば:
The expanded size of the tensor (3) must match the existing size (7) at non-singleton dimension 2
したがって、少なくとも同じ大きさと仮想入力トラッキングモデルの最大入力サイズ使用することが推奨されます。入力モデルの場合、パディングは推論中に欠損値を埋めるために実行することができます。モデルとして
、追跡されるべき入力のより大きなサイズであるが、マトリックスの異なるサイズがより計算に至る、大きくなります。
各入力操作のための推奨事項の総数が完了したことに注意してください、そして様々な変更が密接系列長のプロパティに対応します。
Pythonで使用TorchScript
以下は、Pythonの使用は、負荷モデルとどのように「トレース」推論の例を保存しています。
保存モデル
このコードは、TorchScriptのエクスポートを使用する方法を示しスニペットBertModel
。ここでインスタンス化されるBertModel
によると、BertConfig
その後、ファイル名、クラスtraced_bert.pt
ディスクに保存します
from transformers import BertModel, BertTokenizer, BertConfig
import torch
enc = BertTokenizer.from_pretrained("bert-base-uncased")
# 标记输入文本
text = "[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]"
tokenized_text = enc.tokenize(text)
# 输入标记之一进行掩码
masked_index = 8
tokenized_text[masked_index] = '[MASK]'
indexed_tokens = enc.convert_tokens_to_ids(tokenized_text)
segments_ids = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
# 创建虚拟输入
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])
dummy_input = [tokens_tensor, segments_tensors]
# 使用torchscript标志初始化模型
# 标志被设置为True,即使没有必要,因为该型号没有LM Head。
config = BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768,
num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072, torchscript=True)
# 实例化模型
model = BertModel(config)
# 模型设置为评估模式
model.eval()
# 如果您要使用from_pretrained实例化模型,则还可以设置TorchScript标志
model = BertModel.from_pretrained("bert-base-uncased", torchscript=True)
# 创建迹
traced_model = torch.jit.trace(model, [tokens_tensor, segments_tensors])
torch.jit.save(traced_model, "traced_bert.pt")
ローディングモデル
このコードのショーはどのように名前で以前にロードするためにtraced_bert.pt
、ディスクに保存しますBertModel
。
私たちは、使用前に再初期化dummy_input
。
loaded_model = torch.jit.load("traced_model.pt")
loaded_model.eval()
all_encoder_layers, pooled_output = loaded_model(dummy_input)
モデルの推論を追跡する使用
その使用したとして、推論の使用追跡モデル__call__
法は、として、単純なようです。
traced_model(tokens_tensor, segments_tensors)
オリジナルリンクします。https://huggingface.co/transformers/torchscript.html
AIは注意パンチョン・ステーションのブログを歓迎:
http://panchuang.net/
OpenCVの中国の公式文書:
http://woshicver.com/
ようこそ注意パンチョンのブログのリソースの概要駅:
http://docs.panchuang.net/