Maîtriser l'optimisation YOLO et ResNet sur les NPU HiSilicon

Vous voulez obtenir les meilleures performances de vos modèles sur les NPU HiSilicon. Cela peut être une tâche difficile. Vous pouvez voir performan

Mastering

Vous voulez obtenir les meilleures performances de vos modèles sur les NPU HiSilicon. Cela peut être une tâche difficile. Vous pouvez voir des goulots d'étranglement de performance ou une mauvaise utilisation du matériel. L'architecture NPU Ascend présente des défis uniques. Par exemple,Il n'utilise pas un parallélisme de niveau thread massif pour masquer les retards d'accès à la mémoire.

ObjectifCe guide vous donne un flux de travail complet pour l'optimisation de YOLO/ResNet. Vous apprendrez à préparer des modèles, à les convertir avec le compilateur Ascend Tensor, à appliquer la quantification INT8 et à les déployer à l'aide d'AscendCL pour une efficacité maximale.🚀

Les clés à emporter

  • Préparez votre modèle pourHiSilicon NPU. Convertissez-le au format ONNX. Taillez pour le rendre plus petit et plus rapide.
  • Utilisez l'ATC (Ascend Tensor Compiler) pour convertir votre modèle ONNX. Cela crée un fichier optimisé «. om» pour le NPU.
  • Appliquez la quantification INT8 pour améliorer les performances. Utilisez la quantification post-entraînement (PTQ) ou l'entraînement conscient de la quantification (QAT).
  • Utilisez le Profileur d'ascension pour trouver les parties lentes de votre modèle. Cela vous aide à résoudre les problèmes de performance.
  • Déployez votreModèle optimiséEn utilisant AscendCL. Mesurez sa latence et son FPS pour vérifier sa vitesse.

PRÉPARATION ET OPTIMISATION DE YOLO/RESNET POUR LA CONVERSION

PRÉPARATION

Votre première étape consiste à préparer le modèle pour le HiSilicon NPU. Un modèle bien préparé convertit en douceur et fonctionne mieux. Cette préparation comporte plusieurs étapes clés.

  1. Conversion du modèleVous allez convertir votre modèle entraîné dans un format compatible NPU. Le compilateur Ascend Tensor (ATC) aide à ce processus.
  2. Adaptation de l'opérateurVotre modèle peut avoir des opérateurs personnalisés. Vous devez les adapter pour le NPU s'ils ne sont pas pris en charge nativement.
  3. Modèle InférenceVous allez déployer le modèle converti sur le NPU. Cela implique de charger le modèle et de l'alimenter en données pour obtenir des prédictions.
  4. Optimisation des performancesVous pouvez améliorer encore les performances avec des techniques telles que la quantification et la fusion d'opérateurs.

Utiliser ResNet comme backbone YOLO

Vous pouvez utiliser une architecture ResNet comme épine dorsale pour votre modèle YOLO. ResNet est excellent pour extraire des caractéristiques complexes d'images. Ce pouvoir a un coût. ResNet ajoute un poids de calcul significatif. Cela rend l'étape suivante, l'élagage, très importante pour l'optimisation de YOLO/ResNet sur les appareils à ressources limitées.

Élagage pour la compatibilité NPU

L'élagage supprime les connexions inutiles ou les neurones de votre réseau neuronal. Ce processus crée un modèle plus petit et plus rapide sans perte majeure de précision. Un modèle élagué a moins de paramètres et d'opérations. Cela le rend idéal pour le NPU, réduisantMémoireUtilisation et accélération de l'inférence. Ceci est une technique critique pour Optimiser YOLO/ResNet.

Exportation de modèles vers ONNX

Vous devez exporter votre modèle au format ONNX (Open Neural Network Exchange). ONNX est un format intermédiaire que l'outil ATC comprend. Vous pouvez facilement exporter un modèle PyTorch en utilisant une simple commande.

Exemple: Exportation d'un modèle YOLOv8n vers ONNX.

# Cette commande crée 'yolov8n.onnx' à partir de votre modèle PyTorch
Modèle d'exportation yolo = yolov8n.pt format = onnx

Remarque: Vous pouvez rencontrer des erreurs lors de l'exportation. Des questions commeType de données ONNX non pris en charge: INT64Ou des décalages de forme dansFusedMatMulSont communs. Vous pouvez souvent les corriger en vous assurant que la taille de votre tenseur d'entrée est correcte ou en convertissant les types de données avant l'exportation.

Vérification du graphique ONNX

