Pour garantir qu'un modèle respecte les critères de mise en production avant son déploiement, utilisez l'outil d'analyse de modèles pour le benchmarker, profiler ses performances et l'optimiser. Cette rubrique utilise le modèle PyTorch ResNet18 sur des GPU V100 comme exemple.
Prérequis
Assurez-vous d'avoir :
Un cluster ACK Pro (Kubernetes 1.20 ou version ultérieure) avec au moins un nœud accéléré par GPU. Consultez la rubrique Update an ACK cluster.
Un bucket OSS avec un PV et un PVC configurés. Consultez la rubrique Mount a statically provisioned ossfs 1,0 volume.
La dernière version du client Arena installée. Consultez la rubrique Configure the Arena client.
Fonctionnement
Les data scientists optimisent la précision, tandis que les ingénieurs se concentrent sur les performances d'inférence. Effectuez des benchmarks et du profilage avant le déploiement pour vous assurer que le modèle atteint les objectifs de latence et de débit.
Arena fournit des commandes pour chaque phase du cycle de vie du modèle :

| Phase | Objectif |
|---|---|
| Entraînement du modèle | Entraîner le modèle sur un jeu de données |
| Benchmark du modèle | Vérifier si la latence, le débit et l'utilisation du GPU répondent aux exigences |
| Profilage du modèle | Identifier les goulots d'étranglement de performance |
| Optimisation du modèle | Améliorer les performances d'inférence GPU avec des outils tels que TensorRT |
| Service du modèle | Déployer le modèle en tant que service en ligne |
Si le modèle ne répond toujours pas aux exigences après optimisation, répétez le cycle benchmark → profilage → optimisation.
Toutes les commandes d'analyse s'exécutent via arena model analyze. Affichez les sous-commandes :
arena model analyze --help
Résultat :
submit a model analyze job.
Available Commands:
benchmark Submit a model benchmark job
delete Delete a model job
evaluate Submit a model evaluate job
get Get a model job
list List all the model jobs
optimize Submit a model optimize job, this is a experimental feature
profile Submit a model profile job
Étape 1 : Préparer un modèle
Convertissez le modèle ResNet18 au format TorchScript et téléchargez-le sur OSS.
-
Convertissez et enregistrez le modèle :
Paramètre Description model_nameNom du modèle model_platformPlateforme ou framework, tel que TorchScriptouONNXmodel_pathChemin de stockage du modèle. inputsParamètres d'entrée outputsParamètres de sortie import torch import torchvision model = torchvision.models.resnet18(pretrained=True) # Switch the model to eval mode model.eval() # An example input you would normally provide to your model's forward() method dummy_input = torch.rand(1, 3, 224, 224) # Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing traced_script_module = torch.jit.trace(model, dummy_input) # Save the TorchScript model traced_script_module.save("resnet18.pt") Téléchargez
resnet18.ptversoss://bucketname/models/resnet18/resnet18.pt. Consultez la documentation Upload objects.
Étape 2 : Benchmarker le modèle
Évaluez le modèle par rapport aux objectifs de latence, de débit et d'utilisation du GPU. Cet exemple utilise un PVC nommé oss-pvc dans le namespace default.
-
Créez un fichier de configuration de modèle
config.json:{ "model_name": "resnet18", "model_platform": "torchscript", "model_path": "/data/models/resnet18/resnet18.pt", "inputs": [ { "name": "input", "data_type": "float32", "shape": [1, 3, 224, 224] } ], "outputs": [ { "name": "output", "data_type": "float32", "shape": [1000] } ] } Téléchargez
config.jsonversoss://bucketname/models/resnet18/config.json.-
Soumettez la tâche de benchmark :
ImportantLes options
--requestset--durationsont mutuellement exclusives ;--durationest prioritaire si les deux sont définies. Utilisez--requestspour un nombre fixe de requêtes plutôt qu'une limite de temps.Paramètre Description --gpusNombre de GPU à utiliser --dataNom du PVC et chemin de montage --model-config-fileChemin vers le fichier de configuration du modèle --report-pathChemin de sortie pour le rapport de benchmark. --concurrencyNombre de requêtes simultanées --durationDurée du benchmark, en secondes. arena model analyze benchmark \ --name=resnet18-benchmark \ --namespace=default \ --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \ --gpus=1 \ --data=oss-pvc:/data \ --model-config-file=/data/models/resnet18/config.json \ --report-path=/data/models/resnet18 \ --concurrency=5 \ --duration=60 -
Vérifiez l'état de la tâche :
arena model analyze list -ARésultat attendu :
NAMESPACE NAME STATUS TYPE DURATION AGE GPU(Requested) default resnet18-benchmark COMPLETE Benchmark 0s 2d 1 -
Lorsque l'état est
COMPLETE, récupérezbenchmark_result.txtdepuis le répertoire--report-path:Métrique Description Unité p90_latencyTemps de réponse au 90e percentile Millisecondes p95_latencyTemps de réponse au 95e percentile Millisecondes p99_latencyTemps de réponse au 99e percentile Millisecondes min_latencyTemps de réponse le plus rapide Millisecondes max_latencyTemps de réponse le plus lent Millisecondes mean_latencyTemps de réponse moyen Millisecondes median_latencyTemps de réponse médian Millisecondes throughputDébit Requêtes/seconde gpu_mem_usedUtilisation de la mémoire GPU Go gpu_utilizationUtilisation du GPU Pourcentage { "p90_latency": 7.511, "p95_latency": 7.86, "p99_latency": 9.34, "min_latency": 7.019, "max_latency": 12.269, "mean_latency": 7.312, "median_latency": 7.206, "throughput": 136, "gpu_mem_used": 1.47, "gpu_utilization": 21.280 }
Étape 3 : Profiler le modèle
Exécutez arena model analyze profile pour identifier où le modèle passe du temps lors de l'inférence. Le profileur génère un rapport TensorBoard détaillé par opérateur.
-
Soumettez la tâche de profilage :
Paramètre Description --gpusNombre de GPU à utiliser --dataNom du PVC et chemin de montage --model-config-fileChemin vers le fichier de configuration du modèle --report-pathChemin de sortie pour le rapport de profilage. --tensorboardActive TensorBoard pour afficher le rapport de profilage. --tensorboard-imageImage du conteneur TensorBoard. arena model analyze profile \ --name=resnet18-profile \ --namespace=default \ --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \ --gpus=1 \ --data=oss-pvc:/data \ --model-config-file=/data/models/resnet18/config.json \ --report-path=/data/models/resnet18/log/ \ --tensorboard \ --tensorboard-image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 -
Vérifiez l'état de la tâche :
arena model analyze list -ARésultat attendu :
NAMESPACE NAME STATUS TYPE DURATION AGE GPU(Requested) default resnet18-profile COMPLETE Profile 13s 2d 1 -
Vérifiez que le service TensorBoard est en cours d'exécution :
kubectl get service -n defaultRésultat attendu :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE resnet18-profile-tensorboard NodePort 172.16.158.170 <none> 6006:30582/TCP 2d20h -
Redirigez le port pour accéder à TensorBoard localement :
kubectl port-forward svc/resnet18-profile-tensorboard -n default 6006:6006Résultat attendu :
Forwarding from 127.0.X.X:6006 -> 6006 Forwarding from [::1]:6006 -> 6006 -
Ouvrez
http://localhost:6006dans un navigateur. Dans le volet de navigation de gauche, cliquez sur Views pour explorer les données de performance et identifier les opérateurs goulots d'étranglement.
Étape 4 : Optimiser le modèle
Après avoir identifié les goulots d'étranglement, soumettez une tâche d'optimisation. Par défaut, Arena utilise TensorRT pour optimiser le modèle pour l'inférence GPU.
-
Soumettez la tâche d'optimisation :
Paramètre Description --gpusNombre de GPU à utiliser --dataNom du PVC et chemin de montage --optimizerMoteur d'optimisation. Valeurs valides : tensorrt(par défaut),aiacc-torch--model-config-fileChemin vers le fichier de configuration du modèle --export-pathChemin de sortie pour le modèle optimisé. arena model analyze optimize \ --name=resnet18-optimize \ --namespace=default \ --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \ --gpus=1 \ --data=oss-pvc:/data \ --optimizer=tensorrt \ --model-config-file=/data/models/resnet18/config.json \ --export-path=/data/models/resnet18 -
Vérifiez l'état de la tâche :
arena model analyze list -ARésultat attendu :
NAMESPACE NAME STATUS TYPE DURATION AGE GPU(Requested) default resnet18-optimize COMPLETE Optimize 16s 2d 1 Lorsque l'état est
COMPLETE, le modèle optimiséopt_resnet18.ptest enregistré dans le répertoire--export-path.-
Relancez le benchmark avec le modèle optimisé. Mettez à jour
model_pathdansconfig.jsonavecopt_resnet18.pt, puis répétez l'étape 2. Le tableau suivant compare les résultats avant et après l'optimisation TensorRT. Si le modèle ne répond toujours pas à vos exigences, répétez les étapes 3 et 4.Métrique Avant optimisation Après optimisation p90_latency7,511 ms 5,162 ms p95_latency7,86 ms 5,428 ms p99_latency9,34 ms 6,64 ms min_latency7,019 ms 4,827 ms max_latency12,269 ms 8,426 ms mean_latency7,312 ms 5,046 ms median_latency7,206 ms 4,972 ms throughput136 req/s 198 req/s gpu_mem_used1,47 Go 1,6 Go gpu_utilization21,280 % 10,912 %
Étape 5 : Déployer le modèle
Une fois que le modèle répond aux exigences de performance, déployez-le avec NVIDIA Triton Inference Server.
-
Créez le fichier de configuration Triton
config.pbtxt:ImportantNe modifiez pas le nom du fichier.
Consultez Model Repository pour plus de détails sur la configuration.
name: "resnet18" platform: "pytorch_libtorch" max_batch_size: 1 default_model_filename: "opt_resnet18.pt" input [ { name: "input__0" format: FORMAT_NCHW data_type: TYPE_FP32 dims: [ 3, 224, 224 ] } ] output [ { name: "output__0", data_type: TYPE_FP32, dims: [ 1000 ] } ] -
Créez cette structure de répertoires dans OSS :
Le répertoire
1/représente la version du modèle (convention Triton). Un référentiel peut stocker plusieurs versions. Consultez Model Repository .oss://bucketname/triton/model-repository/ resnet18/ config.pbtxt 1/ opt_resnet18.pt -
Déployez le modèle avec Arena. Choisissez le mode GPU en fonction de votre charge de travail :
-
Mode exclusif GPU — Un modèle par GPU. À utiliser pour une inférence haute stabilité où les modèles ne doivent pas partager les ressources GPU.
arena serve triton \ --name=resnet18-serving \ --gpus=1 \ --replicas=1 \ --image=nvcr.io/nvidia/tritonserver:21.05-py3 \ --data=oss-pvc:/data \ --model-repository=/data/triton/model-repository \ --allow-metrics=true -
Mode partagé GPU — Plusieurs modèles partagent un GPU avec des limites de mémoire par modèle. À utiliser pour une inférence rentable ou de longue traîne. Définissez
--gpumemorysur la mémoire GPU (Go) par pod en fonction degpu_mem_usedissu du benchmark — sigpu_mem_usedest de 1,6 Go, définissez--gpumemory=2. Doit être un entier positif.arena serve triton \ --name=resnet18 \ --gpumemory=2 \ --replicas=1 \ --image=nvcr.io/nvidia/tritonserver:21.12-py3 \ --data=oss-pvc:/data \ --model-repository=/data/triton/model-repository \ --allow-metrics=true
-
-
Vérifiez le déploiement :
arena serve list -ARésultat attendu :
NAMESPACE NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS GPU default resnet18-serving Triton 202202141817 1 1 172.16.147.248 RESTFUL:8000,GRPC:8001 1Le modèle est prêt lorsque
AVAILABLEest égal àDESIRED.