web-dev-qa-db-fra.com

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

Voici le message reçu suite à 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 de processeur pour les tâches Tensorflow.

3) Comment compiler Tensorflow en utilisant les deux librairies?

237
GabrielChu

Je viens de rencontrer ce même problème, il semble que la suggestion de Yaroslav Bulatov ne couvre pas le support de SSE4.2, ajouter --copt=-msse4.2 suffirait. Finalement, 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 obtenir aucun avertissement ou des erreurs.

Le meilleur choix pour n'importe quel système est probablement:

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

(Update: les scripts de génération peuvent être en train de manger -march=native , probablement parce qu'il contient un =.)

-mfpmath=both ne fonctionne qu'avec gcc, pas clang. -mfpmath=sse est probablement aussi bon, sinon meilleur, et est la valeur par défaut pour x86-64. Les versions 32 bits sont définies par défaut sur -mfpmath=387. Le fait de changer cela aidera pour 32 bits. (Mais si vous voulez des performances élevées pour le traitement des chiffres, vous devez créer des fichiers binaires 64 bits.)

Je ne sais pas ce que TensorFlow utilise par défaut pour -O2 ou -O3. gcc -O3 permet une optimisation complète incluant la vectorisation automatique, mais cela peut parfois ralentir le code.


Ce que cela fait: --copt POUR bazel build passe directement une option à gcc pour la compilation de fichiers C et C++ (sans liaison, vous avez donc besoin d'une option différente pour l'optimisation du temps de lien entre fichiers)

par défaut, x86-64 gcc utilise uniquement des instructions SIMD SSE2 ou antérieures, vous pouvez donc exécuter les fichiers binaires sur le système indifférent x 86-64. (Voir https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html ). Ce n'est pas ce que tu veux. Vous voulez créer un binaire qui tire parti de toutes les instructions que votre processeur peut exécuter, car vous n'exécutez ce binaire que sur le système où vous l'avez construit.

-march=native active toutes les options prises en charge par votre processeur, donc -mavx512f -mavx2 -mavx -mfma -msse4.2 est redondant. (En outre, -mavx2 active déjà -mavx et -msse4.2, la commande de Yaroslav aurait donc dû être correcte). De même, si vous utilisez un processeur qui ne prend pas en charge l’une de ces options (comme FMA), utiliser -mfma créerait un fichier binaire défaillant avec des instructions non conformes.

La valeur par défaut ./configure de TensorFlow est d'activer -march=native . Son utilisation évite donc de devoir spécifier les options du compilateur manuellement.

-march=native active -mtune=native, donc il optimise pour votre CPU pour des choses telles que la séquence d'instructions AVX qui convient le mieux aux charges non alignées.

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

141
Mike Chiu

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


Très probablement, vous n'avez pas installé TF à partir des sources et vous avez utilisé à la place quelque chose comme pip install tensorflow. Cela signifie que vous avez installé des binaires pré-construits (par quelqu'un d'autre) qui n'ont pas été 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 fichier binaire n’a pas été compilé avec. Voici la partie de documentation .

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

La bonne chose est que très probablement, vous voulez simplement apprendre/expérimenter avec TF afin que tout fonctionne correctement et que vous ne devriez pas vous en inquiéter


Que sont SSE4.2 et AVX?

Wikipedia a une bonne explication sur SSE4.2 et AVX . Cette connaissance n'est pas nécessaire pour être bon en apprentissage automatique. Vous pouvez les considérer comme un ensemble de instructions supplémentaires permettant à un ordinateur d'utiliser plusieurs points de données pour une seule instruction afin d'effectuer des opérations qui peuvent être naturellement parallélisées (par exemple, l'ajout de deux tableaux). 

SSE et AVX implémentent une idée abstraite de SIMD (instruction unique, données multiples), qui est

une classe d'ordinateurs parallèles dans la taxonomie de Flynn. Il decrit ordinateurs avec plusieurs éléments de traitement effectuant la même chose opération sur plusieurs points de données simultanément. Ainsi, de telles machines exploiter le parallélisme au niveau des données, mais pas la concurrence: il y a calculs simultanés (parallèles), mais un seul processus (instruction) à un moment donné

