Comment compiler Tensorflow avec SSE4.2 et les instructions AVX?
c'est le message reçu depuis 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) Qu'est-ce que SSE4.2 et AVX?
2) Comment font ces SSE4.2 et AVX améliorent les calculs CPU pour les tâches Tensorflow.
3) Comment compiler Tensorflow en utilisant les deux bibliothèques?
11 réponses
je viens de rencontrer ce même problème, il semble que la suggestion de Yaroslav Bulatov ne couvre pas SSE4.2 support, ajouter --copt=-msse4.2
suffirait. En fin de compte, j'ai construit avec succès 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 aucun avertissement ni erreur.
Probablement le meilleur choix pour n'importe quel système est:
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 peut être de manger -march=native
, peut-être parce qu'il contient un =
.)
-mfpmath=both
fonctionne uniquement avec gcc, pas clang. -mfpmath=sse
est probablement aussi bon, sinon meilleur, et est la valeur par défaut pour x86-64. 32-bit construit par défaut à -mfpmath=387
, donc changer qui aidera pour 32-bit. (Mais si vous voulez une haute performance pour le nombre crunching, vous devriez construire des binaires 64 bits.)
Je ne sais pas quelle est la valeur par défaut de TensorFlow pour -O2
ou -O3
être. gcc -O3
permet une optimisation complète, y compris l'auto-vectorisation, mais qui peut parfois rendre le code plus lent.
ce Que cela fait: --copt
pour bazel build
passe une option directement à gcc pour compiler les fichiers C et C++ (mais pas la liaison, alors vous avez besoin d'une option différente pour la croix-lien de fichier-temps-optimisation)
x86-64 gcc par défaut à l'aide seulement SSE2 ou plus anciennes instructions SIMD, ainsi, vous pouvez exécuter les binaires sur le système n'importe quel 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 profit 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
permet toutes les options que votre CPU Supporte, donc il rend -mavx512f -mavx2 -mavx -mfma -msse4.2
redondant. (Également, -mavx2
permet déjà -mavx
et -msse4.2
, donc le commandement de Yaroslav aurait dû être bon). En outre, si vous utilisez un CPU qui ne supporte pas l'une de ces options (comme FMA), utiliser -mfma
ferait un binaire qui se trompe avec des instructions illégales.
Tensorflow's ./configure
par défaut pour activer -march=native
, donc en utilisant cela devrait éviter d'avoir besoin de spécifier des options de compilateur manuellement.
-march=native
active -mtune=native
, donc il optimise pour votre CPU pour des choses comme quelle séquence D'instructions AVX est la meilleure pour des charges non alignées.
ceci s'applique à gcc, clang, ou ICC. (Pour ICC, vous pouvez utiliser -xHOST
au lieu de -march=native
.)
commençons par l'explication de pourquoi voyez-vous ces avertissements en premier lieu .
très probablement, vous n'avez pas installé TF à partir de la source et au lieu de cela 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, pas être utilisé parce que le binaire n'a pas été compilé avec elle. Voici la partie de documentation .
TensorFlow vérifie au démarrage s'il a été compilé avec optimisations disponibles sur le CPU. Si les optimisations ne sont pas inclus, TensorFlow émet des avertissements, par exemple, AVX, AVX2 et FMA instructions non incluses.
la bonne chose est que très probablement vous voulez juste pour apprendre/expérimenter avec TF afin que tout fonctionne correctement et vous ne devriez pas vous inquiéter à ce sujet
Qu'est-ce que SSE4?2 et AVX?
Wikipedia a une bonne explication sur SSE4.2 et AVX . Cette connaissance n'est pas nécessaire d'être bon à l'apprentissage automatique. Vous pouvez les considérer comme un ensemble d'instructions supplémentaires 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'ajout de deux tableaux).
les deux SSE et AVX sont la mise en œuvre 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. Il décrit ordinateurs avec plusieurs éléments de traitement pour effectuer la même fonctionnement simultané sur plusieurs points de données. Ainsi, de telles machines exploiter le parallélisme au niveau des données, mais pas la simultanéité: il existe des calculs simultanés (parallèles), mais un seul processus (instruction) à un moment donné
cela suffit pour répondre à votre question suivante.
comment font ces SSE4?2 et AVX améliorer les calculs CPU pour les tâches TF
ils permettent un calcul plus efficace de diverses opérations vectorielles (matrice/tenseur). Vous pouvez lire plus dans ces diapositives
Comment faire pour compiler Tensorflow en utilisant les deux bibliothèques?
Vous devez avoir un binaire compilé pour profiter de ces instructions. La manière la plus simple est de compiler vous-même . Comme Mike et Yaroslav 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
laissez-moi répondre à votre troisième question en premier:
si vous voulez exécuter une version auto-compilée dans un conda-env, vous pouvez. Ce sont les instructions générales que j'exécute pour obtenir tensorflow à installer sur mon système avec des instructions supplémentaires. Note: Cette compilation était pour une compilation AMD A10-7850 (vérifiez votre CPU pour quelles instructions sont supportées...cela peut différer) en cours D'exécution Ubuntu 16.04 LTS. J'utilise Python 3.5 dans mon conda-env. Le crédit va à la TensorFlow source installer page et les 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 de 560 à 600 secondes ne prennent plus que 300 secondes! Bien que les nombres exacts varient, je pense que vous pouvez vous attendre à une augmentation de vitesse d'environ 35-50% en général sur votre installation particulière.
enfin votre premiè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 d'ensembles d'instructions étendues sur x86 CPUs. Beaucoup contiennent des instructions optimisées pour le traitement des opérations matricielles ou vectorielles.
je vais mettre en évidence ma propre idée fausse pour, Je l'espère, vous faire gagner du temps: Ce n'est pas ce SSE4.2 est une nouvelle version des instructions qui remplace SSE4.1. SSE4 = SSE4.1 (un ensemble de 47 instructions) + SSE4.2 (Un ensemble de 7 instructions).
dans le contexte de la compilation tensorflow, si votre ordinateur prend en charge AVX2 et AVX, et SSE4.1 et SSE4.2, vous devriez mettre ces options d'optimisation pour tous. Ne fais pas comme moi et va avec SSE4.2 penser qu'il est plus récent et devrait superseed SSE4.1. C'est clairement faux! J'ai dû recompiler à cause de ce qui m'a coûté 40 bonnes minutes.
ce sont SIMD vectorial processing instruction sets .
L'utilisation d'instructions vectorielles est plus rapide pour de nombreuses tâches; l'apprentissage automatique est une telle tâche.
, Citant le tensorflow documents d'installation :
pour être compatible avec une gamme de machines aussi large que possible, TensorFlow n'utilise que SSE4.1 instructions SIMD sur x86 machine. La plupart des PC et Mac modernes prennent en charge des instructions plus avancées, donc si vous construisez un binaire que vous ne ferez tourner que sur votre propre machine, vous pouvez les activer en utilisant
--copt=-march=native
dans votre commande de construction bazel.
Merci pour toutes ces réponses + quelques essais et erreurs, j'ai réussi à l'installer sur un Mac avec clang
. Donc je partage juste ma solution au cas où elle serait utile à quelqu'un.
-
suivez les instructions sur Documentation-Installation TensorFlow à partir des Sources
-
quand on demande
veuillez préciser les indicateurs d'optimisation à utiliser lors de la compilation lorsque l'option bazel " --config=opt "est spécifiée [Default is-march=native]
puis copier-coller cette chaîne de caractères:
-mavx -mavx2 -mfma -msse4.2
(l'option par défaut a causé des erreurs, de même que certains autres drapeaux. Je n'ai aucune erreur avec les drapeaux ci-dessus. BTW j'ai répondu n
pour toutes les autres questions)
après l'installation, je vérifie une accélération de ~2x à 2,5 x lors de l'entraînement de modèles profonds en ce qui concerne une autre installation basée sur les roues par défaut - installation TensorFlow sur macOS
j'Espère que ça aide
Je l'ai récemment installé à partir de la source et ci-dessous sont toutes les étapes nécessaires pour l'installer à partir de la source avec les instructions mentionnées disponibles.
D'autres réponses expliquent déjà pourquoi ces messages sont affichés. Ma réponse donne une étape-par-étape sur la façon de isnstall, qui peut aider les gens se pavaner sur l'installation réelle comme je l'ai fait.
- Installer Avec Les Sections De Bazel
télécharger à partir de l'un de leurs disponible releases , par exemple 0.5.2 .
Extrait, vous allez dans le répertoire et le configurer: bash ./compile.sh
.
Copiez l'exécutable vers /usr/local/bin
: sudo cp ./output/bazel /usr/local/bin
- Installer Tensorflow
clone tensorflow: git clone https://github.com/tensorflow/tensorflow.git
Allez dans le répertoire cloné pour le configurer: ./configure
Il vous invite avec plusieurs questions, le soufflet, j'ai suggéré la réponse à chacune des questions, vous pouvez, bien sûr, choisir vos propres réponses sur que vous préférez:
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
- Le pip paquet. Pour le construire, vous devez décrire les instructions que vous voulez (vous savez, ces Tensorflow informé que vous êtes absent).
Construire pip script: 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 pip paquet: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
installer le paquet Tensorflow pip vous venez de construire: sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl
maintenant la prochaine fois que vous démarrez Tensorflow il ne se plaindra plus des instructions manquantes.
C'est la méthode la plus simple. Une seule étape.
il a un impact significatif sur la vitesse. Dans mon cas, le temps consacré à une étape de formation a presque diminué de moitié.
j'ai compilé un petit script Bash pour Mac (qui peut facilement être porté sur Linux) pour récupérer toutes les fonctionnalités CPU et en appliquer certaines pour construire TF. Im sur TF master et utiliser assez souvent (quelques fois dans un mois).
https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f
en construisant TensorFlow à partir de la source, vous exécuterez le script configure
. L'une des questions posées par le scénario 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
attachera le(s) drapeau (s) que vous spécifiez à la commande bazel qui construit le paquet TensorFlow pip. D'une manière générale, vous pouvez répondre à cette question de deux façons:
- si vous construisez TensorFlow sur le même type de CPU que celui sur lequel vous lancerez TensorFlow, alors vous devriez accepter la valeur par défaut (
-march=native
). Cette option optimisera le code généré pour le type CPU de votre machine. - si vous construisez TensorFlow sur un type CPU mais que vous exécutez TensorFlow sur un type CPU différent, alors envisagez de fournir un drapeau d'optimisation plus spécifique comme décrit dans le gcc documentation .
après avoir configuré TensorFlow comme décrit dans la liste à puces précédente, vous devriez être en mesure de construire TensorFlow entièrement optimisé pour le CPU cible juste en ajoutant le drapeau --config=opt
à n'importe quelle commande de bazel que vous exécutez.
pour compiler TensorFlow avec SSE4.2 et AVX, vous pouvez utiliser directement
avec les sections de bazel build --config=mkl -- config= " opt" -- copt= " - march = broadwell" -- copt= " -O3" //tensorflow/outils/pip_package:build_pip_package
pour cacher ces avertissements, vous pouvez le faire avant votre code réel.
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf