Neural MagicDeepSparse
Bienvenue Ă l'IA logicielle.
Ce guide explique comment déployer YOLOv5 avec Neural Magic's DeepSparse.
DeepSparse est un runtime d'inférence avec des performances exceptionnelles sur les CPU. Par exemple, par rapport à la référence ONNX Runtime, DeepSparse offre une accélération de 5,8 fois pour YOLOv5s, fonctionnant sur la même machine !
Pour la première fois, vos charges de travail d'apprentissage profond peuvent répondre aux exigences de performance de la production sans la complexité et les coûts des accélérateurs matériels. En d'autres termes, DeepSparse vous offre les performances des GPU et la simplicité d'un logiciel :
- Déploiements flexibles: Exécution cohérente dans le nuage, le centre de données et la périphérie avec n'importe quel fournisseur de matériel, de Intel à AMD en passant par ARM.
- Évolutivité infinie: Évolution verticale vers des centaines de cœurs, vers l'extérieur avec Kubernetes standard, ou entièrement abstraite avec Serverless.
- Intégration facile: Des API propres pour intégrer votre modèle dans une application et le contrôler en production.
Comment DeepSparse atteint-il des performances de classe GPU?
DeepSparse tire parti de la rareté du modèle pour accélérer les performances.
La sparification par élagage et quantification est une technique largement étudiée, qui permet des réductions de l'ordre de grandeur de la taille et du calcul nécessaires à l'exécution d'un réseau, tout en conservant une grande précision. DeepSparse est conscient de l'éparpillement, ce qui signifie qu'il saute les paramètres mis à zéro, réduisant ainsi la quantité de calcul dans un passage en avant. Étant donné que le calcul clairsemé est désormais lié à la mémoire, DeepSparse exécute le réseau en profondeur, en décomposant le problème en Tensor Columns, des bandes verticales de calcul qui tiennent dans la mémoire cache.
Les réseaux épars avec calcul compressé, exécutés en profondeur dans le cache, permettent à DeepSparse d'offrir des performances de classe GPU sur les processeurs !
Comment créer une version éparse de YOLOv5 entraînée sur mes données ?
Neural MagicLe dépôt de modèles open-source de SparseZoo contient des points de contrôle pré-sparsifiés de chaque modèle YOLOv5 . En utilisant SparseML, qui est intégré à Ultralytics, vous pouvez affiner un point de contrôle clair sur vos données avec une seule commande CLI .
Consultez la documentation de Neural Magic's YOLOv5 pour plus de détails.
Utilisation de DeepSparse
Nous verrons un exemple de benchmarking et de déploiement d'une version sparse de YOLOv5s avec DeepSparse.
Installer DeepSparse
Exécutez le programme suivant pour installer DeepSparse. Nous vous recommandons d'utiliser un environnement virtuel avec Python.
Collecte d'un fichier ONNX
DeepSparse accepte un modèle au format ONNX , passé soit comme :
- Un stub SparseZoo qui identifie un fichier ONNX dans le SparseZoo
- Un chemin local vers un modèle ONNX dans un système de fichiers
Les exemples ci-dessous utilisent les points de contrôle YOLOv5s standard, denses et quantifiés, 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-none
Déployer un modèle
DeepSparse propose des API pratiques pour intégrer votre modèle dans une application.
Pour essayer les exemples de déploiement ci-dessous, téléchargez un exemple d'image et enregistrez-la sous le nom de basilica.jpg
avec les éléments suivants :
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg
Python API
Pipelines
Le pré-traitement et le post-traitement des données de sortie sont intégrés dans le moteur d'exécution, ce qui permet d'ajouter DeepSparse à une application en toute simplicité. L'intégration de DeepSparse-Ultralytics comprend un module de base Pipeline
qui accepte les images brutes et produit les boîtes de délimitation.
Créer un Pipeline
et de lancer 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 vous travaillez dans le nuage, il se peut que vous obteniez une erreur indiquant que open-cv ne peut pas trouver libGL.so.1
. L'exécution de la procédure suivante sur Ubuntu l'installe :
Serveur HTTP
DeepSparse Server fonctionne au-dessus du framework web FastAPI et du serveur web Uvicorn. Avec une simple commande CLI , vous pouvez facilement mettre en place un point d'arrivée de service de modèle avec DeepSparse. Le serveur prend en charge n'importe quel pipeline de DeepSparse, y compris la détection d'objets avec YOLOv5, ce qui vous permet d'envoyer des images brutes au point de terminaison et de recevoir les boîtes de délimitation.
Faites tourner le serveur avec les YOLOv5s élagués et quantifiés :
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
Un exemple de demande, utilisant le site Python's requests
l'emballage :
import json
import requests
# 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"]
Annoter CLI
Vous pouvez également utiliser la commande annotate pour que le moteur enregistre une photo annotée sur le disque. Essayez --source 0 pour annoter le flux de votre webcam en direct !
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg
L'exécution de la commande ci-dessus créera un annotation-results
et enregistrer l'image annotée à l'intérieur.
Analyse comparative des performances
Nous allons comparer le débit de DeepSparse à celui de ONNX Runtime sur YOLOv5s, en utilisant le script de benchmarking de DeepSparse.
Les tests ont été effectués sur un serveur AWS c6i.8xlarge
(16 cœurs).
Comparaison des performances du lot 32
ONNX Base d'exécution
Avec le lot 32, ONNX Runtime atteint 42 images/seconde avec les YOLOv5 denses standard :
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntime
> Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Batch Size: 32
> Scenario: sync
> Throughput (items/sec): 41.9025
DeepSparse Dense Performance
Bien que DeepSparse offre ses meilleures performances avec des modèles épars optimisés, il donne également de bons résultats avec les modèles denses standard YOLOv5.
Avec le lot 32, DeepSparse atteint 70 images/seconde avec les YOLOv5 denses standard, soit une amélioration des performances de 1,7 fois par rapport à ORT!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1
> Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Batch Size: 32
> Scenario: sync
> Throughput (items/sec): 69.5546
Performance DeepSparse Sparse
Lorsque l'on applique le principe de sparsité au modèle, les gains de performance de DeepSparse par rapport à ONNX Runtime sont encore plus importants.
Avec le lot 32, DeepSparse atteint 241 images/seconde avec les YOLOv5s élagués et quantifiés, soit une amélioration des performances de 5,8 fois par rapport à ORT!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1
> Original 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 du premier lot
DeepSparse est également en mesure de gagner en vitesse par rapport à ONNX Runtime pour le scénario batch 1, sensible à la latence.
ONNX Base d'exécution
Pour le lot 1, ONNX Runtime atteint 48 images/seconde avec les YOLOv5 standard et denses.
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntime
> Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Batch Size: 1
> Scenario: sync
> Throughput (items/sec): 48.0921
Performance DeepSparse Sparse
Pour le lot 1, DeepSparse atteint 135 éléments/seconde avec un YOLOv5s élagué et quantifié, soit un gain de performance de 2,8 fois par rapport à ONNX Runtime !
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 1 -nstreams 1
> Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Batch Size: 1
> Scenario: sync
> Throughput (items/sec): 134.9468
Depuis c6i.8xlarge
ont des instructions VNNI, le débit de DeepSparse peut être encore amélioré si les poids sont élagués par blocs de 4.
Pour le lot 1, DeepSparse atteint 180 éléments/s avec un YOLOv5s quantifié et élagué à 4 blocs, soit un gain de performance de 3,7 fois par rapport à ONNX Runtime !
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1
> Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> Batch Size: 1
> Scenario: sync
> Throughput (items/sec): 179.7375
DĂ©marrer avec DeepSparse
Recherche ou test ? DeepSparse Community est gratuit pour la recherche et les tests. Commencez par consulter notre documentation.