Triton Inference Serverとは？

NVIDIAが推している推論用サーバ Triton Inference Serverの概要やユースケースについて調べたことの個人的メモです．
(間違いがあればご教示ください！)


# Triton Inference Server

- GitHub: https://github.com/triton-inference-server/server
- 公式Document: https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/index.html


# 概要

公式ドキュメント冒頭の紹介文は以下のとおり．

> Triton Inference Server enables teams to deploy any AI model from multiple deep learning and machine learning frameworks, including TensorRT, TensorFlow, PyTorch, ONNX, OpenVINO, Python, RAPIDS FIL, and more. Triton supports inference across cloud, data center, edge and embedded devices on NVIDIA GPUs, x86 and ARM CPU, or AWS Inferentia. Triton Inference Server delivers optimized performance for many query types, including real time, batched, ensembles and audio/video streaming. Triton inference Server is part of NVIDIA AI Enterprise, a software platform that accelerates the data science pipeline and streamlines the development and deployment of production AI.[^nvidia2023]


Triton Inference Serverは，名前の通り推論専用サーバである．
サービスとしての主な特徴は3点．

- (1) 様々なMLフレームワークをサポート
  - e.g., TensorRT, TensorFlow, Pytorch, ONNX
- (2) 様々な推論環境をサポート
  - インフラ: クラウド，データセンタ，エッジデバイス，組み込みデバイス
  - プロセッサ: NVIDIA GPU, x86, ARM CPU
- (3) 様々な用途に対して最適化されたパフォーマンス
  - リアルタイム推論，バッチ推論，音声・ビデオストリーム, etc


また，推論を高速化・効率化するための技術的な特徴は，主に以下の3点．

- (1) 動的バッチング (Dynamic Batching)，複数モデルの並行実行 (Concurrent Execution) などの機能によってGPU利用率を最大化
- (2) 単一GPU, 同じノードにある複数のGPU，複数のGPUノード間といった様々なレベルの最適化をサポート
- (3) 最適化ツール Triton Model Analyzerによる，推論時のハイパラ最適化


推論の高速化・高効率化を目的にTrironを活用するケースもあれば，多くのMLフレームワークをサポートしていることを活かし推論モデルのインターフェースの標準化の目的で活用されるケースもある模様．

# 読み方

「とらいとん」[^yamasaki2021]


# 特徴

## Dynamic Batching (動的バッチング)

サーバーサイドで、個別に受け付けたサンプルから大きなバッチを作成する機能。

基本的にバッチサイズが大きい方が、GPUのパフォーマンスが高くなる。しかし現実では、クライアントから個別に推論リクエストが来る。指定されたlaytencyなどの制約条件の中で、個別に受けたサンプルを束ねて大きなバッチにしてから推論することで、全体のスループットを向上させる。

