はじめに: TensorRT-LLM が週末に構築する価値がある理由
LLM の処理が遅い一方で、GPU の使用率が 60% で止まっているのを見たことがあるなら、まだ利用できるパフォーマンスがあることをご存知でしょう。TensorRT-LLM はその余裕をスループットに変えます。融合カーネル、ページングされたアテンション、量子化、およびレイテンシを下げ、トークン/秒を上げるグラフレベルの最適化です。このハウツーガイドでは、インストールからエンジン構築、提供まで、エンドツーエンドで説明します。NVIDIA GPU 上でより高速で安価な推論を自信を持ってデプロイできるようになります。
このチュートリアルは、実践的かつソリューション志向のスタイルで書かれています。コピー可能なコマンド、一般的な落とし穴、FP16 vs INT8、バッチ処理、KV キャッシュ戦略の意思決定ポイントを含む、質問主導型の構造を使用します。また、必要に応じて、より深く掘り下げるための公式リソースも参照します。
学習内容
- TensorRT-LLM の環境をセットアップする方法
- エンジン構築のためにモデル (Hugging Face またはチェックポイントから) を準備する方法
- FP16/INT8 エンジンを構築し、パフォーマンスを調整する方法
- Python/C++ および HTTP サービス経由で推論を実行する方法
対象者
- NVIDIA GPU 上に LLM をデプロイする ML エンジニア
- PyTorch Transformers から高度に最適化された推論に移行する構築者
- TensorRT-LLM とは何ですか? また、いつ使用すべきですか?
TensorRT-LLM は、Transformer モデルを高度に最適化された GPU 「エンジン」にコンパイルする推論スタックです。生の PyTorch や汎用ランタイムと比較して、通常は次のようになります:
- ページングされた KV キャッシュと量子化によるメモリ効率の向上
NVIDIA GPU で実行し、本番環境グレードのパフォーマンスを重視する場合に使用します。特に、デコーダー専用 LLM (例: Llama、Mistral、Phi、BLOOM) や、チャットボット、RAG、高 QPS API サービスなどのシナリオに役立ちます。
- 最新の計算能力を備えた NVIDIA GPU (例: Ampere、Ada、Hopper)
- 一致する CUDA および TensorRT のバージョンと、適切なドライバ
- Python 3.8 以降、およびソースからコンパイルする場合はビルドツール
バージョンに関する注意: インストールする前に、互換性のある CUDA/TensorRT バージョンと機能について、公式の TensorRT サポートマトリックスとリリースノートを必ず確認してください。
クイックスタートオプション
- コンテナ化: CUDA/TensorRT がプリインストールされた NVIDIA のコンテナを使用します。バージョンミスマッチを回避する最も速い方法です。
- ネイティブインストール: ベースの TensorRT の公式クイックスタートに従い、その上に TensorRT-LLM を重ねます。
- モデルの準備 (Hugging Face → TensorRT-LLM)
一般的なソース
- Hugging Face: Llama/Mistral/BLOOM バリアント
- ローカルチェックポイント: カスタムファインチューン
準備チェックリスト
- モデルアーキテクチャが TensorRT-LLM でサポートされていることを確認します。
- モデルの重みとトークナイザーをダウンロードします。
- 必要に応じて、safetensors を予期される形式に変換するか、プロジェクトのスクリプトを使用して ONNX にエクスポートします。
ヒント: 公式クイックスタートには、モデルをフェッチして正しい中間形式に変換するスクリプトが含まれていることがよくあります。BLOOM の例を用いたチュートリアル形式のウォークスルーについては、Hugging Face LLM を TensorRT-LLM に変換する Dell のガイドを参照してください。
- TensorRT-LLM エンジンの構築 (ワークフローの要)
知っておくべき概念
- エンジン: 推論のためにロードするコンパイル済みのハードウェア最適化されたアーティファクト。
- 精度: 強力なベースラインには FP16/BF16。精度が維持される場合は、より高いスループットには INT8 または FP8。
- KV キャッシュ: ページングされた KV キャッシュは、メモリの断片化を軽減し、長文脈のパフォーマンスを向上させます。
高レベルの手順
- ビルド構成を定義します: 最大バッチ、シーケンス長、精度、量子化、および GPU アーキテクチャ。
- モデルのチェックポイントとトークナイザーを指定します。
- ターゲット GPU 用にエンジンをコンパイルします。
参考: 公式ドキュメントと構成を使用したエンジンの構築。Hugging Face Text Generation Inference (TGI) 経由で提供する場合は、GPU アーチおよび構成ごとにエンジンを事前コンパイルする TRT-LLM バックエンドのメモを参照してください。
スターターの意思決定ツリー
- 最初のビルド: FP16、中程度の最大シーケンス長 (例: 4K~8K)、適度なバッチ (例: 4~8)。正確性を検証します。
- スケールアップ: ページングされた KV キャッシュを有効にします。最大バッチ/ビームサイズを増やします。FP8 または INT8 を試してください。
- 本番環境: レイテンシ/QPS SLO を満たす構成を固定します。シナリオごとに個別のエンジンを作成します (短いプロンプト vs 長文脈)。
- 推論の実行: Python、C++、および HTTP
3 つの一般的なパスがあります:
- Python: 迅速なプロトタイピング、パイプラインおよびノートブックに最適。
- C++: 最大限のパフォーマンス、ネイティブサービスへの統合。
- HTTP サービス: TRT-LLM バックエンドを備えた TGI、またはスケーラブルなデプロイメントのためのランタイムのサービス例を使用します。
Hugging Face TGI バックエンド
- 正確な GPU/精度セットアップ用にエンジンを事前コンパイルします。
- TRT-LLM バックエンドを使用して TGI をスピンアップし、エンジンディレクトリを指定します。
- /generate または openai 互換のルート経由でリクエストを送信し、レプリカでスケールします。
- 実際に効果のあるパフォーマンスチューニング
どこから始めるか
- 精度: FP16 は信頼性の高いベースラインです。INT8/FP8 はレイテンシをさらに短縮できますが、品質を検証してください。
- バッチ処理: 動的なバッチ処理とリクエストの合体により、スループットが大幅に向上します。テールレイテンシを測定します。
- ページングされた KV キャッシュ: 長いプロンプトとストリーミングに不可欠です。メモリプレッシャーを軽減します。
- 最大長: 最大シーケンス長が大きいほど、エンジンサイズが大きくなり、クロックが低下する可能性があります。目的に合ったエンジンを構築します。
実践的なヒント
- 現実的なプロンプトでベンチマークを行います: プリフィルフェーズとデコードフェーズを個別に測定します。
- トークナイザースループットが重要です: フレームワークがサポートしている場合は、GPU で実行します。
- CUDA グラフ/融合カーネルに注目してください: CPU オーバーヘッドとカーネル起動レイテンシを削減します。
- マルチ GPU の場合: モデルサイズとレイテンシ要件に応じて、テンソル並列またはパイプライン並列を優先します。
- ターゲットバッチサイズでのトークン/秒 (スループット)
- Time-to-first-token (TTFT) およびリクエストごとのエンドツーエンドのレイテンシ
- ピーク QPS 下での GPU 使用率とメモリヘッドルーム
- 精度: 量子化する場合は、BLEU/パープレキシティまたはタスク固有の評価
ベースライン (PyTorch vs TensorRT-LLM) 間で一貫したシードとプロンプトセットを使用して、正確性とデルタを検証します。
- バージョンの不一致: 公式サポートマトリックスに従って、CUDA、ドライバ、および TensorRT のバージョンを調整します。
- デバイスに対してエンジンが無効: GPU アーキテクチャ用に特別にエンジンを再構築します。
- ビルド中に OOM: 最大シーケンス長またはバッチを減らします。ページングされた KV を有効にします。量子化を検討してください。
- INT8 での精度低下: ドメインを代表するデータでキャリブレーションします。テンソルごとの量子化を試し、レイヤーごとの感度を確認します。
- 高いスループットにもかかわらず TTFT が遅い: ページングされた KV キャッシュを調整し、CUDA グラフを有効にして、トークナイザーのボトルネックを確認します。
- ワークフローの例: Hugging Face モデルから本番環境へ
シナリオ: A100 で低レイテンシのチャットモデルが必要。
- モデルの選択: 7B~13B Llama/Mistral バリアント。
- 準備: 重みとトークナイザーをダウンロードします。アーキテクチャがサポートされていることを確認します。
- 最初のエンジン: FP16、最大入力 4K、最大出力 1K、バッチ 4。ページングされた KV をオンにします。
- 検証: 出力を PyTorch ベースラインと比較します。
- 最適化: INT8 または FP8 を試します。TTFT とスループットを測定します。サーバーモードの場合はバッチを増やします。
- サービス: TGI TRT-LLM バックエンドを使用します。ロードバランサーの背後でレプリカをスケールします。ストリーミングを追加します。
- GPU あたりのスループット: ターゲットコンテキストでトークン/秒を測定します。それを使用して QPS キャパシティを計算します。
- 100 万トークンあたりの価格: 高速なデコードと高いバッチ使用率により、TRT-LLM は通常、トークンあたりのコストを削減します。
- 適切なサイズのエンジン: 短い形式と長い形式用に個別のエンジンを構築して、ヘッドルームの無駄を最小限に抑えます。
- ガイド内の FAQ
Q: GPU タイプごとにエンジンを再構築する必要がありますか?
A: はい。エンジンはハードウェア固有です。デプロイする各 GPU アーキテクチャ用に構築します。
Q: INT8 は品質にどの程度影響しますか?
A: モデルとタスクによって異なります。適切なキャリブレーションデータを使用すると、多くのモデルは FP16 に近い品質を維持しながら、大幅な高速化を実現します。
Q: 長いコンテキスト (例: 32K) を実行できますか?
A: はい。ただし、メモリを慎重に計画してください。ページングされた KV キャッシュを使用し、ブロックサイズを調整します。長いコンテキストでは、エンジンのフットプリントとデコードコストが増加することに注意してください。
Q: TGI は必須ですか?
A: いいえ。Python/C++ を直接実行できます。TGI は、オートスケーリングとロギングを備えた本番環境グレードの HTTP API に便利です。
ワークフローの高速化のために注目すべき点
プロンプトを頻繁に反復処理する場合、エンジン間で出力を比較する場合、または実験を文書化する場合は、迅速な再試行、コードブロックの実行、および Web スニペットをサポートするサイドバイサイド AI アシスタントを使用すると、ループを高速化できます。ちなみに、Sider.AI は、エンジニア向けに調整されたデスクトップエクスペリエンスを提供します。ベンチマークのキャプチャ、プロンプトのテスト、および TensorRT-LLM パイプラインの最適化中にノートを整理するのに便利です。 次のステップチェックリスト
- 公式のクイックスタートを読んで、環境を検証します。
- サポートマトリックスで CUDA/TensorRT の互換性を確認します。
- エンジン構築ガイドに従い、最初に FP16 を選択します。
- TGI 経由で提供する場合は、エンジンを事前コンパイルし、TRT-LLM バックエンドを構成します。
- オプションで、BLOOM などの Hugging Face モデルのチュートリアル形式のウォークスルーを確認します。
主なポイント
- TensorRT-LLM は、Transformer を GPU ネイティブエンジンにコンパイルして、最大のスループットと低レイテンシを実現します。
- FP16 から始めて、ページングされた KV キャッシュを有効にして測定します。次に、INT8/FP8 を調べて、さらに高速化します。
- エンジンは GPU および構成固有です。デプロイターゲットごとに構築します。
- 本番環境では、エンジンを堅牢なサービスレイヤー (例: TGI) と組み合わせて、TTFT、スループット、および品質を監視します。
よくある質問
Q1:TensorRT-LLM を正しくインストールしてセットアップするにはどうすればよいですか?
一致する CUDA/TensorRT を使用したコンテナを使用するか、公式のクイックスタートとサポートマトリックスに従って、バージョンのずれを回避します。エンジンをコンパイルする前に、GPU ドライバとビルドツールを確認してください。
Q2:Hugging Face モデルで TensorRT-LLM を使用するにはどうすればよいですか?
モデルとトークナイザーをダウンロードし、サポートを確認し、必要に応じて変換してからエンジンを構築します。TGI で提供する場合は、GPU 用にエンジンをコンパイルし、バックエンドをエンジンディレクトリにポイントします。
Q3:TensorRT-LLM には FP16、FP8、または INT8 のどれを選択する必要がありますか?
安定性のために FP16 から始めて、FP8/INT8 を試してスループットを向上させます。量子化後に常にタスクの精度を検証してください。
Q4:HTTP 経由で TensorRT-LLM を提供できますか?
A: はい。Python/C++ を直接使用するか、Hugging Face TGI の TRT-LLM バックエンド経由で提供して、ストリーミングを備えたスケーラブルな本番環境対応 API を実現できます。
Q5:TensorRT-LLM を使用する場合の一般的なパフォーマンスのボトルネックは何ですか?
トークナイザーのオーバーヘッド、最適でないバッチ処理、およびページングされた KV キャッシュの欠如が一般的な問題です。バッチサイズを調整し、CUDA グラフを有効にして、TTFT と全体的なトークン/秒を監視します。