トランスフォーマーを利用した自然言語処理用の高度な深層学習モデルは素晴らしい結果をもたらしますが、高速なパフォーマンスを得ることは困難です。 高速なパフォーマンスを得ることは困難です。この記事では、本番環境での予測のレイテンシーを減らしたい場合に、どのような選択肢があるかをまとめました。 本番環境での予測のレイテンシーを減らしたい場合の最良の選択肢をまとめました。
トランスフォーマーを使った自然言語処理モデルの速度を向上させたい場合、より高度なハードウェアを使用するというのが「素朴な」アプローチです。 より高度なハードウェアを使用することです。
純粋なソフトウェアベースのソリューションには限界があるため、ほとんどの場合、これは必然的な解決策です。 CPUで推論を行う場合を想像してみてください。 お気に入りのTransformerベースのモデルの低レベルの最適化に何週間もかけるかもしれません。 推論をCPUで行う場合、Transformerをベースにしたモデルの低レベル最適化に何週間も費やしたとしても、そのモデルを単に NVIDIA A100 GPUに移行した方がスピードアップできる可能性が高いです。
最近では、生産現場で推論用のGPUとして最も広く使用されているのは、NVIDIA Tesla T4とV100です。
しかし、すでにハードウェアをアップグレードした場合はどうでしょうか?また、予算が限られていて、その余裕がない場合は していない場合 最先端の高価なGPUを利用する余裕がない場合は?以下をお読みください。
バッチ推論とは、複数のリクエストを同時にモデルに送信することで、リクエストに一斉に対応することです。 一度にすべてのリクエストに対応します。
バッチ推論は、モデルが複数のリクエストに対応するのと、1つのリクエストに対応するのとでは、ほとんど同じ時間がかかるため、非常に強力です。 モデルが複数のリクエストに対応するには、1つのリクエストに対応するのとほぼ同じ時間がかかるからです。フードの下では、いくつかの操作が因数分解されます。 因数分解されますので、全てをn回行う代わりに、モデルは1回だけ行えば良いことになります。
技術的に言えば、リクエストのレイテンシーは減少しません。なぜなら、リクエストがより速く処理されないからです。 しかし、アプリケーションのスループットは劇的に向上します(同じハードウェアでより多くのリクエストを処理できます)。 同じハードウェアでより多くのリクエストを処理できる)。
しかし、バッチ推論は完璧ではありません。
まず、オンライン推論(顧客向けアプリケーション)には必ずしも適していません。 バッチを作成するために、ユーザーのリクエストをバッファリングする必要があるため、一部のユーザーは通常よりも長く待たなければなりません。 通常よりも長く待たされることになります。
2つ目の課題:似たようなリクエストにはバッチ推論が有効。例えば、テキスト生成の自然言語処理モデルを導入する場合は 例えば、テキスト生成の自然言語処理モデルを導入する場合、同じ長さのリクエストのバッチを作成すると、バッチ処理がより効率的になります。 同じ長さのリクエストのバッチを作成した方が効率的です。
最後に、バッチ推論は深層学習モデル自身ではなく、専用の推論サーバーのような上位の 専用の推論サーバーのような高レベルのレイヤーによって行われます。このようなレイヤーを実装するのは必ずしも容易ではありません。例えば 例えば、NVIDIAのTriton Inference Server(後述)は、バッチ推論の実行に非常に優れています。 しかし モデルをTritonに準拠させる方法を見つけなければなりません。
モデルをTritonにエクスポートしてしまえば、バッチ推論は非常に簡単です。例えば、以下のようになります。 最大128個のリクエストからなるバッチを作成し、バッチを処理する前に最大5秒待つ方法です。 これは、"config.pbtxt "ファイルに記述する必要があります)。
max_batch_size: 128
dynamic_batching {
max_queue_delay_microseconds: 5000000
}
多くの人や企業が、トランスフォーマーを使った自然言語処理モデルの低レベル最適化に取り組んでいます。 モデルの低レベル最適化に取り組んでいます。あなたのモデルのために、これらのカスタム実装を活用することは良いアイデアとなるでしょう。
ほとんどの場合、これらのカスタム実装は簡単に使用でき、追加の作業はほとんど必要ありません。 を必要としません。ここではそのいくつかをご紹介します。
ここでは、DeepSpeedを使ってGPT Neo 2.7Bモデルの推論を行う例をご紹介します。そんなに難しくないでしょう?
# Filename: gpt-neo-2.7b-generation.py
import os
import deepspeed
import torch
from transformers import pipeline
local_rank = int(os.getenv('LOCAL_RANK', '0'))
world_size = int(os.getenv('WORLD_SIZE', '1'))
generator = pipeline('text-generation', model='EleutherAI/gpt-neo-2.7B',
device=local_rank)
generator.model = deepspeed.init_inference(generator.model,
mp_size=world_size,
dtype=torch.float,
replace_method='auto')
string = generator("DeepSpeed is", do_sample=True, min_length=50)
if not torch.distributed.is_initialized() or torch.distributed.get_rank() == 0:
print(string)
これらのカスタム実装を使用する際には、新しいモデルの品質を厳密にテストすることを忘れないでください。 の品質を厳密にテストすることを忘れないでください。なぜなら、これらの新しい実装にバグがないとは100%言い切れないからです。
マイクロソフトとNVIDIAは、推論性能を向上させるために、高度な推論エンジンを開発しました。 パフォーマンスを向上させました。
ONNX Runtime(以下、ORT)は、マイクロソフト社が開発したクロスプラットフォームの推論・学習用機械学習アクセラレータです。 アクセラレータ (こちら). NVIDIA社のTensorRT(以下、TRT)は、高性能な深層学習のためのSDKです。 推論のためのSDKです。TRTには、深層学習推論のオプティマイザーとランタイムが含まれており、深層学習推論アプリケーションに低レイテンシーと高スループットを提供します。 深層学習推論アプリケーションに低レイテンシーと高スループットを提供します。 (こちら).
また、「NVIDIA Triton Inference Server」は、AIの推論を容易にする推論サービングソフトウェアです。 様々なフレームワークからAIモデルを展開できるようにすることで、AIの推論を容易にします。Tritonを使用すると、以下のようなことが可能になります。 例えば、バッチ推論を簡単に実行したり、複数の深層学習モデルを同じGPU上で同時に実行したりすることができます。 複数のGPUにモデルを配置することができます。 こちらをご覧ください。
一見、楽しそうに見えますが、もちろんそんなに単純な話ではありません。専用の推論エンジンを利用するためには、まず既存のモデルを 専用の推論エンジンを利用するためには、まず、既存のモデルを適切なフォーマットに変換する必要があります。
いくつかの選択肢があります。
上記の方法でプレイする場合、エクスポートされたモデルの品質には十分注意する必要があります。あなたは モデルのエクスポートに成功したと思っても、その過程で精度が失われている可能性があります。 そのため、エクスポートされた新しいモデルのテストには細心の注意を払う必要があります。
最新のトランスフォーマーベースの自然言語処理モデルは素晴らしい結果を出しており、多くの企業が生産現場での使用を希望しています。 ますます多くの企業が生産現場で使用したいと考えています。しかし、多くの場合、パフォーマンスは期待外れであると思われます...
予測の速度を改善することは非常に重要ですが、上記のように、一律の解決策はありません。 な解決策はありません。
推論を高速化する方法についてご質問がある場合は、遠慮なくお問い合わせください。
Julien Salinas
NLP CloudのCTO