314 votes

Comment compiler Tensorflow avec les instructions SSE4.2 et AVX ?

C'est le message reçu lors de l'exécution d'un script pour vérifier si Tensorflow fonctionne :

I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

J'ai remarqué qu'il a mentionné SSE4.2 et AVX,

  1. Que sont SSE4.2 et AVX ?
  2. Comment ces SSE4.2 et AVX améliorent-ils les calculs du CPU pour les tâches Tensorflow.
  3. Comment faire compiler Tensorflow en utilisant les deux bibliothèques ?

19 votes

J'aime construire avec ces drapeaux bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package Sur un Xeon E5 v3, cela me donne une amélioration de 3x la vitesse du CPU pour les matrices 8k par rapport à la version officielle (0.35 -> 1.05 T ops/sec).

4 votes

Et n'oubliez pas NOTE on gcc 5 or later: the binary pip packages available on the TensorFlow website are built with gcc 4, which uses the older ABI. To make your build compatible with the older ABI, you need to add --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" to your bazel build command. ABI compatibility allows custom ops built against the TensorFlow pip package to continue to work against your built package. d'ici tensorflow.org/install/install_sources

5 votes

J'ai quelques binaires compilés pour TF supportant ces instructions. github.com/lakshayg/tensorflow-build . Vous pourriez trouver cela utile.

171voto

Mike Chiu Points 1429

Je viens de rencontrer le même problème, il semble que la suggestion de Yaroslav Bulatov ne couvre pas le support de SSE4.2, en ajoutant --copt=-msse4.2 suffirait. Au final, j'ai réussi à construire avec

bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

sans recevoir d'avertissement ou d'erreur.

Le meilleur choix pour tout système est probablement :

bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

