PyTorch 2.0 : テキスト : Better Transformer による高速な Transformer 推論

PyTorch 2.0 チュートリアル : テキスト : Better Transformer による高速な Transformer 推論 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/18/2023 (2.0.0)

* 本ページは、PyTorch 2.0 Tutorials の以下のページを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Website: www.classcat.com  ;   ClassCatJP

 

PyTorch 2.0 チュートリアル : テキスト : Better Transformer による高速な Transformer 推論

このチュートリアルは PyTorch 1.12 リリースの一部としての Better Transformer (BT) を紹介します。このチュートリアルでは、torchtext によりプロダクション推論のために Better Transformer を使用する方法を示します。Better Transformer は、CPU と GPU 上で高い性能を持つ Transformer モデルの配備を高速化するプロダクション・レディな fastpath です。この fastpath 機能は PyTorch コア nn.module に直接基づくモデルや torchtext によるモデルに対して透過的に動作します。

Better Transformer fastpath 実行により高速化できるモデルは以下の PyTorch コア torch.nn.module クラス TransformerEncoder, TransformerEncoderLayer と MultiHeadAttention を使用しているものです。更に、torchtext は fastpath 高速化から恩恵を受けるためにコアライブラリを使用するように更新されています。(将来的には追加のモジュールが fastpath 実行により有効にされるかもしれません。)

Better Transformer は 2 つのタイプの高速化を提供します :

  • 全体的な実行効率性を改良する CPU と GPU のための Native multihead attention (MHA) 実装。

  • NLP 推論におけるスパース性の利用。可変入力長のため、入力トークンは大量のパディングトークンを含む可能性があります、そのための処理がスキップされ、大幅なスピードアップを提供します。

Fastpath 実行は幾つかの基準に従います。最も重要なのは、モデルは推論モードで実行し、勾配テープ情報を収集していない (e.g., torch.no_grad で実行している) 入力テンソル上で作用する必要があることです。

このサンプルを Google Colab で追うには、ここ をクリックしてください。

 

このチュートリアルにおける Better Transformer の特徴

  • 事前訓練済みモデルのロード (Better Transformer なしで作成された pre-1.12)
  • BT fastpath ありとなしで CPU 上で推論を実行してベンチマークする (ネイティブ MHA only)
  • BT fastpath ありとなしで (構成可能な) DEVICE 上で推論を実行してベンチマークする (ネイティブ MHA only)
  • スパース性サポートを有効にする
  • BT fastpath ありとなしで (構成可能な) DEVICE 上で推論を実行してベンチマークする (ネイティブ MHA + スパース性)

 

追加情報

Better Transformer についての追加情報は PyTorch.Org のブログ A Better Transformer for Fast Transformer Inference で見つかるかもしれません。

 

1. セットアップ

1.1 事前訓練済みモデルのロード

torchtext.models の手順に従い事前定義済み torchtext モデル から XLM-R モデルをダウンロードします。また DEVICE を on-accelerator テストを実行するように設定します。(貴方の環境のために適切に GPU 実行を有効にしてください。)

import torch
import torch.nn as nn

print(f"torch version: {torch.__version__}")

DEVICE = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

print(f"torch cuda available: {torch.cuda.is_available()}")

import torch, torchtext
from torchtext.models import RobertaClassificationHead
from torchtext.functional import to_tensor
xlmr_large = torchtext.models.XLMR_LARGE_ENCODER
classifier_head = torchtext.models.RobertaClassificationHead(num_classes=2, input_dim = 1024)
model = xlmr_large.get_model(head=classifier_head)
transform = xlmr_large.transform()

 
1.2 データセットのセットアップ

2 つのタイプの入力をセットアップします : 小さい入力バッチとスパース性を持つ大きい入力バッチです。

small_input_batch = [
               "Hello world",
               "How are you!"
]
big_input_batch = [
               "Hello world",
               "How are you!",
               """`Well, Prince, so Genoa and Lucca are now just family estates of the
Buonapartes. But I warn you, if you don't tell me that this means war,
if you still try to defend the infamies and horrors perpetrated by
that Antichrist- I really believe he is Antichrist- I will have
nothing more to do with you and you are no longer my friend, no longer
my 'faithful slave,' as you call yourself! But how do you do? I see
I have frightened you- sit down and tell me all the news.`

It was in July, 1805, and the speaker was the well-known Anna
Pavlovna Scherer, maid of honor and favorite of the Empress Marya
Fedorovna. With these words she greeted Prince Vasili Kuragin, a man
of high rank and importance, who was the first to arrive at her
reception. Anna Pavlovna had had a cough for some days. She was, as
she said, suffering from la grippe; grippe being then a new word in
St. Petersburg, used only by the elite."""
]

