triton
NVIDIA Triton Inference Serverは、AIモデルを大規模に展開するためのツールで、様々なフレームワークに対応し、GPU/CPUを活用して高速かつ低遅延な推論を実現するSkill。
📜 元の英語説明(参考)
NVIDIA Triton Inference Server for deploying AI models at scale. Supports multiple frameworks (ONNX, TensorRT, PyTorch, TensorFlow), model ensembles, dynamic batching, model versioning, and GPU/CPU inference with high throughput and low latency.
🇯🇵 日本人クリエイター向け解説
NVIDIA Triton Inference Serverは、AIモデルを大規模に展開するためのツールで、様々なフレームワークに対応し、GPU/CPUを活用して高速かつ低遅延な推論を実現するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o triton.zip https://jpskill.com/download/15495.zip && unzip -o triton.zip && rm triton.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15495.zip -OutFile "$d\triton.zip"; Expand-Archive "$d\triton.zip" -DestinationPath $d -Force; ri "$d\triton.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
triton.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
tritonフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
NVIDIA Triton Inference Server
Docker でのクイックスタート
# start_triton.sh — モデルリポジトリで Triton Inference Server を起動します
# モデルリポジトリの構造を作成します
mkdir -p model_repository/my_model/1
# Triton を起動します
docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 \
-v $(pwd)/model_repository:/models \
nvcr.io/nvidia/tritonserver:24.01-py3 \
tritonserver --model-repository=/models
# ポート: 8000=HTTP, 8001=gRPC, 8002=metrics
モデルリポジトリの構造
# モデルリポジトリのレイアウト — 各モデルは config と番号付きのバージョンディレクトリを持ちます
model_repository/
├── text_classifier/
│ ├── config.pbtxt
│ ├── 1/
│ │ └── model.onnx
│ └── 2/
│ └── model.onnx
├── image_model/
│ ├── config.pbtxt
│ └── 1/
│ └── model.plan # TensorRT エンジン
└── ensemble_pipeline/
├── config.pbtxt
└── 1/ # アンサンブル用は空
モデルの設定
# config.pbtxt — ONNX テキスト分類モデルの設定
name: "text_classifier"
platform: "onnxruntime_onnx"
max_batch_size: 64
input [
{
name: "input_ids"
data_type: TYPE_INT64
dims: [ 128 ]
},
{
name: "attention_mask"
data_type: TYPE_INT64
dims: [ 128 ]
}
]
output [
{
name: "logits"
data_type: TYPE_FP32
dims: [ 2 ]
}
]
dynamic_batching {
preferred_batch_size: [ 8, 16, 32 ]
max_queue_delay_microseconds: 100
}
instance_group [
{
count: 2
kind: KIND_GPU
gpus: [ 0 ]
}
]
HTTP クライアント
# http_client.py — HTTP 経由で推論リクエストを送信します
import requests
import numpy as np
TRITON_URL = "http://localhost:8000"
# サーバーのヘルスチェック
health = requests.get(f"{TRITON_URL}/v2/health/ready")
print(f"Server ready: {health.status_code == 200}")
# 推論リクエストを送信します
input_ids = np.random.randint(0, 1000, (1, 128)).tolist()
attention_mask = np.ones((1, 128)).astype(int).tolist()
payload = {
"inputs": [
{"name": "input_ids", "shape": [1, 128], "datatype": "INT64", "data": input_ids},
{"name": "attention_mask", "shape": [1, 128], "datatype": "INT64", "data": attention_mask},
],
}
response = requests.post(
f"{TRITON_URL}/v2/models/text_classifier/infer",
json=payload,
)
result = response.json()
print(f"Output: {result['outputs'][0]['data']}")
Triton Python クライアント (tritonclient)
# grpc_client.py — Triton 用の高性能 gRPC クライアント
# pip install tritonclient[all]
import tritonclient.grpc as grpcclient
import numpy as np
client = grpcclient.InferenceServerClient(url="localhost:8001")
# モデルのステータスを確認します
print(f"Server live: {client.is_server_live()}")
print(f"Model ready: {client.is_model_ready('text_classifier')}")
# 入力を準備します
input_ids = np.random.randint(0, 1000, (4, 128)).astype(np.int64) # バッチサイズ 4
attention_mask = np.ones((4, 128), dtype=np.int64)
inputs = [
grpcclient.InferInput("input_ids", input_ids.shape, "INT64"),
grpcclient.InferInput("attention_mask", attention_mask.shape, "INT64"),
]
inputs[0].set_data_from_numpy(input_ids)
inputs[1].set_data_from_numpy(attention_mask)
outputs = [grpcclient.InferRequestedOutput("logits")]
result = client.infer("text_classifier", inputs, outputs=outputs)
logits = result.as_numpy("logits")
print(f"Batch output shape: {logits.shape}")
Python バックエンド (カスタムロジック)
# model_repository/preprocess/1/model.py — Python バックエンドによるカスタム前処理
import triton_python_backend_utils as pb_utils
import numpy as np
import json
class TritonPythonModel:
def initialize(self, args):
self.model_config = json.loads(args["model_config"])
def execute(self, requests):
responses = []
for request in requests:
raw_text = pb_utils.get_input_tensor_by_name(request, "raw_text")
text = raw_text.as_numpy()[0].decode("utf-8")
# トークン化 (簡略化)
tokens = [ord(c) for c in text[:128]]
tokens += [0] * (128 - len(tokens))
input_ids = np.array([tokens], dtype=np.int64)
output_tensor = pb_utils.Tensor("input_ids", input_ids)
responses.append(pb_utils.InferenceResponse([output_tensor]))
return responses
モデルアンサンブル
# config.pbtxt — 前処理と推論を組み合わせたアンサンブルパイプライン
name: "ensemble_pipeline"
platform: "ensemble"
max_batch_size: 64
input [ { name: "raw_text" data_type: TYPE_STRING dims: [ 1 ] } ]
output [ { name: "logits" data_type: TYPE_FP32 dims: [ 2 ] } ]
ensemble_scheduling {
step [
{
model_name: "preprocess"
model_version: -1
input_map { key: "raw_text" value: "raw_text" }
output_map { key: "input_ids" value: "preprocessed_ids" }
},
{
model_name: "text_classifier"
model_version: -1
input_map { key: "input_ids" value: "preprocessed_ids" }
output_map { key: "logits" value: "logits" }
}
]
}
主要な概念
- Model repository: ディレクトリ構造は、利用可能なモデルとバージョンを定義します
- Dynamic batching: リクエストを自動的にバッチに結合して、GPU 効率を高めます
- Multi-framework: ONNX、TensorRT、PyTorch、TensorFlow、および Python モデルをまとめて提供します
- Ensembles: モデルをパイプラインに連結します (preprocess → infer → postprocess)
- Model versioning: 複数のバージョンを同時にデプロイします。それらの間でトラフィックをルーティングします
- Instance groups: GPU/CPU の配置とモデルインスタンスの数を制御します
- Metrics: レイテンシとスループットを監視するためのポート 8002 の Prometheus メトリクス
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
NVIDIA Triton Inference Server
Quick Start with Docker
# start_triton.sh — Launch Triton Inference Server with a model repository
# Create model repository structure
mkdir -p model_repository/my_model/1
# Start Triton
docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 \
-v $(pwd)/model_repository:/models \
nvcr.io/nvidia/tritonserver:24.01-py3 \
tritonserver --model-repository=/models
# Ports: 8000=HTTP, 8001=gRPC, 8002=metrics
Model Repository Structure
# Model repository layout — each model has a config and numbered version directories
model_repository/
├── text_classifier/
│ ├── config.pbtxt
│ ├── 1/
│ │ └── model.onnx
│ └── 2/
│ └── model.onnx
├── image_model/
│ ├── config.pbtxt
│ └── 1/
│ └── model.plan # TensorRT engine
└── ensemble_pipeline/
├── config.pbtxt
└── 1/ # Empty for ensembles
Model Configuration
# config.pbtxt — Configuration for an ONNX text classification model
name: "text_classifier"
platform: "onnxruntime_onnx"
max_batch_size: 64
input [
{
name: "input_ids"
data_type: TYPE_INT64
dims: [ 128 ]
},
{
name: "attention_mask"
data_type: TYPE_INT64
dims: [ 128 ]
}
]
output [
{
name: "logits"
data_type: TYPE_FP32
dims: [ 2 ]
}
]
dynamic_batching {
preferred_batch_size: [ 8, 16, 32 ]
max_queue_delay_microseconds: 100
}
instance_group [
{
count: 2
kind: KIND_GPU
gpus: [ 0 ]
}
]
HTTP Client
# http_client.py — Send inference requests via HTTP
import requests
import numpy as np
TRITON_URL = "http://localhost:8000"
# Check server health
health = requests.get(f"{TRITON_URL}/v2/health/ready")
print(f"Server ready: {health.status_code == 200}")
# Send inference request
input_ids = np.random.randint(0, 1000, (1, 128)).tolist()
attention_mask = np.ones((1, 128)).astype(int).tolist()
payload = {
"inputs": [
{"name": "input_ids", "shape": [1, 128], "datatype": "INT64", "data": input_ids},
{"name": "attention_mask", "shape": [1, 128], "datatype": "INT64", "data": attention_mask},
],
}
response = requests.post(
f"{TRITON_URL}/v2/models/text_classifier/infer",
json=payload,
)
result = response.json()
print(f"Output: {result['outputs'][0]['data']}")
Triton Python Client (tritonclient)
# grpc_client.py — High-performance gRPC client for Triton
# pip install tritonclient[all]
import tritonclient.grpc as grpcclient
import numpy as np
client = grpcclient.InferenceServerClient(url="localhost:8001")
# Check model status
print(f"Server live: {client.is_server_live()}")
print(f"Model ready: {client.is_model_ready('text_classifier')}")
# Prepare inputs
input_ids = np.random.randint(0, 1000, (4, 128)).astype(np.int64) # Batch of 4
attention_mask = np.ones((4, 128), dtype=np.int64)
inputs = [
grpcclient.InferInput("input_ids", input_ids.shape, "INT64"),
grpcclient.InferInput("attention_mask", attention_mask.shape, "INT64"),
]
inputs[0].set_data_from_numpy(input_ids)
inputs[1].set_data_from_numpy(attention_mask)
outputs = [grpcclient.InferRequestedOutput("logits")]
result = client.infer("text_classifier", inputs, outputs=outputs)
logits = result.as_numpy("logits")
print(f"Batch output shape: {logits.shape}")
Python Backend (Custom Logic)
# model_repository/preprocess/1/model.py — Custom preprocessing with Python backend
import triton_python_backend_utils as pb_utils
import numpy as np
import json
class TritonPythonModel:
def initialize(self, args):
self.model_config = json.loads(args["model_config"])
def execute(self, requests):
responses = []
for request in requests:
raw_text = pb_utils.get_input_tensor_by_name(request, "raw_text")
text = raw_text.as_numpy()[0].decode("utf-8")
# Tokenize (simplified)
tokens = [ord(c) for c in text[:128]]
tokens += [0] * (128 - len(tokens))
input_ids = np.array([tokens], dtype=np.int64)
output_tensor = pb_utils.Tensor("input_ids", input_ids)
responses.append(pb_utils.InferenceResponse([output_tensor]))
return responses
Model Ensemble
# config.pbtxt — Ensemble pipeline combining preprocessing and inference
name: "ensemble_pipeline"
platform: "ensemble"
max_batch_size: 64
input [ { name: "raw_text" data_type: TYPE_STRING dims: [ 1 ] } ]
output [ { name: "logits" data_type: TYPE_FP32 dims: [ 2 ] } ]
ensemble_scheduling {
step [
{
model_name: "preprocess"
model_version: -1
input_map { key: "raw_text" value: "raw_text" }
output_map { key: "input_ids" value: "preprocessed_ids" }
},
{
model_name: "text_classifier"
model_version: -1
input_map { key: "input_ids" value: "preprocessed_ids" }
output_map { key: "logits" value: "logits" }
}
]
}
Key Concepts
- Model repository: Directory structure defines available models and versions
- Dynamic batching: Automatically combines requests into batches for GPU efficiency
- Multi-framework: Serve ONNX, TensorRT, PyTorch, TensorFlow, and Python models together
- Ensembles: Chain models into pipelines (preprocess → infer → postprocess)
- Model versioning: Deploy multiple versions simultaneously; route traffic between them
- Instance groups: Control GPU/CPU placement and number of model instances
- Metrics: Prometheus metrics at port 8002 for monitoring latency and throughput