

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Triton Inference Server によるモデルのデプロイ
<a name="deploy-models-frameworks-triton"></a>

[Triton 推論サーバーは](https://github.com/triton-inference-server/server) AI 推論を効率化するオープンソースの推論サービングソフトウェアです。Triton を使用すると、TensorRT、TensorFlow、PyTorch、ONNX、OpenVINO、Python、RAPIDS FIL など、複数の深層学習および機械学習フレームワークで構築されたあらゆるモデルをデプロイできます。

SageMaker AI Triton コンテナは、SageMaker AI ホスティングプラットフォーム上に Triton 推論サーバーをデプロイし、トレーニング済みモデルを本番環境で提供するのに役立ちます。SageMaker AI が動作するさまざまなモードをサポートしています。SageMaker AI で使用可能な Triton 推論サーバーコンテナのリストについては、「[NVIDIA Triton Inference Containers (SM support only)](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#nvidia-triton-inference-containers-sm-support-only)」を参照してください。

エンドツーエンドのノートブックサンプルについては、「[amazon-sagemaker-examples リポジトリ](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker-triton)」を参照することをお勧めします。

## ホスティングモード
<a name="deploy-models-frameworks-triton-modes"></a>

Triton コンテナでは、以下の SageMaker AI ホスティングモードがサポートされています。
+ シングルモデルエンドポイント
  + これは SageMaker AI のデフォルトの動作モードです。このモードでは、Triton コンテナは 1 つのモデルまたは 1 つのアンサンブルモデルをロードできます。
  + モデルの名前は、`CreateModel` SageMaker AI API コールの一部であるコンテナ環境のプロパティとして渡す必要があります。モデル名を渡すために使用される環境変数は `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME` です。
+ アンサンブルによる単一モデルエンドポイント
  + Triton 推論サーバーは、パイプラインまたはモデルの DAG (有向非巡回グラフ) であるアンサンブルをサポートします。**アンサンブルは技術的には複数のモデルで構成されますが、デフォルトの単一モデルエンドポイントモードでは、SageMaker AI は*アンサンブル自体* (パイプラインを表すメタモデル) をロードするメインモデルとして扱い、その後に関連するモデルをロードすることができます。
  + モデルをロードするには、アンサンブル自体のモデル名を使用する必要があります。`CreateModel` SageMaker API 呼び出しの一部であるコンテナ環境のプロパティとして渡す必要があります。モデル名を渡すために使用される環境変数は `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME` です。
+ マルチモデルエンドポイント
  + このモードでは、SageMaker AI は 1 つのエンドポイントで複数のモデルを提供できます。このモードを使用するには、`CreateModel` SageMaker API 呼び出しの一部であるコンテナ環境のプロパティとして環境変数 `‘MultiModel’: true` を指定します。
  + デフォルトでは、インスタンスの起動時にモデルはロードされません。特定のモデルに対して推論リクエストを実行するには、`InvokeEndpoint` SageMaker API 呼び出しの `TargetModel` プロパティの引数として、対応するモデルの `*.tar.gz` ファイルを指定します。
+ アンサンブルによるマルチモデルエンドポイント
  + このモードでは、SageMaker AI は、マルチモデルエンドポイントの説明通りに機能します。ただし、SageMaker AI Triton コンテナは複数のアンサンブルモデルをロードできます。つまり、複数のモデルパイプラインを同じインスタンスで実行できます。SageMaker AI はすべてのアンサンブルを 1 つのモデルとして扱い、対応する `*.tar.gz` アーカイブを `TargetModel` として指定することで、各モデルのアンサンブル自体を呼び出すことができます。
  + 動的メモリの `LOAD` および `UNLOAD` 時のメモリ管理を向上するために、アンサンブルサイズを小さくしておくことをお勧めします。

## 推論ペイロードのタイプ
<a name="deploy-models-frameworks-triton-payloads"></a>

Triton は、推論ペイロードをネットワーク経由で送信する方法として、`json` と `binary+json` (またはバイナリエンコーディングされた json) の 2 つの方法をサポートしています。どちらの場合も JSON ペイロードには、データ型、シェイプ、および実際の推論リクエストテンソルが含まれます。リクエストテンソルはバイナリテンソルである必要があります。

`binary+json` 形式では、Triton がバイナリペイロードを正しく解析できるように、ヘッダーにリクエストメタデータの長さを指定する必要があります。SageMaker AI Triton コンテナでは、`application/vnd.sagemaker-triton.binary+json;json-header-size={}` というカスタム `Content-Type` ヘッダーを使用して行われます。これは、SageMaker AI ではカスタムヘッダーが許可されていないため、スタンドアロンの Triton 推論サーバーで `Inference-Header-Content-Length` ヘッダーを使用するのとは異なります。

## config.pbtxt を使用してモデル設定を設定する
<a name="deploy-models-frameworks-triton-config"></a>

SageMaker AI 上の Triton 推論サーバーでは、各モデルに少なくともモデルの次の設定を指定する `config.pbtxt` ファイルを含める必要があります。
+ `name`: SageMaker AI の外部で実行されるモデルの場合は任意ですが、SageMaker AI 上の Triton で実行されるモデルの名前を常に指定することをお勧めします。
+ [`platform` および/または `backend`](https://github.com/triton-inference-server/backend/blob/main/README.md#backends): モデルのタイプを指定するには、バックエンドの設定が不可欠です。バックエンドによっては、`tensorflow_savedmodel` や ` tensorflow_graphdef` のようにさらに分類されているものもあります。このようなオプションは、`backend` キーに加えて `platform` キーの一部として指定できます。最も一般的なバックエンドは、`tensorrt`、`onnxruntime`、`tensorflow`、`pytorch`、`python`、`dali`、`fil`、`openvino` です。
+ `input`: 入力には `name`、`data_type` および `dims` (シェイプ) の 3 つの属性を指定します。
+ `output`: 出力には `name`、`data_type` および `dims` (シェイプ) の 3 つの属性を指定します。
+ `max_batch_size`: バッチサイズを、Triton がモデルで使用する最大バッチサイズを示す 1 以上の値に設定します。

`config.pbtxt` の設定の詳細については、「Triton の GitHub [リポジトリ](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md)」を参照してください。Triton には、モデルの動作を微調整するための設定がいくつか用意されています。最も一般的で重要な設定オプションは以下のとおりです。
+ [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#instance-groups](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#instance-groups): インスタンスグループは、指定されたモデルの数と場所を指定するのに役立ちます。これらには `count`、`kind`、および `gpus` (`kind` が `KIND_GPU` の場合に使用) という属性があります。`count` 属性は、ワーカーの数と同等です。通常のモデル提供では、各ワーカーがモデルのコピーを所有します。同様に、Triton では、`count` はデバイスあたりのモデルコピー数を指定します。例えば、`instance_group` タイプが `KIND_CPU` の場合、CPU には `count` 数のモデルのコピーがあります。
**注記**  
GPU インスタンスでは、`instance_group` 設定は GPU デバイスごとに適用されます。例えば、モデルをロードする GPU デバイスを明示的に指定しない限り、各 GPU デバイスには `count` 数のモデルのコピーが配置されます。
+ [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#dynamic-batcher](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#dynamic-batcher) と [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#stateful-models](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#stateful-models): ステートレスモデルには動的バッチ処理が使用され、ステートフルモデル (毎回同じモデルインスタンスにリクエストをルーティングする場合) にはシーケンスバッチ処理が使用されます。バッチ処理スケジューラーではモデルごとのキューが有効になり、バッチ処理の設定によってはスループットの向上に役立ちます。
+ [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#ensemble-models](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#ensemble-models): アンサンブルモデルは、1 つ以上のモデルの*パイプライン*と、それらのモデル間の入力および出力テンソルの接続を表します。`platform` を `ensemble` と指定することで設定できます。アンサンブル設定はモデルパイプラインの単なる表現です。SageMaker AI では、アンサンブルに含まれるすべてのモデルはアンサンブルモデルの依存モデルとして扱われ、`LoadedModelCount` などの SageMaker AI メトリクスでは単一のモデルとしてカウントされます。

## デフォルトの Triton メトリクスを Amazon CloudWatch に発行する
<a name="deploy-models-frameworks-triton-metrics"></a>

NVIDIA Triton 推論コンテナは、Triton 推論サーバーで使用されるさまざまなモデルと GPU のメトリクスをポート 8002 (設定可能) で発行します。利用可能なデフォルトのメトリクスの詳細については、「[Triton 推論サーバーメトリクスの GitHub](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/metrics.md)」ページを参照してください。これらのメトリクスは Prometheus 形式で、Prometheus スクレイパー設定を使用してスクレイプすることができます。

バージョン v23.07 以降、SageMaker AI Triton コンテナはいくつかの環境変数を指定することで、Amazon CloudWatch へのこれらのメトリクスの発行をサポ－トしています。Prometheus メトリクスをスクレイプするために、SageMaker AI Triton コンテナは Amazon CloudWatch エージェントを活用します。

メトリクスを収集するために指定する必要がある必須環境変数は次のとおりです。


| 環境変数 | 説明 | 値の例 | 
| --- | --- | --- | 
|  `SAGEMAKER_TRITON_ALLOW_METRICS`  |  このオプションを指定すると、Triton が Prometheus エンドポイントにメトリクスを発行できるようになります。  | "true" | 
|  `SAGEMAKER_TRITON_PUBLISH_METRICS_TO_CLOUDWATCH`  |  このオプションを指定すると、Amazon CloudWatch にメトリクスを発行するために必要な事前チェックが開始されます。  | "true" | 
|  `SAGEMAKER_TRITON_CLOUDWATCH_LOG_GROUP`  |  このオプションを指定して、メトリクスが書き込まれるロググループを指すようにします。  | 「/aws/SageMaker AI/Endpoints/TritonMetrics/SageMakerTwoEnsemblesTest」 | 
|  `SAGEMAKER_TRITON_CLOUDWATCH_METRIC_NAMESPACE`  |  このオプションを指定して、メトリクスを表示およびプロットするメトリクス名前空間を指すようにします。  | 「/aws/SageMaker AI/Endpoints/TritonMetrics/SageMakerTwoEnsemblesPublicTest」 | 
|  `SAGEMAKER_TRITON_METRICS_PORT`  |  これを 8002 またはその他のポートとして指定します。SageMaker AI が指定されたポートをブロックしていない場合は、そのポートが使用されます。そうでない場合は、ブロックされていない別のポートが自動的に選択されます。  | 「8002」 | 

SageMaker AI で Triton を使用してメトリクスを発行する場合、以下の制限に注意してください。
+ C-API と Python バックエンド (v23.05 以降) を使用してカスタムメトリクスを生成することはできますが、Amazon CloudWatch への発行は現在サポートされていません。
+ SageMaker AI マルチモデルエンドポイント (MME) モードでは、各モデル (アンサンブルモデルを除く) は独自のモデルリポジトリにあるかのように扱われるため、Triton はモデル名前空間を有効にする必要がある環境で実行されます。現在、これによりメトリクスに制限が生じています。モデルの名前空間を有効にすると、Triton は異なるアンサンブルに属する同じ名前の 2 つのモデル間のメトリクスを区別しません。回避策として、デプロイされるすべてのモデルに一意の名前を付けます。これにより、CloudWatch でメトリクスを検索するのも簡単になります。

## 環境変数
<a name="deploy-models-frameworks-triton-variables"></a>

次の表は、SageMaker AI 上の Triton でサポートされている環境変数の一覧です。


| 環境変数 | 説明 | タイプ | 使用できる値 | 
| --- | --- | --- | --- | 
| `SAGEMAKER_MULTI_MODEL` | Triton が SageMaker AI のマルチモデルエンドポイントモードで動作できるようにします。 | ブール値 | `true`, `false` | 
| `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME` | SageMaker AI 単一モデル (デフォルト) モードでロードするモデルを指定します。アンサンブルモードの場合は、アンサンブル自体の名前を指定します。 | String | *<model\$1name>* config.pbtxt で指定 | 
| `SAGEMAKER_TRITON_PING_MODE` | `'ready'` は SageMaker AI の単一モデルモードではデフォルトモードで、`'live'` は SageMaker AI のマルチモデルエンドポイントモードではデフォルトモードです。 | String | `ready`, `live` | 
| `SAGEMAKER_TRITON_DISABLE_MODEL_NAMESPACING` | SageMaker AI Triton コンテナでは、デフォルトで `true` に設定されています。 | ブール値 | `true`, `false` | 
| `SAGEMAKER_BIND_TO_PORT` | SageMaker AI では、デフォルトポートは 8080 です。マルチコンテナのシナリオでは、別のポートにカスタマイズできます。 | String | *<port\$1number>* | 
| `SAGEMAKER_SAFE_PORT_RANGE` | これは、マルチコンテナモードを使用するときに SageMaker AI プラットフォームによって設定されます。 | String | *<port\$11>*–*<port\$12>* | 
| `SAGEMAKER_TRITON_ALLOW_GRPC` | SageMaker AI は現在 GRPC をサポートしていませんが、カスタムリバースプロキシの前に Triton を使用している場合は GRPC を有効にすることができます。 | ブール値 | `true`, `false` | 
| `SAGEMAKER_TRITON_GRPC_PORT` | GRPC のデフォルトポートは 8001 ですが、変更できます。 | String | *<port\$1number>* | 
| `SAGEMAKER_TRITON_THREAD_COUNT` | デフォルトの HTTP リクエストハンドラーのスレッド数を設定できます。 | String | *<number>* | 
| `SAGEMAKER_TRITON_LOG_VERBOSE` | SageMaker AI ではデフォルトで `true` ですが、このオプションを選択的にオフにすることもできます。 | ブール値 | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_INFO` | SageMaker AI のデフォルトでは `false` です。 | ブール値 | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_WARNING` | SageMaker AI のデフォルトでは `false` です。 | ブール値 | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_ERROR` | SageMaker AI のデフォルトでは `false` です。 | ブール値 | `true`, `false` | 
| `SAGEMAKER_TRITON_SHM_DEFAULT_BYTE_SIZE` | Python バックエンドの shm サイズをバイト単位で指定します。デフォルト値は 16 MB ですが、これより大きくすることもできます。 | String | *<number>* | 
| `SAGEMAKER_TRITON_SHM_GROWTH_BYTE_SIZE` | Python バックエンドの shm 成長サイズをバイト単位で指定します。デフォルト値は 1 MB ですが、増分を増やすこともできます。 | String | *<number>* | 
| `SAGEMAKER_TRITON_TENSORFLOW_VERSION` | デフォルト値は `2` です。Triton v23.04 以降、Triton は Tensorflow 2 をサポートしなくなりました。この変数は以前のバージョンで設定できます。 | String | *<number>* | 
| `SAGEMAKER_TRITON_MODEL_LOAD_GPU_LIMIT` | モデルのロードに使用される最大 GPU メモリの割合を制限し、残りを推論リクエストに使用できるようにします。 | String | *<number>* | 
| `SAGEMAKER_TRITON_ALLOW_METRICS` | SageMaker AI のデフォルトでは `false` です。 | ブール値 | `true`, `false` | 
| `SAGEMAKER_TRITON_METRICS_PORT` | デフォルトのポート番号は 8002 です。 | String | *<number>* | 
| `SAGEMAKER_TRITON_PUBLISH_METRICS_TO_CLOUDWATCH` | SageMaker AI のデフォルトでは `false` です。この変数を `true` に設定すると、Triton のデフォルトメトリクスを Amazon CloudWatch にプッシュできるようになります。このオプションを有効にすると、メトリクスがアカウントに発行される際の CloudWatch コストはお客様の負担となります。 | ブール値 | `true`, `false` | 
| `SAGEMAKER_TRITON_CLOUDWATCH_LOG_GROUP` | CloudWatch へのメトリクスの発行を有効にしている場合は必須です。 | String | *<cloudwatch\$1log\$1group\$1name>* | 
| `SAGEMAKER_TRITON_CLOUDWATCH_METRIC_NAMESPACE` | CloudWatch へのメトリクスの発行を有効にしている場合は必須です。 | String | *<cloudwatch\$1metric\$1namespace>* | 
| `SAGEMAKER_TRITON_ADDITIONAL_ARGS` | Triton サーバーの起動時に追加の引数を追加します。 | String | *<additional\$1args>* | 