次に、小さい入力バッチか大きい入力バッチかを選択し、入力を前処理してモデルをテストします。

input_batch=big_input_batch

model_input = to_tensor(transform(input_batch), padding_value=1)
output = model(model_input)
output.shape

最後に、ベンチマークの反復カウントを設定します :

ITERATIONS=10

 

2. 実行

2.1 BT fastpath ありとなしで CPU 上で実行して推論をベンチマークする (ネイティブ MHA only)

モデルを CPU で実行して、プロファイル情報を収集する :

  • 最初の実行は従来の実行 (“slow path”) を使用します。
  • 2 回目の実行は、model.eval() を使用してモデルを推論モードにして torch.no_grad() で勾配収集を無効にして BT fastpath の実行を有効にします。

モデルが CPU で実行されるとき改善を見られます (その大きさは CPU モデルに依存します)。
fastpath プロファイルはネイティブの TransformerEncoderLayer 実装 aten::_transformer_encoder_layer_fwd 内の実行時間の殆どを示していることに注意してください。

print("slow path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=False) as prof:
  for i in range(ITERATIONS):
    output = model(model_input)
print(prof)

model.eval()

print("fast path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=False) as prof:
  with torch.no_grad():
    for i in range(ITERATIONS):
      output = model(model_input)
print(prof)

 
2.2 BT fastpath ありとなしで (構成可能な) DEVICE 上で実行して推論をベンチマークする (ネイティブ MHA only)

BT スパース性設定を確認します :

model.encoder.transformer.layers.enable_nested_tensor

BT スパース性を無効にします :

model.encoder.transformer.layers.enable_nested_tensor=False

モデルを DEVICE で実行して、DEVICE 上のネイティブ MHA 実行に対するプロファイル情報を収集する :

  • 最初の実行は従来の実行 (“slow path”) を使用します。
  • 2 回目の実行は、model.eval() を使用してモデルを推論モードにして torch.no_grad() で勾配収集を無効にして BT fastpath の実行を有効にします。

GPU で実行するとき、大幅なスピードアップを見るはずです、特に小さい入力バッチ設定に対して :

model.to(DEVICE)
model_input = model_input.to(DEVICE)

print("slow path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=True) as prof:
  for i in range(ITERATIONS):
    output = model(model_input)
print(prof)

model.eval()

print("fast path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=True) as prof:
  with torch.no_grad():
    for i in range(ITERATIONS):
      output = model(model_input)
print(prof)

 
2.3 BT fastpath ありとなしで (構成可能な) DEVICE 上で実行して推論をベンチマークする (ネイティブ MHA + スパース性)

スパース性サポートを有効にします :

model.encoder.transformer.layers.enable_nested_tensor = True

モデルを DEVICE で実行して、DEVICE 上のネイティブ MHA とスパース性サポートの実行に対するプロファイル情報を収集する :

  • 最初の実行は従来の実行 (“slow path”) を使用します。
  • 2 回目の実行は、model.eval() を使用してモデルを推論モードにして torch.no_grad() で勾配収集を無効にして BT fastpath の実行を有効にします。

GPU で実行するとき、大幅なスピードアップを見るはずです、特にスパース性を含む大きな入力バッチ設定に対して :

model.to(DEVICE)
model_input = model_input.to(DEVICE)

print("slow path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=True) as prof:
  for i in range(ITERATIONS):
    output = model(model_input)
print(prof)

model.eval()

print("fast path:")
print("==========")
with torch.autograd.profiler.profile(use_cuda=True) as prof:
  with torch.no_grad():
    for i in range(ITERATIONS):
      output = model(model_input)
print(prof)

 

まとめ

このチュートリアルでは、Transformer エンコーダモデルに対する PyTorch コア Better Transformer サポートを使用して、torchtext の Better Transformer fastpath 実行による高速な transformer 推論を紹介しました。BT fastpath 実行が利用可能になる前に訓練されたモデルを使用して Better Transformer の使用方法を実演しました。BT fastpath 実行モード, ネイティブ MHA 実行と BT スパース性高速化の両方の使用を実演してベンチマークを行ないました。

 

以上