Introduction
Triton Inference Server, développé par NVIDIA, est une solution open-source puissante pour déployer et servir des modèles de machine learning en production. Contrairement à des serveurs custom, Triton supporte nativement de multiples frameworks (TensorFlow, PyTorch, ONNX, etc.), optimise l'inférence sur GPU/CPU, et gère le scaling dynamique via Kubernetes ou Docker.
Pourquoi l'utiliser en 2026 ? Avec l'essor de l'IA générative et des pipelines MLOps, Triton excelle dans les environnements hétérogènes : batching automatique, model ensemble, et métriques intégrées. Ce tutoriel beginner vous guide pour un setup complet : générer un modèle ONNX simple (régression linéaire), configurer le repository de modèles, lancer via Docker, et interroger via client Python.
À la fin, vous aurez un serveur d'inférence fonctionnel, prêt pour des apps réelles. Temps estimé : 20 minutes. Pas besoin de GPU – ça marche sur CPU ! (128 mots)
Prérequis
- Docker installé (version 20+ ; téléchargez ici)
- Python 3.10+ avec pip
- Accès internet pour pull images Docker et pip installs
- 2 Go RAM libre
- Connaissances basiques en terminal et Python (pas de ML avancé requis)
docker --version et python --version pour vérifier.Créer la structure du projet
#!/bin/bash
mkdir -p triton-tutorial/models/simple_regression/1
cd triton-tutorial
# Installer les dépendances Python
pip install scikit-learn==1.5.1 skl2onnx==1.17.0 onnxruntime==1.19.2 numpy==2.1.1
# Créer un fichier vide pour le modèle (sera généré ensuite)
touch models/simple_regression/1/model.onnx
echo "Structure créée : models/simple_regression/1/ prêt pour config et modèle."Ce script initialise le dossier projet avec la hiérarchie Triton requise : models/. Il installe les libs pour générer un modèle ONNX via scikit-learn. Évitez les espaces dans les noms de dossiers pour prévenir les erreurs de montage Docker.
Générer le modèle ONNX simple
import numpy as np
import sklearn
from sklearn.linear_model import LinearRegression
import skl2onnx
# Données d'exemple : y = 2*x + 1
X = np.array([[1.0], [2.0], [3.0], [4.0], [5.0]])
y = np.array([3.0, 5.0, 7.0, 9.0, 11.0])
# Entraîner le modèle
model = LinearRegression()
model.fit(X, y)
# Exporter en ONNX
initial_type = [('input', np.float32, [1])]
onnx_model = skl2onnx.convert_sklearn(model, initial_types=initial_type, target_opset=15)
# Sauvegarder
import os
os.makedirs('models/simple_regression/1', exist_ok=True)
with open('models/simple_regression/1/model.onnx', 'wb') as f:
skl2onnx.save_model(onnx_model, f)
print('Modèle ONNX généré : y ≈ 2*x + 1')
print('Test local :', model.predict([[6.0]])) # Devrait ≈13Ce code crée un modèle de régression linéaire simple (fonction y=2x+1), l'entraîne sur 5 points, et l'exporte en ONNX pour compatibilité Triton. Utilisez target_opset=15 pour la stabilité. Piège : vérifiez les shapes d'input/output car Triton est strict sur les dims.
Configurer le modèle (config.pbtxt)
name: "simple_regression"
platform: "onnxruntime_onnx"
max_batch_size: 128
input {
name: "input"
data_type: TYPE_FP32
dims: [ 1 ]
}
output {
name: "variable"
data_type: TYPE_FP32
dims: [ 1 ]
}
instance_group [
{
count: 1
kind: KIND_CPU
}
]
optimization {
cpu {
separate: true # Optimise pour CPU
}
}Ce fichier config.pbtxt définit le nom, la plateforme ONNX, les inputs/outputs (shape [1] pour x scalaire), et active le backend CPU. max_batch_size:128 permet le batching. Évitez les mismatches dims : input 'input' FP32 vecteur 1D, output 'variable'.
Lancer le serveur Triton
#!/bin/bash
cd triton-tutorial
# Pull image Triton (version 2026-compatible, CPU/GPU)
docker pull nvcr.io/nvidia/tritonserver:24.08-py3
# Lancer serveur : expose HTTP gRPC metrics
# Monte le repo modèles
docker run --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 \
-v $(pwd)/models:/models \
nvcr.io/nvidia/tritonserver:24.08-py3 \
tritonserver --model-repository=/models --log-verbose=1
# Ctrl+C pour arrêter. Vérifiez logs : 'Started HTTPService' et 'simple_regression INFERENCE READY'Ce script pull l'image officielle Triton et lance le serveur avec montage volume pour les modèles. Ports : 8000(HTTP), 8001(gRPC), 8002(métriques). --log-verbose=1 aide debug. Piège : assurez models/ accessible ; sur GPU ajoutez --gpus all et NVIDIA Container Toolkit.
Client Python pour tester l'inférence
import tritonclient.http as httpclient
import numpy as np
# Connexion HTTP au serveur local
triton_client = httpclient.InferenceServerClient(url="localhost:8000")
# Préparer input : x=6.0 → attendu ~13
input_data = np.array([6.0], dtype=np.float32)
input_tensor = httpclient.InferInput("input", [1], "FP32")
input_tensor.set_data_from_numpy(input_data)
output_tensor = httpclient.InferRequestedOutput("variable")
# Inférence
results = triton_client.infer(model_name="simple_regression", inputs=[input_tensor], outputs=[output_tensor])
prediction = results.as_numpy("variable")
print(f"Prédiction pour x=6 : {prediction[0]:.2f} (attendu ~13)")
# Test batch
batch_inputs = np.array([[6.0], [7.0]], dtype=np.float32)
batch_input = httpclient.InferInput("input", [2, 1], "FP32")
batch_input.set_data_from_numpy(batch_inputs)
batch_results = triton_client.infer(model_name="simple_regression", inputs=[batch_input], outputs=[output_tensor])
print(f"Batch : {batch_results.as_numpy('variable')} (attendu ~13,15)")Ce client utilise tritonclient[http] (pip install tritonclient[all]) pour query HTTP. Input/output match config.pbtxt. Teste single et batch. Piège : installez pip install tritonclient[all]==2.48.0 avant ; vérifiez serveur up avec curl localhost:8000/v2/health/ready.
Vérification et monitoring
Une fois lancé, accédez à http://localhost:8002/metrics pour Prometheus. Testez health : curl http://localhost:8000/v2/health/ready (retourne 200 OK). Logs Docker montrent 'READY'. Échelle avec docker stats ou Kubernetes pour prod.
Bonnes pratiques
- Versionnez modèles : Utilisez
models/mon_modele/v2/pour updates sans downtime. - Sécurisez : Ajoutez
--api-timeout 60 --model-control-mode explicitet auth TLS en prod. - Optimisez : Activez
dynamic_batchingdans config.pbtxt pour throughput x10. - Multi-modèles : Ajoutez plusieurs dossiers sous
models/pour ensemble IA. - CI/CD : Intégrez avec GitHub Actions pour rebuild repo auto.
Erreurs courantes à éviter
- Dims mismatch : Input shape dans config.pbtxt != client → 'INVALID_ARGUMENT'.
- Modèle non trouvé : Vérifiez montage volume et nom exact (case-sensitive).
- Port occupé : Tuez processus sur 8000/8001 ou changez
-p 8001:8001. - Pas de backend : Pour ONNX, image-py3 suffit ; GPU nécessite CUDA toolkit.
Pour aller plus loin
Maîtrisez Triton avancé : Docs officielles NVIDIA.
Découvrez nos formations Learni sur MLOps et IA pour scaler en Kubernetes avec Triton.
Ressources : GitHub Triton, Exemples NGC.