Vous devez toujours vérifier le fichier ONNX exporté. Cette vérification garantit que la structure du modèle est correcte avant de procéder à la conversion. Plusieurs outils peuvent vous aider dans cette dernière étape de préparation.⚙️

  • NétronC'est un outil visuel. Vous pouvez télécharger votre. OnnxPour voir le graphique du modèle entier. Il vous permet d'inspecter les propriétés, entrées et sorties de chaque couche.
  • Vérificateur ONNXCeci est une bibliothèque Python. Vous pouvez utiliser leOnnx. checker.check_model()Fonction dans un script. Il confirme programmatiquement que la structure de votre modèle est valide et soulèvera une erreur s'il trouve des problèmes.

CONVERSION MODÈLE AVEC ATC

Après avoir préparé votre modèle ONNX, votre prochaine tâche est de le convertir dans un format que HiSilicon NPU peut comprendre. Vous utiliserez leCompilateur Tensor Ascend (ATC)Pour cette étape critique. ATC est un outil puissant dans la chaîne d'outils CANN (Compute Architecture for Neural Networks).

Son travail principal est de transformer votre modèle en un modèle hors ligne hautement optimisé.

  • ATC est un outil de conversion de base dans la chaîne d'outils Huawei CANN.
  • Vous l'utilisez pour adapter des modèles de frameworks populaires dans un format compatible Ascend.
  • Il vous aide à déployer efficacement des modèles d'IA formés sur le matériel Huawei Ascend.

Ce processus de conversion crée un. OmQui est le modèle exécutable final que vous déploierez sur le NPU.

Conversion de base ATC

Vous pouvez commencer avec une commande de base pour convertir votre. OnnxDossier. Cette commande indique à ATC le modèle d'entrée, le framework d'origine, le nom de fichier de sortie souhaité et la version de puce Ascend cible.

💡Qu'est-ce qu'un modèle hors ligne. Om)? Un modèle hors connexion est un fichier qui a été prétraité et optimisé pour une cible matérielle spécifique. Il inclut des tâches telles que la fusion d'opérateur et l'optimisation de la mémoire, ce qui signifie que le NPU peut l'exécuter avec un temps de configuration minimal pendant l'inférence.

Voici une fondamentaleAtcExemple de ligne de commande:

Atc -- modèle = yolov8n.onnx \
-- Cadre = 5 \
-- Sortie = yolov8n \
-- Soc_version = Ascend310

Décollons ce que fait chaque partie de cette commande:

DrapeauDescription
-ModèleSpécifie le chemin d'accès à votre entrée. OnnxDossier.
-- Cadre = 5Indique à l'ATC que le modèle est au format ONNX. (Les autres valeurs sont pour Caffe, etc.)
-- SortieDéfinit le nom de base de votre sortie. OmFichier (aucune extension nécessaire).
-- Soc_versionSpécifie le processeur Ascend cible, commeAscend310OuAscend710.

Configuration des entrées

Votre modèle doit connaître la taille et le format exacts des données que vous lui enverrez. Vous configurez ceci pendant la conversion ATC utilisant des drapeaux spécifiques. Cette étape est essentielle pour les performances et la prévention des erreurs d'exécution.

Vous utilisez le-- Input_shapePour définir les dimensions de votre tenseur d'entrée. Vous pouvez définir une taille de lot fixe pour des performances cohérentes ou une taille de lot dynamique pour plus de flexibilité.

  • Taille statique du lot:"-- Input_shape = images:1,3,640,640"(Lot de 1)
  • Taille dynamique du lot:"-- Input_shape = images:-1,3,640,640"(Taille variable du lot)