Cela suffit pour répondre à votre prochaine question.


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

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


Comment faire compiler Tensorflow en utilisant les deux librairies?

Vous devez avoir un fichier binaire qui a été compilé pour tirer parti de ces instructions. Le moyen le plus simple consiste à le compiler 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

119
Salvador Dali

Laissez-moi répondre à votre 3ème question d'abord:

Si vous voulez exécuter une version auto-compilée dans un conda-env, vous pouvez le faire. Ce sont les instructions générales que je lance pour obtenir tensorflow à installer sur mon système avec des instructions supplémentaires. Remarque: Cette version s’appliquait à une version AMD A10-7850 (vérifiez que votre CPU ne connaît pas les instructions prises en charge ... 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 de la source 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.

Concernant votre 2ème question:

Une version auto-compilée avec des optimisations en valent bien la peine, à mon avis. Sur ma configuration particulière, les calculs qui prenaient auparavant entre 560 et 600 secondes ne prennent maintenant qu’environ 300 secondes! Bien que les chiffres exacts varient, je pense que vous pouvez vous attendre à une augmentation de la vitesse de 35 à 50% en général sur votre configuration particulière.

Enfin votre 1ère question:

Beaucoup de réponses ont déjà été fournies ci-dessus. Pour résumer: AVX , SSE4.1, SSE4.2 , MFA sont différents types de jeux d'instructions étendus sur les CPU 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 un peu de temps: SSE4.2 n’est pas une version plus récente des instructions remplaçant SSE4.1. SSE4 = SSE4.1 (ensemble de 47 instructions) + SSE4.2 (ensemble de 7 instructions).

Dans le contexte de la compilation tensorflow, si votre ordinateur prend en charge AVX2 et AVX, ainsi que SSE4.1 et SSE4.2, vous devez placer ces indicateurs d'optimisation pour tous. Ne faites pas comme je l'ai fait et allez simplement avec SSE4.2 en pensant que c'est plus récent et qu'il devrait remplacer SSE4.1. C'est clairement faux! J'ai dû recompiler à cause de cela qui m'a coûté 40 bonnes minutes.

50
Thornhale

Ce sont SIMDjeux d'instructions de traitement vectoriel

L'utilisation d'instructions vectorielles est plus rapide pour de nombreuses tâches. L'apprentissage automatique est une telle tâche.

Citant les documents d’installation de tensorflow :

Pour être compatible avec une gamme de machines aussi large que possible, TensorFlow utilise par défaut uniquement les instructions SSE4.1 SIMD sur des machines x86. La plupart des PC et des Mac modernes prennent en charge des instructions plus avancées. Ainsi, si vous créez un fichier binaire que vous n'exécuterez que sur votre propre ordinateur, vous pouvez l'activer à l'aide de --copt=-march=native dans votre commande de compilation bazel.

25

Merci à toutes ces réponses + quelques essais et erreurs, j'ai réussi à l'installer sur un Mac avec clang. Il suffit donc de partager ma solution au cas où elle serait utile à quelqu'un. 

  1. Suivez les instructions de Documentation - Installation de TensorFlow à partir de sources

  2. Lorsque demandé 

    Veuillez spécifier les indicateurs d'optimisation à utiliser lors de 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 entraînait des erreurs, de même que certains des autres drapeaux. Je n'ai eu aucune erreur avec les drapeaux ci-dessus. Au fait, j'ai répondu n à toutes les autres questions)

Après l’installation, je vérifie une accélération de 2x à 2.5x lors de la formation de modèles approfondis par rapport à une autre installation basée sur les roues par défaut - Installation de TensorFlow sur macOS

J'espère que ça aide

14
JARS

Je l’ai récemment installée à partir des sources et toutes les étapes nécessaires pour l’installer à partir des sources sont décrites ci-dessous.

D'autres réponses décrivent déjà pourquoi ces messages sont affichés. Ma réponse explique étape par étape comment installer isnstall, ce qui peut aider les gens à maîtriser l’installation proprement dite, comme je l’ai fait.

  1. Installer Bazel

Téléchargez-le depuis l’un de leurs releases , par exemple 0.5.2 . Extrayez-le, allez dans le répertoire et configurez-le: bash ./compile.sh. Copiez l’exécutable dans /usr/local/bin: Sudo cp ./output/bazel /usr/local/bin

  1. Installer Tensorflow

Cloner tensorflow: git clone https://github.com/tensorflow/tensorflow.git Accédez au répertoire cloné pour le configurer: ./configure

Il vous invitera à poser plusieurs questions. J'ai suggéré la réponse à chacune des questions. Vous pouvez bien entendu choisir vos propres réponses selon vos préférences:

Using python library path: /usr/local/lib/python2.7/dist-packages
Do you wish to build TensorFlow with MKL support? [y/N] y
MKL support will be enabled for TensorFlow
Do you wish to download MKL LIB from the web? [Y/n] Y
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: 
Do you wish to use jemalloc as the malloc implementation? [Y/n] n
jemalloc disabled
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N] N
No Hadoop File System support will be enabled for TensorFlow
Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N] N
No XLA JIT support will be enabled for TensorFlow
Do you wish to build TensorFlow with VERBS support? [y/N] N
No VERBS support will be enabled for TensorFlow
Do you wish to build TensorFlow with OpenCL support? [y/N] N
No OpenCL support will be enabled for TensorFlow
Do you wish to build TensorFlow with CUDA support? [y/N] N
No CUDA support will be enabled for TensorFlow
  1. Le paquet pip. Pour le construire, vous devez décrire les instructions que vous souhaitez (vous savez, ces Tensorflow vous ont informés).

