MLモデルサービング比較:BentoML vs Triton vs Ray Serve で推論APIを構築する
オープンソースラボ編集部 ・ 2026年6月14日
MLモデルサービング比較:BentoML vs Triton vs Ray Serve で推論APIを構築する
🤖 学習済みMLモデルをAPIとして本番に提供するサービングフレームワーク。BentoML・NVIDIA Triton・Ray Serveの特徴を比較します。
MLモデルサービングとは
学習済みモデルをREST APIやgRPCとして公開し、リアルタイム推論を提供するインフラです。スループット・レイテンシー・GPUリソース効率の最適化が主な課題です。
主要ツール比較表
| 項目 | BentoML | Triton Inference Server | Ray Serve |
|---|---|---|---|
| ライセンス | Apache 2.0 | BSD 3-Clause | Apache 2.0 |
| 開発元 | BentoML Inc. | NVIDIA | Anyscale |
| GPU対応 | ○ | ◎ | ◎ |
| 動的バッチ | ◎ | ◎ | ◎ |
| マルチモデル | ◎ | ◎ | ◎ |
| Docker化 | ◎(Bento) | ◎ | ○ |
| A/Bテスト | ○ | △ | ◎ |
| セットアップ難度 | 低 | 高 | 中 |
各ツールの特徴
BentoML
Pythonフレーストに最も統合されたMLサービングフレームワーク。モデルの定義からDockerイメージのビルド・クラウドデプロイまで一貫して扱えます。
主な特徴:
- PyTorch・TensorFlow・scikit-learn・HuggingFace等に対応
bentoml buildでDockerイメージを自動生成(Bento)- 動的バッチングで単一GPU効率を最大化
- Yatai(Kubernetes対応サービングプラットフォーム)と統合
# service.py
import bentoml
from bentoml.io import JSON, NumpyNdarray
# モデルの保存
import numpy as np
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
bentoml.sklearn.save_model("iris_classifier", model)
# サービス定義
iris_clf_runner = bentoml.sklearn.get("iris_classifier:latest").to_runner()
svc = bentoml.Service("iris_classifier_service", runners=[iris_clf_runner])
@svc.api(input=NumpyNdarray(), output=NumpyNdarray())
async def classify(input_data: np.ndarray) -> np.ndarray:
return await iris_clf_runner.predict.async_run(input_data)
# サービス起動
bentoml serve service:svc
# Dockerイメージ生成
bentoml build
bentoml containerize iris_classifier_service:latest
# Kubernetes デプロイ
docker push your-registry/iris-classifier:latest
kubectl apply -f bento-deployment.yaml
向いているケース: Pythonエコシステム・手軽なデプロイ・スタートアップ
NVIDIA Triton Inference Server
NVIDIA製の本格的な推論エンジン。GPU最適化・動的バッチング・マルチモデル同時サービングで最高のスループットを実現します。
主な特徴:
- TensorRT・ONNX・TensorFlow・PyTorchをネイティブサポート
- アンサンブルモデル(複数モデルのパイプライン)
- 並列GPU推論(複数インスタンス)
- Prometheus/Grafanaとのネイティブ統合
# Tritonサーバー起動
docker run --gpus=all -it --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 -v /path/to/models:/models nvcr.io/nvidia/tritonserver:24.01-py3 tritonserver --model-repository=/models
# モデルリポジトリ構造
models/
bert-base/
config.pbtxt
1/
model.onnx
resnet50/
config.pbtxt
1/
model.plan # TensorRT
# Tritonクライアント(Python)
import tritonclient.http as httpclient
import numpy as np
client = httpclient.InferenceServerClient(url="localhost:8000")
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
inputs = [httpclient.InferInput("input", [1, 3, 224, 224], "FP32")]
inputs[0].set_data_from_numpy(input_data)
outputs = [httpclient.InferRequestedOutput("output")]
result = client.infer("resnet50", inputs, outputs=outputs)
print(result.as_numpy("output"))
向いているケース: GPU最大活用・高スループット・NVIDIA環境
Ray Serve
Rayの分散計算基盤上で動くMLサービング。A/Bテスト・Canaryデプロイ・モデルコンポジションが特に強力です。
主な特徴:
- Rayの分散スケジューリングを活用
- HTTP/gRPC両対応
- TrafficPolicyでA/Bテスト・Canaryを設定
- LLMサービングに最適(vLLMとの統合)
# Ray Serve でモデルをサービング
from ray import serve
from transformers import pipeline
@serve.deployment(
num_replicas=2,
ray_actor_options={"num_gpus": 0.5}, # 各レプリカが0.5 GPU
autoscaling_config={"min_replicas": 1, "max_replicas": 10}
)
class SentimentAnalyzer:
def __init__(self):
self.model = pipeline("sentiment-analysis")
async def __call__(self, request):
text = await request.json()
result = self.model(text["text"])
return {"sentiment": result[0]["label"], "score": result[0]["score"]}
# A/Bテスト設定
@serve.deployment
class Router:
def __init__(self, model_v1, model_v2):
self.model_v1 = model_v1
self.model_v2 = model_v2
async def __call__(self, request):
import random
if random.random() < 0.8:
return await self.model_v1.remote(request)
else:
return await self.model_v2.remote(request)
# デプロイ
serve.run(SentimentAnalyzer.bind())
向いているケース: LLMサービング・A/Bテスト・分散スケーリング
選択ガイド
| 状況 | 推奨 |
|---|---|
| Python中心・シンプルデプロイ | BentoML |
| GPU最大活用・高スループット | Triton |
| LLMサービング・A/Bテスト | Ray Serve |
内部リンク
外部リソース
FAQ
Q. vLLMとの違いは何ですか?
vLLMはLLM(GPT等)の推論に特化した高速サービングエンジンです。Ray Serveはvllmをバックエンドに使いながら、スケーリングとルーティングを管理するオーケストレーション層として使えます。
Q. バッチ推論とリアルタイム推論はどう使い分けますか?
バッチ推論(Airflow/Spark等)はスループット重視・レイテンシー許容のケース。リアルタイム推論(BentoML等)はレイテンシー重視のAPIに使います。
Q. ONNX形式に変換するとどんなメリットがありますか?
フレームワーク非依存になり、Triton等の最適化エンジンが使えます。TensorRT変換でGPUスループットが大幅向上するケースも多いです。
Q. BentoMLはLLMのサービングにも使えますか?
はい。OpenLLM(BentoML製)はLLM特化のサービングツールで、Llama・Mistral・Gemma等をBentoMLで簡単にサービングできます。