Faible matériel ne peut pas fonctionner avec la profondeur du réseau de neurones? Il vous a appris à surmonter le problème « d'abattage de couteau de poulet du bétail »

Si vous savez quelque chose sur la profondeur d'apprentissage petits amis doivent savoir, l'apprentissage en profondeur nécessite l'utilisation de serveurs puissants, l'accélération des plateformes embarquées (comme Jetson de NVIDIA) pour exécuter l'algorithme d'apprentissage en profondeur, mais cela signifie aussi dépenser beaucoup d'argent.

La question est donc, si vous pensez que vous voulez faire avec la framboise envoyée à un tracker cible, l'entretien ménager garder votre maison, cela peut être réalisé? En d'autres termes, si vous avez besoin d'exécuter un réseau de neurones de convolution sur la CPU ARM sans accélérateur comment faire?

Lei Feng réseau suppose que ce sera comme le petit personnage frère ci-dessous, comme une position inconfortable.

ingénieurs apprentissage automatique des start-ups allemand BuddyGuard GmbH Dmytro Prylipko nous fournit une solution viable, « ne tuent pas les vaches couteau de poulet », compilé Lei Feng réseau, ne doivent pas être reproduits sans autorisation.

Comment optimiser le temps d'inférence?

communauté d'apprentissage machine afin de raccourcir le temps inférence des réseaux de neurones ont été étudiés pendant un certain temps, viennent étudier des solutions possibles est encore beaucoup de. Cet article va tenter de répondre à une simple question: Quelle est la bibliothèque / boîte à outils / cadre peut nous aider à optimiser le temps de former le modèle de raisonnement? Cet article a été fourni seulement discuter des puces d'architecture ARM pour les boîtes à outils et bibliothèques d'interface de C / C (en raison de l'utilisation de dispositifs embarqués, nous avons rarement Lua ou Python), limitée à la longueur de l'article, pas un autre raisonnement complexe d'accélérer le réseau de neurones méthode, à savoir l'architecture de réseau modifiée peut être vu à partir de l'architecture SqeezeNet, la modification de l'architecture de réseau est une option viable. Pour ces raisons, l'expérience a consisté à ne porte que sur l'utilisation du papier Caffe, tensorflow et MXNet ces trois cadre de l'apprentissage en profondeur open source.

Accélérer le modèle de réseau de neurones pour calculer la vitesse de la plate-forme matérielle, il existe deux grandes stratégies:

1) la modification du modèle du réseau de neurones;

2) accélérer la vitesse de trame.

Bien sûr, ces deux stratégies utilisées en combinaison, est aussi une bonne idée.