Construire le script pip: bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package

Construire le paquet pip: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

Installez le paquet pip Tensorflow que vous venez de créer: Sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

La prochaine fois que vous lancerez Tensorflow, il ne se plaindra plus des instructions manquantes.

6
Eduardo

C'est la méthode la plus simple. Un seul pas.

Cela a un impact significatif sur la vitesse. Dans mon cas, le temps nécessaire pour une étape de formation a presque diminué de moitié.

Référez-vous builds personnalisés de tensorflow

6
Sreeragh A R

J'ai compilé un petit script Bash pour Mac (qui peut facilement être porté sur Linux) pour récupérer toutes les fonctionnalités du processeur et en appliquer certaines pour construire TF. Im sur TF maître et utilise un peu souvent (quelques fois par mois).

https://Gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f

4
Alex Nikiforov

Pour compiler TensorFlow avec SSE4.2 et AVX, vous pouvez utiliser directement

bazel build --config = mkl --config = "opt" --copt = "- mars = broadwell" --copt = "- O3" // tensorflow/tools/pip_package: build_pip_package

Source: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl

3
supercheval

Lors de la création de TensorFlow à partir du source, vous exécuterez le script configure. L'une des questions posées par le script configure est la suivante:

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]

Le script configure va associer les indicateurs que vous spécifiez à la commande bazel qui crée le package de pip TensorFlow. De manière générale, vous pouvez répondre à cette invite de deux manières:

  • Si vous construisez TensorFlow sur le même type de processeur que celui sur lequel vous exécuterez TensorFlow, vous devez accepter la valeur par défaut (-march=native). Cette option optimise le code généré pour le type de processeur de votre ordinateur.
  • Si vous construisez TensorFlow sur un type de processeur mais que vous l'exécutez sur un type de processeur différent, envisagez de fournir un indicateur d'optimisation plus spécifique, comme décrit dans the gcc Documentation .

Après avoir configuré TensorFlow comme décrit dans la liste à puces précédente, vous devriez pouvoir créer TensorFlow entièrement optimisé pour le processeur cible en ajoutant simplement l'indicateur --config=opt à toute commande bazel que vous exécutez.

2
Barry Rosenberg

Pour masquer ces avertissements, vous pouvez le faire avant votre code actuel.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
0
javac