( Mise à jour : les scripts de construction peuvent être mangés -march=native peut-être parce qu'il contient un = .)

-mfpmath=both ne fonctionne qu'avec gcc, pas avec clang. -mfpmath=sse est probablement aussi bonne, sinon meilleure, et est la valeur par défaut pour x86-64. Les constructions 32 bits utilisent par défaut -mfpmath=387 La modification de ce paramètre sera donc utile pour le 32 bits. (Mais si vous voulez des performances élevées pour le calcul des nombres, vous devriez construire des binaires 64 bits).

Je ne suis pas sûr de la valeur par défaut de TensorFlow pour -O2 ou -O3 est. gcc -O3 permet une optimisation complète, y compris l'auto-vectorisation, mais cela peut parfois rendre le code plus lent.


Ce que ça fait : --copt pour bazel build passe une option directement à gcc pour compiler les fichiers C et C++ (mais pas pour les lier, donc vous avez besoin d'une option différente pour l'optimisation du temps de liaison entre les fichiers).

x86-64 gcc n'utilise par défaut que les instructions SIMD SSE2 ou plus anciennes, de sorte que vous pouvez exécuter les binaires sous tout Système x86-64. (Voir https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html ). Ce n'est pas ce que vous voulez. Vous voulez faire un binaire qui tire parti de toutes les instructions que votre CPU peut exécuter, parce que vous n'exécutez ce binaire que sur le système où vous l'avez construit.

-march=native active toutes les options que votre CPU supporte, donc il fait -mavx512f -mavx2 -mavx -mfma -msse4.2 redondant. (Aussi, -mavx2 permet déjà -mavx y -msse4.2 donc le commandement de Yaroslav aurait dû être parfait). De plus, si vous utilisez un processeur qui ne prend pas en charge l'une de ces options (comme FMA), utiliser la commande -mfma ferait un binaire qui se trompe avec des instructions illégales.

L'approche de TensorFlow ./configure Activation par défaut -march=native L'utilisation de cette option devrait éviter de devoir spécifier manuellement les options du compilateur.

-march=native permet à -mtune=native donc il est optimisé pour votre CPU pour des choses comme la séquence d'instructions AVX qui est la meilleure pour les charges non alignées.

Tout ceci s'applique à gcc, clang, ou ICC. (Pour ICC, vous pouvez utiliser -xHOST au lieu de -march=native .)

7 votes

Cela fonctionne en effet > +1 ! Il semble donc que -march=native ne fait pas son travail. De plus, laisser tomber le --config=cuda (si le support CUDA n'est pas nécessaire) et l'option -k (puisqu'aucune erreur ne s'est produite pendant la compilation) fonctionne également.

4 votes

Après avoir désinstallé et réinstallé la nouvelle version compilée, je reçois toujours des avertissements pour AVX, AVX2 et FMA.

6 votes

J'ai dû laisser tomber --copt=-mfpmath=both pour le faire fonctionner avec clang sur macOS. Cela affecte-t-il le binaire résultant ?

140voto

Salvador Dali Points 11667

Commençons par l'explication de pourquoi voyez-vous ces avertissements en premier lieu ? .


Il est fort probable que vous n'ayez pas installé TF depuis les sources et que vous ayez utilisé quelque chose comme pip install tensorflow . Cela signifie que vous avez installé des binaires préconstruits (par quelqu'un d'autre) qui n'étaient pas optimisés pour votre architecture. Et ces avertissements vous disent exactement ceci : quelque chose est disponible sur votre architecture, mais il ne sera pas utilisé car le binaire n'a pas été compilé avec. Voici la partie de documentation .

TensorFlow vérifie au démarrage s'il a été compilé avec l'option optimisations disponibles sur le CPU. Si les optimisations ne sont pas incluses, TensorFlow émettra des avertissements, par exemple : AVX, AVX2, et FMA non incluses.

La bonne chose est que il est fort probable que vous souhaitiez simplement apprendre/expérimenter avec la TF afin que tout fonctionne correctement et que vous n'ayez pas à vous en inquiéter


Que sont SSE4.2 et AVX ?

Wikipedia a une bonne explication sur SSE4.2 y AVX . Ces connaissances ne sont pas nécessaires pour être bon en apprentissage automatique. Vous pouvez les considérer comme un ensemble de connaissances supplémentaires. instructions pour un ordinateur d'utiliser plusieurs points de données contre une seule instruction pour effectuer des opérations qui peuvent être naturellement parallélisées (par exemple l'addition de deux tableaux).

SSE et AVX sont tous les deux des implémentations d'une idée abstraite de SIMD (Instruction unique, données multiples), qui est

une classe d'ordinateurs parallèles dans la taxonomie de Flynn. Elle décrit les ordinateurs dotés de plusieurs éléments de traitement qui effectuent la même opération sur plusieurs points de données simultanément. Ainsi, de telles machines exploitent le parallélisme au niveau des données, mais pas la concurrence : il existe des opérations des calculs simultanés (parallèles), mais un seul processus (instruction) à un moment donné. (instruction) à un moment donné

Cela suffit pour répondre à votre prochaine question.


Comment ces SSE4.2 et AVX améliorent-ils les calculs du CPU pour les tâches TF

Ils permettent un calcul plus efficace de diverses opérations vectorielles (matrice/tenseur). Vous pouvez en savoir plus dans ces diapositives


Comment faire compiler Tensorflow en utilisant les deux bibliothèques ?

Vous devez avoir un binaire qui a été compilé pour profiter de ces instructions. Le moyen le plus simple est de compilez-le vous-même . Comme Mike et Yaroslav l'ont suggéré, vous pouvez utiliser la commande bazel suivante

bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

6 votes

Que signifie cette ligne de commande ? Et dois-je installer bazel dans cette affaire ?

1 votes

Est-ce que quelqu'un a déjà construit sous windows 64 bit avec MSYS2 ou Visual Studio 2017 ommunity Edition ? et peut partager les étapes ?

1 votes

Ce paquet pip peut-il être installé dans un environnement conda sur la machine locale ?

56voto

Thornhale Points 1181

Je vais d'abord répondre à votre troisième question :

Si vous voulez exécuter une version auto-compilée dans un conda-env, vous pouvez le faire. Voici les instructions générales que j'exécute pour que tensorflow s'installe sur mon système avec des instructions supplémentaires. Note : Cette construction a été faite pour un AMD A10-7850 (vérifiez votre CPU pour savoir quelles instructions sont supportées... cela peut différer) sous Ubuntu 16.04 LTS. J'utilise Python 3.5 dans mon conda-env. Le crédit va à la page d'installation des sources de tensorflow et aux réponses fournies ci-dessus.

git clone https://github.com/tensorflow/tensorflow 
# Install Bazel
# https://bazel.build/versions/master/docs/install.html
sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel
# Create your virtual env with conda.
source activate YOUR_ENV
pip install six numpy wheel, packaging, appdir
# Follow the configure instructions at:
# https://www.tensorflow.org/install/install_sources
# Build your build like below. Note: Check what instructions your CPU 
# support. Also. If resources are limited consider adding the following 
# tag --local_resources 2048,.5,1.0 . This will limit how much ram many
# local resources are used but will increase time to compile.
bazel build -c opt --copt=-mavx --copt=-msse4.1 --copt=-msse4.2  -k //tensorflow/tools/pip_package:build_pip_package
# Create the wheel like so:
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
# Inside your conda env:
pip install /tmp/tensorflow_pkg/NAME_OF_WHEEL.whl
# Then install the rest of your stack
pip install keras jupyter etc. etc.

Quant à votre deuxième question :

Une version auto-compilée avec des optimisations vaut bien l'effort à mon avis. Sur ma configuration particulière, les calculs qui prenaient 560-600 secondes ne prennent plus que 300 secondes ! Bien que les chiffres exacts varient, je pense que vous pouvez vous attendre à une augmentation de la vitesse d'environ 35-50% en général sur votre installation particulière.

Enfin, votre première question :

Une grande partie des réponses ont déjà été fournies ci-dessus. Pour résumer : AVX , SSE4.1, SSE4.2 Les MFA sont différents types de jeux d'instructions étendus sur les processeurs X86. Beaucoup contiennent des instructions optimisées pour le traitement des opérations matricielles ou vectorielles.

Je vais souligner ma propre idée fausse pour vous faire gagner du temps : Ce n'est pas que SSE4.2 soit une nouvelle version d'instructions remplaçant SSE4.1. SSE4 = SSE4.1 (un ensemble de 47 instructions) + SSE4.2 (un ensemble de 7 instructions).

Dans le contexte de la compilation de tensorflow, si votre ordinateur supporte AVX2 et AVX, et SSE4.1 et SSE4.2, vous devriez mettre ces drapeaux d'optimisation pour tous. Ne faites pas comme moi et choisissez SSE4.2 en pensant qu'il est plus récent et qu'il devrait supplanter SSE4.1. C'est clairement FAUX ! J'ai dû recompiler à cause de cela, ce qui m'a coûté 40 bonnes minutes.

0 votes

Où est stocké le fichier .whl car je veux l'installer sous Windows également ?

0 votes

Il est stocké ici : /tmp/tensorflow_pkg (sur votre disque linux)

0 votes

Pouvez-vous me dire combien de temps cela va prendre. Cela fait environ 2 heures et mon ordinateur portable a gelé. Son exécution ububtu avec 4gb de ram et un processeur i5.

25voto

Ce sont SIMD jeux d'instructions de traitement vectoriel .

L'utilisation d'instructions vectorielles est plus rapide pour de nombreuses tâches ; l'apprentissage automatique est l'une de ces tâches.

En citant le Documents d'installation de tensorflow :

Pour être compatible avec un éventail de machines aussi large que possible, TensorFlow utilise par défaut uniquement les instructions SIMD SSE4.1 sur les machines x86. La plupart des PC et Mac modernes supportent des instructions plus avancées, donc si vous construisez un binaire que vous n'exécuterez que sur votre propre machine, vous pouvez les activer en utilisant la commande --copt=-march=native dans votre commande de construction de bazel.

0 votes

Pourquoi le binaire de Tensorflow n'utilise-t-il pas le dispatching du CPU ? Est-ce mal supporté par GCC ?

4 votes

Le lien "tensorflow installation docs" ne fonctionne pas. Je me demande donc si cette réponse est toujours valable. Veuillez répondre !

0 votes

@ChrisPushbullet vous pouvez compiler Tensorflow pour prendre en charge plusieurs capacités de calcul différentes pour le GPU, mais elles augmentent considérablement la taille du binaire. Je pense qu'il en va de même pour le CPU.

22voto

JARS Points 567

Grâce à toutes ces réponses + quelques essais et erreurs, j'ai réussi à l'installer sur un Mac avec clang . Je partage donc ma solution au cas où elle serait utile à quelqu'un.

  1. Suivez les instructions sur Documentation - Installer TensorFlow à partir des sources

  2. Lorsque vous êtes invité à

    Veuillez spécifier les drapeaux d'optimisation à utiliser pendant la compilation lorsque l'option bazel "--config=opt" est spécifiée [La valeur par défaut est -march=native].

puis copier-coller cette chaîne :

-mavx -mavx2 -mfma -msse4.2

(L'option par défaut a provoqué des erreurs, de même que certains des autres drapeaux. Je n'ai eu aucune erreur avec les drapeaux ci-dessus. BTW j'ai répondu n à toutes les autres questions)

Après l'installation, j'ai constaté un gain de vitesse d'environ 2 à 2,5 fois lors de l'apprentissage de modèles profonds par rapport à une autre installation utilisant les roues par défaut. Installation de TensorFlow sur macOS

J'espère que cela vous aidera

4 votes

-march=native devrait être encore meilleur si votre compilateur le supporte correctement. Il définit également -mtune=native pour faire de bons choix d'instructions pour votre CPU, par exemple sur Haswell et les versions ultérieures, il désactive -mavx256-split-unaligned-store y -mavx256-split-unaligned-load qui sont activés par défaut pour -mtune=generic et de nuire aux performances lorsque les données ne sont pas connues pour être alignées mais s'avèrent l'être au moment de l'exécution.

1 votes

Merci ! Dans mon cas -march=native a provoqué une erreur alors que les autres options n'en ont pas provoqué. Peut-être que c'est le compilateur spécifique. Je partageais cela précisément au cas où d'autres personnes auraient rencontré le même problème.

1 votes

Quelle erreur ? À moins que le système de construction ne s'étouffe sur une chaîne de caractères avec un caractère = ou vous n'utilisez pas gcc ou clang cela devrait fonctionner. Et est-ce que -mtune=native -mavx2 -mfma travailler pour vous ? Ou -mtune=skylake ? (Ou tout autre processeur que vous avez). BTW, -mavx2 implica -mavx y -msse4.2 . Ce n'est pas blesser pour les inclure tous dans une recette, et je suppose que cela permet aux gens de laisser de côté ceux que leur processeur ne prend pas en charge.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X