Déploie Ultralytics YOLOv5 avec DeepSparse de Neural Magic pour des performances comparables à celles d’un GPU sur des CPU
Optimise l’entraînement et le déploiement de tes modèles Ultralytics YOLOv5 avec DeepSparse de Neural Magic, pour atteindre des performances comparables à celles d’un GPU sur des CPU. Accélère tes déploiements YOLOv5 et rends-les évolutifs.

Tu veux accélérer l'entraînement et le déploiement de tes modèles YOLOv5 ? Nous avons la solution qu'il te faut ! Découvre notre nouveau partenaire, Neural Magic. Neural Magic proposant des outils logiciels qui privilégient les performances maximales des modèles et la simplicité des workflows, il est tout naturel que nous nous soyons associés pour offrir une solution qui améliore encore le processus de déploiement de YOLOv5.
DeepSparse est le runtime d'inférence CPU de Neural Magic. Il exploite la parcimonie et l'arithmétique en faible précision au sein des réseaux neuronaux pour offrir des performances exceptionnelles sur du matériel standard. Par exemple, par rapport à la référence ONNX Runtime, DeepSparse offre une accélération de 5,8x avec YOLOv5s sur la même machine !

Pour la première fois, tes charges de travail de deep learning peuvent répondre aux exigences de performances de la production sans la complexité ni les coûts des accélérateurs matériels. En termes simples, DeepSparse t'offre les performances des GPU et la simplicité des logiciels :
- Déploiements flexibles : exécute tes charges de travail de manière cohérente dans le cloud, les centres de données et l'edge, avec n'importe quel fournisseur de matériel
- Évolutivité infinie : augmente la capacité avec Kubernetes standard, passe à l'échelle verticalement jusqu'à des centaines de cœurs ou profite d'une abstraction complète avec le serverless
- Intégration facile : utilise des API claires pour intégrer ton modèle à une application et le superviser en production
Atteindre des performances dignes d'un GPU sur des CPU standard#
DeepSparse exploite la parcimonie des modèles pour accélérer les performances.
La sparsification par élagage et quantification permet de réduire d'un ordre de grandeur la taille et la puissance de calcul nécessaires à l'exécution d'un réseau, tout en maintenant une grande précision. DeepSparse tient compte de la parcimonie : il ignore les opérations multiply-add dont le résultat est nul et réduit la quantité de calcul lors d'une passe avant. Comme le calcul parcimonieux est limité par la mémoire, DeepSparse exécute le réseau en profondeur, en divisant le problème en Tensor Columns, des bandes verticales de calcul qui tiennent dans le cache.

Les réseaux parcimonieux avec calcul compressé, exécutés en profondeur dans le cache, permettent à DeepSparse d'offrir des performances dignes d'un GPU sur les CPU !
Créer une version parcimonieuse d'Ultralytics YOLOv5 entraînée sur des données personnalisées#
Le dépôt de modèles open source de Neural Magic, SparseZoo, contient des checkpoints préalablement sparsifiés pour chaque modèle YOLOv5. Avec SparseML, intégré à Ultralytics, tu peux affiner un checkpoint parcimonieux sur tes données à l'aide d'une seule commande CLI.
Déployer Ultralytics YOLOv5 avec DeepSparse#
Installer DeepSparse#
Exécute la commande suivante pour installer DeepSparse. Nous te recommandons d'utiliser un environnement virtuel avec Python.
pip install deepsparse[server,yolo,onnxruntime]Récupérer un fichier ONNX#
DeepSparse accepte un modèle au format ONNX, fourni sous l'une des formes suivantes :
- Un chemin local vers un modèle ONNX
- Un stub SparseZoo qui identifie un modèle dans SparseZoo
Nous allons comparer le YOLOv5s dense standard au YOLOv5s élagué et quantifié, identifiés par les stubs SparseZoo suivants :
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneDéployer un modèle#
DeepSparse fournit des API pratiques pour intégrer ton modèle à une application.
Pour essayer les exemples de déploiement ci-dessous, télécharge une image d'exemple et enregistre-la sous le nom basilica.jpg avec la commande suivante :
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpgAPI Python#
Les pipelines encapsulent le prétraitement et le post-traitement des sorties autour du runtime, fournissant une interface claire pour ajouter DeepSparse à une application. L'intégration DeepSparse-Ultralytics comprend un Pipeline prêt à l'emploi qui accepte des images brutes et renvoie les boîtes englobantes.
Crée un Pipeline et exécute l'inférence :
from deepsparse import Pipeline
# list of images in local filesystem
images = ["basilica.jpg"]
# create Pipeline
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
task="yolo",
model_path=model_stub,
)
# run inference on images, receive bounding boxes + classes
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)Si tu exécutes le programme dans le cloud, il est possible qu'une erreur indique que open-cv ne trouve pas libGL.so.1. L'exécution de la commande suivante sur Ubuntu l'installe :
apt-get install libgl1-mesa-glxServeur HTTP#
DeepSparse Server s'exécute au-dessus du framework web FastAPI et du serveur web Uvicorn, très répandus. Avec une seule commande CLI, tu peux facilement configurer un endpoint de service de modèle avec DeepSparse. Le Server prend en charge n'importe quel Pipeline de DeepSparse, notamment la détection d'objets avec Ultralytics YOLOv5, ce qui te permet d'envoyer des images brutes à l'endpoint et de recevoir les boîtes englobantes.
Lance le Server avec le YOLOv5s élagué et quantifié :
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneVoici un exemple de requête utilisant le package requests de Python :
import requests, json
# list of images for inference (local files on client side)
path = ['basilica.jpg']
files = [('request', open(img, 'rb')) for img in path]
# send request over HTTP to /predict/from_files endpoint
url = 'http://0.0.0.0:5543/predict/from_files'
resp = requests.post(url=url, files=files)
# response is returned in JSON
annotations = json.loads(resp.text) # dictionary of annotation results
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]CLI d'annotation#
Tu peux également utiliser la commande annotate pour que le moteur enregistre une photo annotée sur le disque. Essaie --source 0 pour annoter le flux de ta webcam en direct !
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpgL'exécution de la commande ci-dessus créera un dossier annotation-results et y enregistrera l'image annotée.

