当前位置:网站首页>Partage de l'expérience du projet: mise en œuvre d'un pass optimisé pour la fusion IR de la couche mindstore
Partage de l'expérience du projet: mise en œuvre d'un pass optimisé pour la fusion IR de la couche mindstore
2022-07-03 07:33:00 【Penser à mindstore】
La saison estivale2021Vérification de clôture en cours,Le partage de l'expérience du projet n'a pas cessé.Ce numéro est partagé à partir deMindSpore CommunautéDeHu QiuyueExpérience de projet apportée par des camarades de classe:Réaliser un MindSpore Couche IR Optimisation de la fusion pass.
Bienvenue à continuer à alimenter la boîte aux lettres du Bureau de rédaction,Partager activement l'expérience du projet et l'expérience open source!
Boîte aux lettres:
Wechat:
Information sur le projet
Nom du projet
Réaliser un MindSpore Couche IR Optimisation de la fusion pass
Contexte du projet
MindSpore Introduction
Avec le développement rapide de l'apprentissage profond ces dernières années,Google, une grande société Internet à l'étranger(Google)Et Facebook(Facebook)Chacun a lancé son propre cadre d'apprentissage profond: Utilisant des diagrammes de calcul statiques Tensorflow Avec des graphiques dynamiques Pytorch, Les deux ont été largement utilisés . Lancé par Huawei en Chine “Sheng si.”(MindSpore), Combinaison de graphiques dynamiques et statiques , A joué les avantages des deux .
MindSpore Architecture
MindSporeL'architecture générale est illustrée ci - dessous:
https://www.mindspore.cn/tutorials/zh-CN/r1.5/introduction.html
Fig.1.MindSporeSchéma
IR(Intermediate Representation)Introduction
IR Est essentiellement une représentation intermédiaire , Fait partie d'un outil de compilation complet :
“
Le milieu indique(IR) Est la structure de données ou le code utilisé à l'intérieur du compilateur ou de la machine virtuelle pour représenter le code source .IR Conçu pour faciliter le traitement ultérieur , Comme l'optimisation et la traduction .“C'est bon.”DeIRDoit être précis—— Capacité de représenter le code source sans perdre d'information —— Et indépendant de toute langue source ou cible spécifique .IR Peut prendre l'une des formes suivantes :Structure des données en mémoire, Ou un code spécial lisible par programme basé sur des tuples ou des piles .Dans ce dernier cas,, C'est aussi connu sous le nom de langue intermédiaire .
”
Avec différents scénarios d'application et exigences , Un grand nombre de langages de programmation et d'architectures de processeurs différents sont apparus , L'apprentissage profond a tant d'avant en arrière différents , Comment trouver un pont pour réaliser l'optimisation et la projection entre eux plus efficacement , C'est là que se manifeste IRL'importance de.
Fig.2.IR Dessin du pont
Basé sur la couche IRValeur d'application pratique de, Il est nécessaire de faire des couches IROptimisation de la fusion, Le Programme d'application correspondant est le sujet du projet. - Écrire des couches qui identifient des structures spécifiques IROptimisation de la fusionpass.
Description du programme
Selon les exigences du projet, Réaliser une couche IR Optimisation de la fusion pass. Dans la phase de compilation du diagramme ,Par le biais de pass Optimiser,Chaque pass Structure spécifique dans le dessin à identifier , Remplacement de l'opérateur après identification réussie , Le réseau original Les opérateurs d'une structure particulière du graphique sont fusionnés , Optimisation remplacée par une structure plus simple correspondante , Afin d'optimiser la structure du diagramme de réseau . Optimisation de la fusion des couches pour ce projet pass Est de réaliser un prelu Optimisation de la fusion pass,Oui. neg,relu,mul,add La structure spécifique de l'opérateur est optimisée par fusion pour prelu Structure de l'opérateur , La structure spécifique de l'opérateur avant optimisation est illustrée dans la figure suivante .
Fig.3. Schéma de structure avant optimisation
Pour optimiser la structure de la figure ci - dessus ,In ir_fusion Ajouter des optimisations écrites au fichier pass,C'est - à - dire: prelu_fusion, Les fonctions mises en œuvre sont spécifiques à l'identification de la structure de la figure ci - dessus. ,Entrée x,weight Par l'opérateur prelu Pour passer à une nouvelle structure de réseau , Et sortie d'un nouveau noeud de diagramme réseau . Lors de la compilation des graphiques ,Adoption compilegrahimpl Appel de fonction, Diverses optimisations seront effectuées pass,À écrire prelu_fusion Optimisation pass Ajouté à ascend_backend_optimization.cc Appelépass Dans la séquence,C'est fait. prelu Optimisation de pass. La structure spécifique du diagramme de réseau optimisé est illustrée dans la figure ci - dessous .
Fig.4. Schéma de structure optimisé
Préparation des documents
Documents établis conformément au programme , Selon la structure du réseau avant optimisation , Identifier et remplacer la structure d'identification spécifiée , Le Code ici est biaisé vers le bas ,Diverspass Il n'y a pas beaucoup de différence structurelle , La condition préalable à la production de code est la compréhension de chaque pass Structure des données et dépendances :
namespace mindspore {
namespace opt {
const BaseRef PReluFusion::DefinePattern() const {
VectorRef x_pattern({prim::kPrimRelu, VectorRef({prim::kPrimNeg, x_})});
VectorRef mul_pattern({prim::kPrimMul, VectorRef({prim::kPrimNeg, weight_}), x_pattern});
VectorRef pattern({prim::kPrimAdd, VectorRef({prim::kPrimRelu, x_}), mul_pattern});
return pattern;
}
Après avoir identifié la structure de l'opérateur correspondant , Il faut le remplacer par une structure d'opérateur optimisée ,VoicipreluOpérateur,Les codes pertinents sont les suivants::
const AnfNodePtr PReluFusion::Process(const FuncGraphPtr &graph, const AnfNodePtr &node, const
EquivPtr &equiv) const {
MS_EXCEPTION_IF_NULL(graph);
MS_EXCEPTION_IF_NULL(node);
MS_EXCEPTION_IF_NULL(equiv);
BaseRef &x_gnode = (*equiv)[x_];
BaseRef &weight_gnode = (*equiv)[weight_];
auto x = utils::cast(x_gnode);
auto weight = utils::cast(weight_gnode);
MS_EXCEPTION_IF_NULL(x);
MS_EXCEPTION_IF_NULL(weight);
auto prim = std::make_shared(kPReluOpName);
MS_EXCEPTION_IF_NULL(prim);
std::vectorinputs = {NewValueNode(prim), x, weight};
auto fusion_node = graph->NewCNode(inputs);
MS_EXCEPTION_IF_NULL(fusion_node);
fusion_node->set_abstract(node->abstract());
fusion_node->set_scope(node->scope());
return fusion_node;
}
Y en a ici.kPReluOpNameC'est moi qui l'ai défini,Pointage“PReLU”Cet opérateur, Pendant l'essai, un trou est tombé à cause de cet opérateur , C'est - à - dire les questions ci - dessous. .
Partage des expériences en matière de résolution de problèmes
Une fois le code écrit , Au cours de l'essai, j'ai rencontré bug, Une erreur majeure est survenue lors de l'exécution du cas d'essai :
J'ai fait le dépannage suivant en fonction des messages d'erreur :
Voir si le Code d'écriture a mal tourné
Afficher les codes de cas de test d'erreur , Analyse des points d'erreur possibles
Approfondir les fichiers couche par couche , Voir les fichiers qui peuvent entrer en conflit avec le Code que vous avez écrit
Suivez les étapes ci - dessus,Effectuer l'inspection,Résoudre les problèmes.
1. La documentation est d'abord examinée.
À cet égard, l & apos; accès aux documents pertinents est plus familier, étant donné qu & apos; il a déjà été établi. ,Processus de compilation etdemo Aucun problème avec le processus d'essai , Je l'ai exclu subjectivement. .
2. Afficher les codes de cas de test d'erreur
Après avoir examiné attentivement son Code modèle , J'ai constaté qu'il n'y avait pas de conflit direct avec le document que j'avais écrit. , Il peut y avoir un conflit entre le fichier que j'ai écrit et le fichier que j'ai appelé , Ensuite, il y a un examen des documents qui s'y rapportent , Vérifier les conflits possibles .
3. Vérifier les fichiers de conflit
Lors de l'examen des documents pertinents , Il a été constaté que les documents en question étaient plus étendus. , Cela m'a fait découvrir qu'il était presque impossible de juger les documents contradictoires en les consultant un par un. , Ça m'a forcé à trouver une autre issue. ;
Puisque l'accès à tous les documents n'est pas souhaitable , J'aimerais d'abord consulter les fichiers de code impliqués dans la création du fichier ,Dans laquellemindspore/ mindspore / ccsrc / utils / utils.h J'ai trouvé l'écriture pass Et ses environs pass Les opérateurs impliqués sont les suivants:
namespace mindspore {
constexpr auto kSquareSumV1OpName = "SquareSumV1";
constexpr auto kSquareSumV2OpName = "SquareSumV2";
constexpr auto kClipByNormNoDivSumOpName = "ClipByNormNoDivSum";
constexpr auto kPReluOpName = "PReLU";
constexpr auto kGreaterOpName = "Greater";
constexpr auto kSqrtOpName = "Sqrt";
Ça m'a fait me demander si c'était pass Mauvais opérateur de remplacement défini dans , Avec cette idée , L'Ascension que j'ai assignée 910 Tester les cas d'erreur dans l'environnement , Il n'y a pas eu d'erreur dans la découverte magique. , Cela m'a fait réfléchir à la différence entre pousser le code communautaire et le code local. , La découverte finale est due à une erreur de définition de l'opérateur optimisé :Personnaliséprelu Opérateur et réel PReLU Les opérateurs ne correspondent pas , Erreur qui a causé le cas d'essai . En fait, nous devons faire correspondre les opérateurs personnalisés aux opérateurs existants , Remplacer la structure de l'opérateur correspondant par une structure d'opérateur optimisée existante .
Finalement, l'erreur a été résolue. , Enfin, sous la direction d'un mentor, gitee On a proposé issue Avec pr, Modification et optimisation après examen par le superviseur , Cela m'a également permis d'en apprendre davantage sur les spécifications et l'optimisation du Code pour la communauté. .
Résumé de l'expérience
Comme première connaissance MindSpore(https://www.mindspore.cn)Petit blanc, Cette expérience de développement de projet m'a certainement beaucoup profité , Faire face à MindSporePremière étape.
La communication est le meilleur pont
L'achèvement du projet dépend de la communication avec le mentor :
Le Programme d'apprentissage initial a été élaboré grâce aux conseils et à l'aide des mentors. , Cela m'a donné une certaine orientation dans le développement de projets ;
Comme prévu, Retour d'information rapide à l'instructeur après chaque étape , Et consultez votre tuteur pour les problèmes non résolus qu'il rencontre , Le mentor m'a aussi patiemment aidé à trouver des solutions. ;
Communiquer avec les mentors lors de la fusion des codes d'entrepôt communautaires ,Code de spécification, Réduire les opérations redondantes , Le Code a été incorporé avec succès dans l'entrepôt après examen par le superviseur .
Expérience
Le développement de ce projet est à la base , J'ai passé plus de temps à examiner les documents pertinents pendant l'élaboration du projet. , Comprendre l'écriture d'une optimisation pass Documents concernés et leurs dépendances , Je sais comment écrire le Code. , Le processus d'écriture réel semble relativement facile ,En cours de développement, Ce qui m'a impressionné :
L'environnement public doit être manipulé avec prudence : Lors de l'exploitation de l'environnement public assigné , Par négligence , Affecte le fonctionnement normal de l'ensemble de l'environnement public , Ça m'a particulièrement impressionné. , Heureusement, le problème n'est pas grand - chose. , Résolu à temps ;
Communiquer en temps opportun avec le superviseur ,Accumuler de l'expérience:Lors de l'élaboration du projet, L'expérience est particulièrement importante ,Début du développement du projet,Manque d'expérience, Je ne sais pas par où commencer. , Heureusement, grâce à la communication des mentors , Ça m'a donné une idée claire de l'orientation de mon développement. , Faire progresser régulièrement le projet comme prévu ;
Compréhension approfondie du contenu du projet , Après avoir déterminé l'orientation du développement , Puis le développement réel :Après une période d'étude, Je pense que l'orientation du développement est claire , Après le développement réel , Parce qu'une erreur de compréhension , Ça a causé beaucoup de problèmes. , Comme les questions ci - dessus ④, C'est une mauvaise compréhension du remplacement de l'opérateur de corrélation ;En fait, Les erreurs de programmation causées par une mauvaise pensée ou compréhension sont fréquentes .
Normalisation des codes et réduction des opérations redondantes : Lors de l'intégration du Code dans la communauté , J'ai été profondément impressionné par les problèmes de spécification et de redondance du Code que j'ai écrit. , Bien sûr, ces questions ne peuvent pas être complètement contournées. , Mais cela m'a aussi fait sentir la normalisation et la simplification des normes communautaires. , En temps normal, il devrait être consciemment considéré comme sa propre norme .
Auto - évaluation
Les exigences et les objectifs du projet ont été atteints. , La correspondance a été résolue issue
https://gitee.com/mindspore/mindspore/issues/I44PH8?from=project-issue,
Code de sortie à pr
https://gitee.com/mindspore/mindspore/pulls/21572
Sous la forme d'un entrepôt communautaire ,A réalisé un MindSpore Couche IR Optimisation de la fusion pass.
Bien que la difficulté globale du projet ne soit pas difficile , Mais il y a eu beaucoup de difficultés dans le processus de développement ,Et beaucoup.,Ça m'a beaucoup profité..
MindSporeInformations officielles
OfficiellementQQGroupe : 486831414
Site officiel:https://www.mindspore.cn/
Gitee : https : //gitee.com/mindspore/mindspore
GitHub : https://github.com/mindspore-ai/mindspore
Forum:https://bbs.huaweicloud.com/forum/forum-1076-1.html
边栏推荐
- Warehouse database fields_ Summary of SQL problems in kingbase8 migration of Jincang database
- Margin left: -100% understanding in the Grail layout
- Topic | synchronous asynchronous
- Realize the reuse of components with different routing parameters and monitor the changes of routing parameters
- Beginners use Minio
- New stills of Lord of the rings: the ring of strength: the caster of the ring of strength appears
- HCIA notes
- Chapter VI - Containers
- twenty million two hundred and twenty thousand three hundred and nineteen
- [cmake] cmake link SQLite Library
猜你喜欢
The embodiment of generics in inheritance and wildcards
[set theory] Stirling subset number (Stirling subset number concept | ball model | Stirling subset number recurrence formula | binary relationship refinement relationship of division)
Image recognition and detection -- Notes
Use of file class
项目经验分享:基于昇思MindSpore,使用DFCNN和CTC损失函数的声学模型实现
Reconnaissance et détection d'images - Notes
Dora (discover offer request recognition) process of obtaining IP address
Various postures of CS without online line
最全SQL与NoSQL优缺点对比
Analysis of the problems of the 10th Blue Bridge Cup single chip microcomputer provincial competition
随机推荐
Use of other streams
Leetcode 198: house raiding
Arduino 软串口通信 的几点体会
Common analysis with criteria method
Leetcode 198: 打家劫舍
Application of pigeon nest principle in Lucene minshouldmatchsumscorer
Logging log configuration of vertx
Inverted chain disk storage in Lucene (pfordelta)
Introduction of transformation flow
"Moss ma not found" solution
4EVERLAND:IPFS 上的 Web3 开发者中心,部署了超过 30,000 个 Dapp!
IPv4 address
不出网上线CS的各种姿势
Jeecg request URL signature
TCP cumulative acknowledgement and window value update
Paper learning -- Study on the similarity of water level time series of Xingzi station in Poyang Lake
为什么说数据服务化是下一代数据中台的方向?
SQL create temporary table
Vertx restful style web router
The difference between typescript let and VaR