参考: [公式Docs: Dynamic Batcher](https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/user_guide/model_configuration.html#dynamic-batcher)

## Concurent Execution (並行実行)

複数のモデルを1つのGPUで並行実行する機能。各モデルの実行スケジュールはTriton Inference Server側で最適化される。唯一の制約はGPUのメモリサイズ。メモリに載る範囲で同時にモデルをサーブできる。

別の種類のモデルの同時実行だけでなく，同じモデルのインスタンスを複数同時実行することもできる．リクエスト数が多いモデルでは，そこそこのバッチサイズの同じモデルを並行して実行することで，大きなバッチでGPUを効率的に使いながら，遅延を下げることができる．

参考: [公式Docs: Concurrent Model Execution](https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/user_guide/architecture.html?highlight=concurrent%20model%20execution#concurrent-model-execution)


## Triton Model Analyzer

複数のモデルの実行に対する、最良の設定を自動的に探索することができるツール。
ユーザがパフォーマンスの要件定義を与え、最良の設定の自動探索を行う。結果はサマリーレポートとして出力され、図なども自動作成される。

最適化できるハイパラは，"Batch Size" や "同時実行するモデルの組み合わせ" など．

参考: [GitHub: triton-inference-server/model_analyzer](https://github.com/triton-inference-server/model_analyzer)

# Ensemble Models (パイプライン処理)

複数のモデルをパイプライン的に実行することも可能．各モデルを通常のTritonの形式で定義し，それを束ねる形の設定ファイルを定義する．これにより，前処理 > 推論 > 後処理 の一連の処理や，複数のモデルを順番に実行するといったことが，１回のリクエストで実現できる．

名前が紛らわしいが，アンサンブル学習ではない．

データの受け渡しの部分もTriton内で処理されるので，一つ一つ推論を実行するよりも速度向上が期待できる．また，パイプラインないで再起ループ (for) や条件分岐 (if-else) などの実装も可能．

参考: [公式Docs: Ensemble Models](https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/user_guide/architecture.html?highlight=concurrent%20model%20execution#ensemble-models)


## Multi-GPU Multi-Node Inference

LLMの実行には大量のメモリが必要で、1枚のGPUカードでは捌けない。(Megatron NVIDIA Turing NLG; 530B parameter; 530G) [^shankar2021]

次のテクニックを活用して、巨大なモデルを複数のGPU・ノードに分割する。

- Pipeline Parallelism (inter-layer)
  - 連続したレイヤーのセットを複数のGPUに分割配置
  - 単一ノードでのGPUリソースの使用率を最大化
- Tensor Parallelism (intra-layer)
  - TBA

マルチノード・マルチGPU対応に関して，LLMなど大規模言語モデルの使用などを想定した [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM) などがリリースされている．

(この項目に関してはどこまでがTritonの範囲かよくわからない部分が多い．今後追加調査が必要.)


## Kubernetes and AI Platform Support

- Dockerコンテナとして使用可能
- Kubernetesのサポート (AWS EKS, Google GKE, Azure AKS, ...)
- Managed Cloud Workflow (Amazon Sagemaker, Azure ML, Google Vertex AI)


# 基本的な使い方

1. 学習モデルをサーバ常にコピー
1. 設定ファイルの作成
1. Triton Serverの起動
1. (Clientを実装してリクエストを投げる.)

# Case Study

ブログ[^shankar2022]で紹介されている Triton Serverの利用例を日本語でまとめる．

- NIO Autonomous Driving ([HP](https://www.nio.com/nad))
  - クラウドとデータセンターで，自動運転車のデータを処理してサービスを提供
  - Ensemble (パイプライン機能) を利用
  - 前処理・後処理をクライアントアプリケーションではなくTritonで実行
  - 前処理は5倍高速化され，全体のスループットを上げると共に，さらに多くのデータをコスパよく処理することを可能にした．
- GH Healthcare
  - さまざまなフレームワーク (e.g., TF, PyTorch) の推論器の標準化のためにTritonを使用
  - 組み込み (X線機器) からオンプレまで，さまざまなハードウェアにデプロイされている.
- Wealthsimple
  - Tritonを用いてCPU環境で推論 (不正の検知など)
  - 様々なフレームワークの標準化に使用
- Tencent
  - 中心的なML基盤でTritonを使用
  - TritonのDynamic Batchingと並行実行により，コストを削減
- Alibaba Intelligent Connectivity
  - スマートスピーカが発話する streaming text の生成に使用
  - Tritonのストリームデータ処理機能を活用し最初のパケットのレイテンシーを短縮
- Yahoo Japan
  - 類似した場所の検索ロジックにおいて，TritonをCPUで使用
  - CPU/GPU上の複数のフレームワークをサポートするため，集中型のML基板に統合
- Airtel
  - Contact Centerのための音声認識 (ASR)に使用
  - Tritonの高速な処理を活用して，より精度が良いASRモデルへの更新
  - 既存環境に比べて，スループットが2倍向上


# Todo (今後調べていきたいこと)

- 他の推論環境との比較 (KServeとの比較)
- DeepstreamとTriton (Ensemble) の比較


[^nvidia2023]: [Nvidia Triton Inference Server](https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/index.html)
[^shankar2022]: [Shankar Chandrasekaran, Neal Vaidya, "Solving AI Inference Challenges with NVIDIA Triton," Nvidia Tech Blog, Sep 21, 2022](https://developer.nvidia.com/blog/solving-ai-inference-challenges-with-nvidia-triton/)
[^yamasaki2021]: [Kazuhiro Yamasaki (NVIDIA Japan), "GPU に推論を: Triton Inference Server でかんたんデプロイ," Medium, Mar 4, 2021.](https://medium.com/nvidiajapan/gpu-for-inference-easy-deploy-by-triton-inference-server-fd2980514af2)
[^shankar2021]: [Shankar Chandrasekaran, and Mahan Salehi, "Fast and Scalable AI Model Deployment with NVIDIA Triton Inference Server," Nvidia Tech Blog, Nov 9, 2021.](https://developer.nvidia.com/blog/fast-and-scalable-ai-model-deployment-with-nvidia-triton-inference-server/)