Évaluer les performances#
À l'aide du script d'évaluation de DeepSparse, nous comparerons le débit de DeepSparse à celui d'ONNX Runtime sur YOLOv5s.
Les évaluations ont été réalisées sur une instance AWS c6i.8xlarge (16 cœurs).
Comparaison des performances avec une taille de batch de 32#
Référence ONNX Runtime#
Avec une taille de batch de 32, ONNX Runtime atteint 42 images/s avec le YOLOv5s dense standard :
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntimeOriginal Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Batch Size: 32 Scenario: sync Throughput (items/sec): 41.9025
Performances de DeepSparse en mode dense#
Bien que DeepSparse offre ses meilleures performances avec des modèles parcimonieux optimisés, il fonctionne également bien avec le YOLOv5s dense standard.
Avec une taille de batch de 32, DeepSparse atteint 70 images/s avec le YOLOv5s dense standard, soit une amélioration des performances de 1,7x par rapport à ORT !
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Batch Size: 32 Scenario: sync Throughput (items/sec): 69.5546
Performances de DeepSparse en mode parcimonieux#
Lorsque la parcimonie est appliquée au modèle, les gains de performances de DeepSparse par rapport à ONNX Runtime sont encore plus importants.
Avec une taille de batch de 32, DeepSparse atteint 241 images/s avec le YOLOv5s élagué et quantifié, soit une amélioration des performances de 5,8x par rapport à ORT !
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none Batch Size: 32 Scenario: sync Throughput (items/sec): 241.2452
Comparaison des performances avec une taille de batch de 1#
DeepSparse est également capable d'accélérer les performances par rapport à ONNX Runtime dans le cas sensible à la latence d'une taille de batch de 1.
Référence ONNX Runtime#
Avec une taille de batch de 1, ONNX Runtime atteint 48 images/s avec le YOLOv5s standard et dense.
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntimeOriginal Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Batch Size: 1 Scenario: sync Throughput (items/sec): 48.0921
Performances de DeepSparse en mode parcimonieux#
Lorsque la parcimonie est appliquée au modèle, les gains de performances de DeepSparse par rapport à ONNX Runtime sont encore plus importants.
Avec une taille de batch de 1, DeepSparse atteint 135 images/s avec le YOLOv5s élagué et quantifié, soit une amélioration des performances de 2,8x par rapport à ONNX Runtime !
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 1 -nstreams 1Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none Batch Size: 1 Scenario: sync Throughput (items/sec): 134.9468
Comme les instances c6i.8xlarge disposent d'instructions VNNI, le débit de DeepSparse peut être encore augmenté si les poids sont élagués par blocs de 4.
Avec une taille de batch de 1, DeepSparse atteint 180 éléments/s avec un YOLOv5s élagué et quantifié par blocs de 4, soit un gain de performances de 3,7x par rapport à ONNX Runtime !
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni Batch Size: 1 Scenario: sync Throughput (items/sec): 179.7375
Et voilà ! Tu es prêt à optimiser ton déploiement de YOLOv5 avec DeepSparse.
Pour commencer avec Ultralytics YOLOv5 et DeepSparse#
Pour nous contacter, rejoins notre communauté et partage tes questions et commentaires. Consulte le dépôt Ultralytics YOLOv5 ainsi que la documentation complète de Neural Magic pour déployer YOLOv5.
Chez Ultralytics, nous établissons des partenariats commerciaux avec d'autres startups afin de contribuer au financement de la recherche et du développement de nos formidables outils open source, comme YOLOv5, pour qu'ils restent gratuits pour tout le monde. Cet article peut contenir des liens d'affiliation vers ces partenaires.









