web-dev-qa-db-fra.com

Pourquoi exprimant des calculs en tant que multiplications matricielles les rend plus rapides?

Dans Google didacticiel mnist utilisant Tensorflow , un calcul est exposé dans lequel une étape équivaut à multiplier une matrice par un vecteur. Google présente d'abord une image dans laquelle chaque multiplication numérique et chaque addition irait à effectuer le calcul est écrit en totalité. Ensuite, ils montrent une image dans laquelle il est plutôt exprimé en tant que multiplication de matrice, affirmant que cette version du calcul est, ou du moins pourrait être plus rapide:

Si nous écrivons cela comme des équations, nous obtenons:

scalar equation

Nous pouvons "vectoriser" cette procédure, la transformant en une multiplication de matrice et de l'addition de vecteur. Ceci est utile pour une efficacité informatique. (C'est aussi un moyen utile de penser.)

vector equation

Je sais que des équations comme celle-ci sont généralement écrites dans le format de multiplication de matrice par des praticiens d'apprentissage de la machine et peuvent bien sûr voir des avantages de le faire des points de vue du code de code ou de la compréhension des mathématiques. Ce que je ne comprends pas, c'est que la revendication de Google qui convertit de la forme Longhande à la forme matricielle "est utile pour une efficacité informatique"

Quand, pourquoi, et comment serait-il possible d'obtenir des améliorations de performance dans des logiciels en exprimant des calculs comme multiplications matricielles? Si je devais calculer la multiplication de matrice dans la seconde image (matricielle), je le ferais en tant qu'être humain, je le ferais en faisant de manière séquentielle chacun des calculs distincts indiqués dans la première image (scalaire). Pour moi, ils ne sont rien d'autre que deux notations pour la même séquence de calculs. Pourquoi est-ce différent pour mon ordinateur? Pourquoi un ordinateur serait-il capable d'effectuer le calcul de la matrice plus rapidement que le scalaire?

18
Mark Amery

Cela peut sembler évident, mais les ordinateurs n'exécutent pas formules , ils exécutent Code , et combien de temps l'exécution dépend directement du code qu'ils exécutent et ne sont que indirectement sur tout concept que le code implémente. Deux pièces de code logiquement identiques peuvent avoir des caractéristiques de performance très différentes. Certaines raisons susceptibles de contourner la multiplication de matrice spécifiquement:

  • En utilisant plusieurs threads. Il n'y a presque pas de processeur moderne qui n'a pas de nœuds multiples, de nombreux ont jusqu'à 8 personnes et des machines spécialisées pour l'informatique hautes performances peuvent facilement avoir 64 sur plusieurs prises. Le code d'écriture de la manière évidente, dans un langage de programmation normal, utilise uniquement un de ceux-ci. En d'autres termes, il peut utiliser moins de 2% des ressources informatiques disponibles de la machine, il s'exécute sur.
  • Utilisation des instructions SIMD (confortablement, cela s'appelle également "vectorisation" mais dans un sens différent de celui des citations de texte de la question). En substance, au lieu de 4 ou 8 instructions arithmétiques scalaires, donnez la CPU une Instruction qui effectue des arithmétiques sur 4 ou 8 ou donc des registres en parallèle. Cela peut littéralement faire des calculs (quand ils sont parfaitement indépendants et adaptés au jeu d'instructions) 4 ou 8 fois plus rapides.
  • Faire plus intelligemment tilisation du cache . L'accès à la mémoire est plus rapide s'ils sont Cohérent temporairement et spatialement, c'est-à-dire des accès consécutifs des adresses à proximité et lorsque vous accédez à une adresse deux fois, vous y accédez deux fois de succession rapide plutôt qu'avec une longue pause.
  • En utilisant des accélérateurs tels que GPU. Ces appareils sont des bêtes très différentes des processeurs et les programmment efficacement constitue une forme d'art entière. Par exemple, ils ont des centaines de noyaux, regroupés en groupes de quelques dizaines de noyaux, et ces groupes partagent des ressources - ils partagent quelques kib de mémoire beaucoup plus rapides que la mémoire normale, et lorsque tout noyau du groupe exécute un if Déclaration Tous les autres de ce groupe doivent l'attendre.
  • Distribuer le travail sur plusieurs machines (très important dans les supercalculateurs!), Qui introduit un énorme ensemble de nouvelles maux de tête, mais peut bien sûr donner accès à des ressources informatiques considérablement plus grandes.
  • Algorithmes plus intelligents. Pour la multiplication de matrice, le simple algorithme O (N ^ 3), correctement optimisé avec les astuces ci-dessus, sont souvent plus rapides que les sous-cubes pour une taille de matrice raisonnable, mais parfois ils gagnent. Pour des cas spéciaux tels que des matrices clairsemées, vous pouvez écrire des algorithmes spécialisés.

Beaucoup de personnes intelligentes ont écrit très très Code efficace des opérations d'algèbre linéaire communes , en utilisant les astuces ci-dessus et de nombreux autres et généralement même avec des astuces stupides spécifiques à la plate-forme. Par conséquent, transformer votre formule en une multiplication matricielle puis la mise en œuvre de ce calcul en appelant dans une bibliothèque algébrique linéaire mature Avantages de cet effort d'optimisation. En revanche, si vous écrivez simplement la formule de la manière évidente dans une langue de haut niveau, le code de la machine qui est finalement généré n'utilisera pas toutes ces astuces et ne sera pas aussi rapide. Ceci est également vrai si vous prenez la formulation de matrice et mettez-la en appelant en appelant une routine de multiplication matricielle naïve que vous avez écrite vous-même (à nouveau, de la manière évidente).

Faire du code rapide prend du travail, et souvent beaucoup de travail si vous voulez que cette dernière once de performance. Parce que tant de calculs importants peuvent être exprimés comme une combinaison de quelques opérations d'algèbre linéaire, il est économique de créer un code hautement optimisé pour ces opérations. Votre cas d'utilisation spécialisée unique, cependant? Personne ne se soucie de ça sauf que vous, optimisant ainsi le diable en dehors de celui-ci n'est pas économique.

19
user7043