Modifier le modèle de réseau de neurones, il y a deux façons, d'abord en réduisant le poids de la précision obtenue, à savoir réduit la précision de quantification de fonction, et la seconde, en poids la taille pour atteindre le poids derrière l'idée de la taille est de réduire les paramètres du système redondants. La réduction du poids généralement faible précision (représentation des nombres à virgule flottante en utilisant des principes dynamiques à point fixe ou point fixe qui appuient cette approche: le processus de raisonnement ne nécessitent une grande précision, parce que le processus de calcul du calcul des propriétés linéaires et non linéaires compression de la gamme dynamique, de telle sorte que l'erreur de quantification est transmis uniquement à l'intérieur du sous-linéaire (sous-linéairement) de gamme, afin de ne pas provoquer un changement radical de la valeur. de plus, on peut utiliser une multiplication à faible précision pour former le modèle de réseau neuronal conjointement avec jeu d'instructions SIMD, tels que SSE3, peut rendre le processus de quantification de fonction peut être plus efficace, accélérant ainsi le processus de formation. Cependant, nous avons encore du mal à trouver un emploi deux solutions, telles que l'utilisation de quantification cadre Ristretto peut être effectuée précision automatiquement limitée, mais mais il n'a pas réduit la charge de calcul .TensorFlow quantification peut être effectuée, mais le temps d'inférence effectivement augmenté de 5 à 20 fois, ainsi que la quantification introduit / de quantification tensorflow auxiliaire du nud de calcul. Par conséquent, dans la pratique, nous ne en tant que procédé de compression de poids de réseau quantifiées, lorsque l'espace de stockage est limité Peut ce faire, au moins c'est la technologie la plus avancée.

D'un autre point de vue, nous pouvons utiliser la méthode pour accélérer le délai d'exécution, cette méthode ne modifie pas les paramètres du modèle. De telles stratégies sont employés à des fins générales multiplication des techniques de calcul (GEMM) entre une matrice à base d'optimisation pour affecter la couche de convolution (qui est typiquement calculée im2col + GEMM) et une couche reliée à fond. De plus, l'emballage peut être utilisé pour accélérer les réseaux de neurones NNPACK, vous comprenez, l'idée de base est d'utiliser Fourier rapide NNPACK opération de transformation de convolution dans le domaine temporel de conversion multiplication est devenu le domaine de fréquence.

Une autre façon d'accélérer la mise en uvre du cadre est la vitesse de la configuration du modèle de réseau et le poids est converti en optimisé pour le code de plate-forme cible, et le code, plutôt que de les laisser courir directement dans un certain cadre. Un exemple typique de cette approche est que TensorRT. Il CaffePresso, vous pouvez personnaliser Caffe dans les types de fichiers prototxt être applicable à une variété de différentes plates-formes matérielles baisse version de la spécification. Cependant, TensorRT besoin de courir CUDA, et ne peut être utilisé dans le GPU NVIDIA, et CaffePresso ont aussi besoin accélérateur matériel (DSP, FPGA ou NoC), de sorte que ces deux méthodes ne conviennent pas pour mon matériel de test - - tarte aux framboises.

Une fois le contenu ci-dessus évaluer soigneusement les solutions existantes, j'ai trouvé plusieurs façons d'accélérer le raisonnement populaire modèles disponibles:

  • Si vous utilisez un OpenBLAS-cadre (implémentation open source assemblage de l'algèbre linéaire de base), vous pouvez essayer d'utiliser sa branche est optimisé pour l'apprentissage en profondeur: https://github.com/xianyi/OpenBLAS/tree/optimized_for_deeplearning

  • NNPACK avec quelques-uns des autres cadres (y compris la flamme, Caffe et MXNet) en combinaison: http: //github.com/Maratyszcza/NNPACK

  • Le tensorflow compilé en code objet dans la plate-forme Raspberry Pi, vous pouvez utiliser des options d'optimisation du compilateur, afin de profiter de jeu d'instructions NEON pour accélérer la vitesse d'exécution du code objet: http: //github.com/tensorflow/tensorflow/tree/master / tensorflow / contrib / makefile # framboise-pi

Sur la base des méthodes ci-dessus trois, je résume la configuration suivante Mise en service:

1. OpenBLAS utilisés comme une branche principale d'arrière-plan Caffe (Caffe-openblas);

2. OpenBLAS utilisés comme une extrémité arrière et une version OpenBLAS d'étude approfondie optimisé branche Caffe (Caffe-openblas-dl);

3. Lors de la compilation tensorflow, en utilisant les drapeaux du compilateur d'optimisation optflags = "- Os" (tf-vanille)

4. Compile tensorflow, en utilisant un optflags de drapeau du compilateur = "optimisation - Os -mfpu = néon vfpv4 -funsafe-math-optimisations -ftree-vectoriser" (tf-néon-vfpv4)

5. En utilisant l'algèbre linéaire à un OpenBLAS de base d'assemblage vanille MXNet

6. Utilisation avec OpenBLAS, et une version optimisée étude approfondie branche MXNet (mxnet-openblas-dl).

Vous demandez peut-être: comment la configuration n'est pas NNPACK? Ceci est un peu compliqué, la branche Caffe créée par ajtulloch fournit la méthode la plus directe d'utilisation NNPACK. Toutefois, étant donné qu'il est intégré en elle, l'interface API NNPACK a été modifiée, et à l'heure actuelle je ne peux pas le compiler. Caffe2 ont un support natif pour NNPACK, mais je ne considère pas Caffe2, parce qu'il est au stade expérimental et presque Caffe pas encore la reconstruction documentée. Une autre option consiste à utiliser la branche Maratyszcza caffe-nnpack, mais la branche est relativement ancienne et a été arrêté pour l'entretien.

Un autre problème est hors de NNPACK lui-même. Il ne fournit que la configuration de la plate-forme Android / ARM compilateur croisé qui ne fournit pas un compilateur croisé sur la configuration de la plate-forme Linux / ARM. Combiné MXNet, je tente de compiler le code pour la plate-forme cible, mais les résultats ne peut pas fonctionner correctement sur la plate-forme cible. Je ne peux l'exécuter sur un ordinateur de bureau, mais je ne vois pas que OpenBLAS ont de meilleures performances. Depuis mon objectif était d'évaluer les solutions déjà disponibles, donc je ne peut retarder NNPACK l'expérience.

Toutes ces méthodes sont exécutées CPU quad-core framboise 1,3 GHz et 1 Go de RAM tartes 3. Système d'exploitation est 32 bits Raspbian, de sorte que le CPU ne détecte l'architecture ARMv8, mais l'architecture ARMv7. Les spécifications matérielles sont les suivantes:

  • Nom du modèle: ARMv7 Processeur rev 4 (V7L)

  • BogoMIPS: 38.40

  • Caractéristiques: demi-pouce fastmult edsp néon vfpv3 tls vfpv4 Idiva idivt vfpd32 LPAE evtstrm crc32 VFP

  • CPU implémenteur: 0x41

  • architecture CPU: 7

  • variante du processeur: 0x0

  • partie CPU: 0xd03

  • révision du CPU: 4

Pour évaluer la performance de chacun de la configuration de test ci-dessus, j'ai développé le programme de test sont comme suit: utiliser les mêmes réseaux de neurones. 3 est une convolution de deux couches entièrement connectées et des couches et petit dans le réseau neuronal convolutif avec le dessus de Softmax:

CONV1: 16 @ 7x7

relu1pool1: MAX PISCINE 2x2conv2: 48 @ 6x6

relu2pool2: MAX PISCINE 3x3conv3: 96 @ 5x5

relu3fc1: 128 unitsfc2: 848 unités

softmax

Le réseau de neurones de convolution a l'argument 1.039.744. Bien que très petit, mais il est déjà assez fort, il peut utiliser pour effectuer de nombreux algorithmes de vision par ordinateur. Les utilisations du réseau de formation tâche de reconnaissance Caffe, et le convertit au format tensorflow et MXNet d'évaluer ces cadres. Le numéro de lot d'exécutions a une grande influence sur la performance, afin de mesurer en avant dans le temps (avant passer le temps), nous exécuterons le numéro de lot est réglé sur 1-256. Dans l'exécution de lots à différents moments, nous avons exécuté 100 fois chacun par l'avant et calcule le temps moyen de traitement par une image.

Évaluation et discussion

Dans le tableau ci-dessous, énumère le moyen terme à travers le temps. Dans lequel, A Caffe-openblas, B Caffe-openblas-dl, C nom tf-vanille, D est tf-néon-vfpv4, E est mxnet-openblas, F est mxnet-openblas-dl.

Tableau 1 configuration de test des performances différentes à des moments différents du lot

La comparaison des différentes configurations de l'échelle linéaire. La figure 1 par le temps

Sur une échelle échelle logarithmique Penchons-nous:

En comparant le nombre de configurations différentes dans la figure. 2 par l'échelle de temps

Les résultats du test m'a surpris. Tout d'abord, je ne pensais pas courir sur les performances du processeur MXNet sera si mauvais. Mais il semble avoir un problème bien connu. En outre, limité par l'espace de stockage, il ne peut pas exécuter un lot de 256 images. La deuxième surprise est optimisé tensorflow tellement comme une bonne performance. Il est encore mieux que la performance de Caffe (numéro de lot plus de 2), la lumière du point de vue de la trame d'origine est difficile de prédire l'issue. Il convient de noter que les ne peuvent pas être utilisés sur une puce ARM drapeaux d'optimisation de configuration de test mentionnés ci-dessus.

Caffe en raison de la très rapide et est connu pour des idées uniques. Si vous avez besoin de traitement continu d'images, vous pouvez choisir d'utiliser les Caffe optimisés OpenBLAS, les meilleures performances de traitement disponibles. Si vous voulez améliorer les performances de 10ms, vous devez faire est de vous suffit de saisir la commande suivante:

cd OpenBLAS

optimized_for_deeplearning caisse git

Pour mes recherches sur une chose formelle, il me reste beaucoup de travail à faire: évaluer plus de modèles, et en fin de compte NNPACK intégrés, et plus cadre de recherche Intègre back-end BLAS. Lei Feng réseau J'espère que cela vous aidera à comprendre la vitesse actuelle du raisonnement des solutions les plus populaires.

Comment exécuter via les réseaux de neurones profonds sur le matériel faible

module de commande de lecture: Unicorn jusqu'à changement de mode "Kamen Rider" Décennie Xiaoming
Précédent
module de commande Play: High Mobility noir Xin Gu up
Prochain
Ne pas installer le logiciel écran téléphone Android peut l'afficher dans un ordinateur Windows? | Il esquive 170
320 millions d'investissement, sparring Shen Teng Chan Chow, Wu Jing recréer le mythe du box-office il?
Jouez en mode contrôle: aile volante aile géante changer le mode d'authenticité jusqu'à zéro
Sortie cinq jours au box-office 31080000, vaincu Vincent Zhao, a finalement perdu Chow Yun Fat!
App Store utilisent maintenant le paiement direct micro-canal, Alipay embarrassant il?
Le dixième anniversaire de « Uncharted » paquets Jinian Li contenant un temps limité reçoivent des sujets limités gratuits
Module de jeu de commande: pour jusqu'à le mode X changement Kamen Rider Diend
TV Cat - applications Smart TV armée des "pionniers"
1,64 million au box-office libéré quatre jours après avoir quitté Stephen Chow, elle est également devenu le roi des films minables!
Mot de passe faire contre l'humanité, voudraient utiliser des mitrailleuses chug designers | l'inspiration du matin lecture
module de commande de lecture: Type mignon grassouillet RX78
« Ce sont des enfants, » le battement Street, Yang Mi et un nouveau démarrage du film, les utilisateurs: voir l'acteur à l'aise