Vous devez également spécifier la disposition des données. La plupart des modèles de vision par ordinateur formés à PyTorch utilisent laNCHWFormat. Cette disposition organise les données du tenseur comme (Nombre d'échantillons, Canaux, Hauteur, Largeur). Obtenir ce droit est essentiel pour l'efficacité du calcul, car il affecte la façon dont le NPU accède aux données en mémoire. Vous pouvez utiliser le-- Input_formatDrapeau pour définir ceci.

Voici la commande améliorée avec la configuration d'entrée:

Atc -- modèle = yolov8n.onnx \
-- Cadre = 5 \
-- Sortie = yolov8n \
-- Input_format = NCHW \
-- Input_shape = "images:1,3,640,640" \
-- Soc_version = Ascend310

Manipulation d'Ops non pris en charge

Parfois, votre modèle peut contenir des couches ou des opérations spéciales ("ops") que l'ATC ne prend pas en charge nativement. Lorsque cela se produit, la conversion échoue. Vous disposez d'un outil puissant pour résoudre ce problème: leMoteur Tensor Boost (TBE). TBE vous permet de définir et d'implémenter des opérateurs personnalisés d'une manière que le NPU Ascend peut exécuter.⚙️

Développer un opérateur personnalisé avec TBE est un processus avancé qui implique plusieurs étapes:

  1. Module DSLVous écrivez d'abord la logique mathématique de base de l'opérateur. Vous utilisez un langage spécifique au domaine pour définir les étapes de calcul et le flux de données.
  2. Module de planificationEnsuite, vous dites au matériel comment exécuter votre logique efficacement. Cela implique de planifier la façon de segmenter les données (carrelage) pour optimiser l'accès à la mémoire et les performances.
  3. Module d'IR: TBE génère ensuite une représentation intermédiaire (IR) de votre opérateur. Il s'agit d'un format standardisé que le compilateur peut comprendre et commencer à optimiser.
  4. Module de transfert du compilateurLe compilateur prend l'IR et applique d'autres optimisations. Il utilise des techniques telles que la double mise en mémoire tampon et l'allocation de mémoire intelligente pour préparer l'opérateur au matériel NPU spécifique.
  5. Module CodeGen: Enfin, le module CodeGen produit un fichier de code de type C. Ce fichier est compilé dans un opérateur exécutable que le framework CANN peut charger et exécuter directement sur le NPU.

⚠️ RemarqueLa création d'opérateurs personnalisés nécessite une compréhension approfondie de la fonction de l'opérateur et de l'architecture NPU sous-jacente. Vous devriez toujours vérifier la liste officielle des opérateurs CANN en premier. Ne créez un opérateur personnalisé que si vous ne trouvez pas d'alternative prise en charge.

OPTIMISATION ET AJUSTAGE AVANCÉS

Vous avez converti votre modèle. Vous pouvez maintenant débloquer la véritable puissance du HiSilicon NPU. Des techniques d'optimisation avancées pousseront les performances de votre modèle à son maximum. Cette étape se concentre sur la réduction de la précision du modèle et sur l'analyse de son comportement d'exécution pour trouver et corriger les goulots d'étranglement.

Les NPU comme l'architecture Da Vinci de HiSilicon sont conçus pour accélérer des opérations mathématiques spécifiques. Votre modèle doit utiliser ces opérateurs "NPU-friendly" pour la convolution, la mise en commun et l'activation pour atteindre une vitesse maximale. Toute opération non prise en charge par le NPU s'exécute sur la CPU plus lente, créant un goulot d'étranglement des performances.La quantification est une technique clé qui rend votre modèle plus NPU-friendly. Il réduit la précision des nombres de votre modèle, par exemple, de 32 bits à virgule flottante (FP32) à 8 bits (INT8). Ce changement rend le modèle plus petit et plus rapide.UneTest de référence de l'IAMontre clairement cet impact.Un modèle fonctionnant à 12 images par seconde utilisant FP32 peut atteindre 30 images par seconde lorsqu'il est optimisé avec la quantification INT8.

Quantification post-entraînement (PTQ)

La quantification post-entraînement (PTQ) est une technique puissante pour optimiser YOLO/ResNet. Vous l'appliquez à un modèle FP32 déjà formé. L'outil principal que vous utiliserez pour cela est l'Ascend Model Compression Toolkit (AMCT). PTQ est populaire parce que c'est un moyen rapide et simple d'obtenir une augmentation significative des performances sans recycler votre modèle.

Cependant, PTQ peut parfois causer une baisse de la précision de votre modèle.Pour un modèle comme YOLOv8 Nano, vous pourriez voir une légère diminution de la précision de l'inférence. Dans certains cas, en particulier avec des modèles plus petits, cette perte de précision peut être plus importante. La quantification statique INT8 peut conduire à une baisse de précision modérée d'environ 3-7% en mAP50-95 absolu.

Si la perte de précision du PTQ est trop élevée, vous avez une autre option:Formation à la quantification (QAT). QAT introduit la simulation de la quantification pendant le processus d'apprentissage lui-même. Cela permet au modèle d'apprendre à compenser la perte de précision, ce qui se traduit souvent par une meilleure précision finale.

Voici une comparaison pour vous aider à décider quelle méthode utiliser:

CaractéristiqueQuantification post-entraînement (PTQ)Formation à la quantification (QAT)
Étape de la demandeAppliqué à un modèle pré-entraînéIntégré directement dans le processus de formation du modèle
Reformation requiseNon, vous n'avez pas besoin de vous recyclerOui, il faut plus de temps d'entraînement pour s'adapter à la quantification
ComplexitéPlus simple et plus rapide à mettre en œuvrePlus complexe, car il simule la quantification pendant l'entraînement
Précision ImpactPeut entraîner une baisse de précision notableObtienne souvent une meilleure précision en optimisant l'inférence quantifiée

Quand choisir l'un plutôt que l'autre?

  • Choisissez PTQLorsque vous ne pouvez pas recycler votre modèle ou lorsqu'une légère baisse de précision est acceptable pour un gain de vitesse important.
  • Choisissez QATLorsque la précision est votre priorité absolue et que vous avez les ressources pour un cycle de formation plus long et plus complexe.

Préparation d'un jeu de données d'étalonnage

Pour effectuer PTQ, vous avez besoin d'unJeu de données d'étalonnage. Il s'agit d'une petite collection représentative de données d'entrée (par exemple, des images) que l'AMCT utilise. Il exécute ces données dans votre modèle pour analyser la plage de valeurs d'activation. Ces informations lui permettent de calculer les facteurs d'échelle optimaux pour convertir les valeurs FP32 en INT8 sans perdre trop d'informations.

La création d'un bon ensemble de données d'étalonnage est cruciale pour une quantification réussie.

  • La qualité sur la quantitéVous n'avez pas besoin d'un ensemble de données massif. Un ensemble de autour1024 images diverses et bien préparéesEst souvent suffisant. Le simple fait d'utiliser plus d'images n'est pas toujours mieux. Un jeu de données déséquilibré ou redondant peut fausser les statistiques d'étalonnage. Cela peut entraîner une mauvaise performance du modèle quantifié pendant l'inférence du monde réel.
  • La représentation est cléVos images d'étalonnage doivent refléter la variété des données que votre modèle verra en production. Incluez des images avec différentes conditions d'éclairage, tailles d'objet et arrière-plans pour garantir la robustesse du processus d'étalonnage.

Un ensemble d'étalonnage bien choisi est la pierre angulaire d'une quantification efficace lors de l'optimisation de YOLO/ResNet.

Profiler avec Ascend Profiler

Après avoir converti et quantifié votre modèle, vous devez mesurer ses performances. LeAscend ProfilerEst l'outil que vous utiliserez pour trouver les goulots d'étranglement de performance restants. Il vous donne une ventilation détaillée de la façon dont votre modèle s'exécute sur le NPU.

Vous pouvez utiliser les données du profileur pour répondre à des questions critiques:

  • Quels opérateurs prennent le plus de temps?
  • Des opérateurs s'exécutent-ils de manière inattendue sur le CPU au lieu du NPU?
  • Y a-t-il un mouvement de données inefficace entre l'hôte et l'appareil?

Le Profileur Ascend a deux composants clés pour cette analyse:

  1. Analyse chronologiqueCette vue vous donne une représentation visuelle de bas niveau de l'exécution de votre modèle. Chaque bloc coloré sur la chronologie indique l'heure de début et la durée d'un opérateur. Vous pouvez voir exactement quels opérateurs s'exécutent sur leAICORE(Le NPU principal), leAICPUOu leHOSTCPU. Cela vous aide à identifier les opérateurs avec de longs délais d'exécution. Vous pouvez télécharger ces données de chronologie en tant que fichier JSON et les ouvrir dans des outils tels queChrome: // traçagePour un regard plus profond.

  2. Analyse de la performance de l'opérateurCe composant fournit des statistiques de haut niveau. Il affiche les temps d'exécution de l'opérateur dans des tableaux et des graphiques, triés par durée. Vous pouvez rapidement voir quels types d'opérateurs (par exemple, AICORE vs AICPU) et quels opérateurs spécifiques consomment le plus de temps. C'est parfait pour identifier si une partie importante du runtime de votre modèle est consacrée à quelques opérations lentes.

En utilisant ces deux vues ensemble, vous pouvez diagnostiquer efficacement les problèmes de performances. Par exemple, si le profileur indique qu'un opérateur personnalisé ou non pris en charge s'exécute sur HOSTCPU, vous savez que la création d'un opérateur TBE personnalisé pour celui-ci fournira probablement une accélération majeure.

DÉPLOIEMENT ET INFÉRENCE

DÉPLOIEMENT

Vous avez optimisé votre modèle. Vous allez maintenant le déployer sur le HiSilicon NPU. Cette dernière étape est celle où vous exécutez votre modèle pour faire des prédictions dans le monde réel. Vous utiliserez leLangage de calcul Ascend(AscendCL) pour communiquer avec le matériel et mesurer les performances finales de votre modèle.

Initialisation de l'appareil avec AscendCL

Vous devez d'abord configurer le NPU pour l'inférence. Vous utiliserez AscendCL pour ce faire. Python Ascend Computing Language (pyACL) est une bibliothèque d'API Python qui simplifie ce processus. Il vous permet de contrôler le processeur Ascend AI directement à partir de votre code Python.

Le workflow standard pour exécuter un modèle suit une séquence claire:

  1. Initialiser pyACLVous démarrez la bibliothèque pyACL pour préparer les ressources système.
  2. Allouer des ressourcesVous mettez de côté les ressources d'exécution dont votre application a besoin.
  3. Transfert de donnéesVous déplacez vos données d'entrée, comme des images, dans la mémoire de l'appareil.
  4. Données de processusVous pouvez effectuer des modifications d'image de dernière minute, comme le redimensionnement.
  5. Exécuter le modèle: Vous chargez votre. OmModélisez et exécutez le processus d'inférence.
  6. Détruire les allocationsVous libérez les ressources d'exécution une fois l'inférence terminée.
  7. Désinitialiser pyACLVous fermez la bibliothèque pour libérer toutes les ressources.

Code d'inférence d'écriture

Votre script d'inférence rassemble toutes ces étapes. Ce code est le moteur qui charge votre modèle, l'alimente en données et récupère les prédictions.

💡Utilisation de pyACL pour l'inférence LePyACLBibliothèque est votre outil principal pour cette tâche. Vous utilisez ses fonctions pour gérer l'appareil, gérer la mémoire, charger votre. OmModèle et l'exécuter. Il vous donne un contrôle total sur l'ensemble du pipeline d'inférence dans un environnement Python.

Votre script va charger les données d'entrée prétraitées, les envoyer à la NPU, déclencher l'exécution du modèle, puis traiter la sortie du modèle.

Benchmarking Performance

Après le déploiement, vous devez mesurer les performances de votre modèle. Cela vous indique à quelle vitesse votre modèle fonctionne. Deux paramètres clés sont essentiels pour cette évaluation:

  • LatenceC'est le temps que votre modèle prend pour traiter une entrée, mesurée en millisecondes (ms). Une plus faible latence est meilleure.
  • Images par seconde (FPS)Cela mesure combien d'entrées votre modèle peut traiter en une seconde. Un FPS supérieur est meilleur.

Ces deux métriques sont directement liées.Pour une application vidéo en temps réel fonctionnant à 30 FPS, la latence de votre modèle doit être inférieure à 33,3 ms.D'autres métriques de latence importantes peuvent également vous donner des informations plus approfondies.

  • Temps au premier jeton: Le temps qu'il faut pour obtenir le tout premier morceau de sortie.
  • Temps de génération totalLe temps de bout en bout entre l'entrée et la sortie complète.

Mesurer ces chiffres vous aide à confirmer que votre travail d'optimisation a réussi.🚀


Vous avez maintenant maîtrisé un workflow complet pour l'optimisation NPU. Ce guide vous a guidé à travers quatre étapes essentielles:

  1. Préparation du modèle
  2. Conversion ATC
  3. Réglage de la quantification
  4. Déploiement d'AscendCL

Suivre ce processus structuré est la clé pour débloquer la pleine performance de vos modèles de vision par ordinateur surMatériel HiSilicon.

Maintenant, appliquez ces techniques à vos propres projets! Pour plus d'aide, consultez la documentation officielle de CANN ou les forums communautaires. Bonne chance!🚀

FAQ

Quelle est la principale différence entre PTQ et QAT?

Vous appliquez la quantification post-entraînement (PTQ) à un modèle déjà entraîné. Il est rapide mais peut réduire la précision. Vous utilisez la formation à la quantification (QAT) pendant le processus de formation. Cette méthode prend plus de temps mais maintient souvent une précision élevée.

Pourquoi ONNX est-il le format préféré pour la conversion?

Vous utilisez ONNX comme format universel. Le compilateur Ascend Tensor (ATC) comprend les fichiers ONNX. Cela vous permet de convertir facilement des modèles de frameworks comme PyTorch en. OmQue le NPU peut exécuter.

Que dois-je faire si ma conversion ATC échoue?

Une panne ATC signifie souvent que votre modèle a un opérateur non pris en charge. Tout d'abord, vérifiez les journaux d'erreurs pour les indices. Vous devrez peut-être créer un opérateur personnalisé à l'aide du moteur Tensor Boost Engine (TBE) pour résoudre le problème.⚙️

De combien d'images ai-je besoin pour un ensemble de données d'étalonnage?

Vous n'avez pas besoin de milliers d'images. Un ensemble diversifié d'environ 1024 images suffit souvent. La clé est la qualité, pas la quantité. Vos données d'étalonnage doivent représenter ce que votre modèle verra en production.

Related Articles