Voici 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,
- Que sont SSE4.2 et AVX?
- Comment ces SSE4.2 et AVX améliorent-ils les calculs CPU pour les tâches Tensorflow?
- Comment faire compiler Tensorflow en utilisant les deux bibliothèques?
tensorflow
x86
compiler-optimization
simd
compiler-options
GabrielChu
la source
la source
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
sur Xeon E5 v3 qui me donne une amélioration de 3 fois la vitesse du processeur matmul 8k par rapport à la version officielle (0,35 -> 1,05 T ops / sec)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_sourcesRéponses:
Je viens de rencontrer ce même problème, il semble que la suggestion de Yaroslav Bulatov ne couvre pas le support SSE4.2, l'ajout
--copt=-msse4.2
suffirait. Au final, j'ai réussi à construire avecsans aucun avertissement ni erreur.
Le meilleur choix pour tout système est probablement:
( Mise à jour: les scripts de construction peuvent manger
-march=native
, peut-être parce qu'ils contiennent un=
.)-mfpmath=both
ne fonctionne qu'avec gcc, pas clang.-mfpmath=sse
est probablement aussi bonne, sinon meilleure, et est la valeur par défaut pour x86-64. Les versions 32 bits ont la valeur par défaut-mfpmath=387
, donc changer cela aidera pour 32 bits. (Mais si vous voulez des performances élevées pour le calcul des nombres, vous devez créer des binaires 64 bits.)Je ne suis pas sûr de ce que le défaut de tensorflow pour
-O2
ou-O3
est.gcc -O3
permet une optimisation complète, y compris la vectorisation automatique, mais cela peut parfois ralentir le code.Ce que cela fait:
--copt
forbazel build
transmet une option directement à gcc pour la compilation de fichiers C et C ++ (mais pas de liaison, vous avez donc besoin d'une option différente pour l'optimisation de la durée de liaison entre les fichiers)x86-64 gcc utilise par défaut uniquement des instructions SSE2 ou SIMD plus anciennes, vous pouvez donc exécuter les binaires sur n'importe quel système x86-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 sur lequel vous l'avez construit.
-march=native
active toutes les options prises en charge par votre processeur, ce qui le rend-mavx512f -mavx2 -mavx -mfma -msse4.2
redondant. (Aussi,-mavx2
permet déjà-mavx
et-msse4.2
, donc le commandement de Yaroslav aurait dû être bien). De plus, si vous utilisez un processeur qui ne prend pas en charge l'une de ces options (comme FMA), l'utilisation-mfma
rendrait un binaire défectueux avec des instructions illégales.Par
./configure
défaut , TensorFlow est activé-march=native
, donc son utilisation devrait éviter d'avoir à spécifier manuellement les options du compilateur.-march=native
active-mtune=native
, de sorte qu'il optimise votre processeur pour des choses comme 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 à la
-xHOST
place de-march=native
.)la source
-march=native
fait donc pas son boulot. De plus, la suppression du--config=cuda
(si le support CUDA n'est pas nécessaire) et du-k
(car aucune erreur ne s'est produite pendant la compilation) fonctionne également.--copt=-mfpmath=both
pour le faire fonctionnerclang
sur macOS. Affecte-t-il le binaire résultant?Commençons par expliquer pourquoi voyez-vous ces avertissements en premier lieu .
Vous n'avez probablement pas installé TF depuis la source et au lieu de cela, vous avez 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 la documentation .La bonne chose est que très probablement vous voulez juste apprendre / expérimenter avec TF donc tout fonctionnera correctement et vous ne devriez pas vous en soucier
Que sont SSE4.2 et AVX?
Wikipedia a une bonne explication sur SSE4.2 et AVX . Cette connaissance n'est pas requise pour être bon en apprentissage automatique. Vous pouvez les considérer comme un ensemble d' instructions supplémentaires permettant à un ordinateur d'utiliser plusieurs points de données par rapport à une seule instruction pour effectuer des opérations qui peuvent être naturellement parallélisées (par exemple, en ajoutant 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
C'est suffisant pour répondre à votre prochaine question.
Comment ces SSE4.2 et AVX améliorent-ils les calculs CPU pour les tâches TF
Ils permettent un calcul plus efficace de diverses opérations vectorielles (matrice / tensor). Vous pouvez en lire plus dans ces diapositives
Comment faire compiler Tensorflow en utilisant les deux bibliothèques?
Vous devez avoir un binaire qui a été compilé pour tirer parti de ces instructions. Le moyen le plus simple est de 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
la source
bazel
dans ce cas?FAILED: Build did NOT complete successfully
. Ce n'est pas si simple de le compiler soi-même.Permettez-moi de répondre d'abord à votre troisième question:
Si vous souhaitez exécuter une version auto-compilée dans un conda-env, vous le pouvez. Ce sont les instructions générales que j'exécute pour que tensorflow s'installe sur mon système avec des instructions supplémentaires. Remarque: Cette version était pour une version AMD A10-7850 (vérifiez votre CPU pour quelles instructions sont prises en charge ... cela peut différer) exécutant Ubuntu 16.04 LTS. J'utilise Python 3.5 dans mon conda-env. Nous remercions la page d'installation de la source tensorflow et les réponses fournies ci-dessus.
Quant à votre 2e question:
Une version auto-compilée avec des optimisations vaut bien l'effort à mon avis. Sur ma configuration particulière, les calculs qui prenaient auparavant 560 à 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:
De nombreuses 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 étendues sur les processeurs X86. 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, espérons-le, vous faire gagner du temps: ce n'est pas que SSE4.2 est une version plus récente des 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 tensorflow, si votre ordinateur prend en charge AVX2 et AVX et 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 qu'il est plus récent et devrait remplacer SSE4.1. C'est clairement faux! J'ai dû recompiler à cause de cela qui m'a coûté 40 bonnes minutes.
la source
Ce sont des jeux d'instructions de traitement vectoriel SIMD .
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 :
la source
Grâce à 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.Suivez les instructions de la documentation - Installation de TensorFlow à partir de sources
Lorsque vous y êtes invité
Veuillez spécifier les indicateurs 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 copiez-collez cette chaîne:
(L'option par défaut a causé des erreurs, tout comme 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, je vérifie une accélération de ~ 2x à 2.5x lors de la formation de modèles profonds par rapport à une autre installation basée sur les roues par défaut - Installation de TensorFlow sur macOS
J'espère que ça aide
la source
-march=native
devrait être encore meilleur si votre compilateur le prend correctement en charge. Il permet également-mtune=native
de faire de bons choix d'instructions pour votre CPU. Par exemple, sur Haswell et versions ultérieures, il désactive-mavx256-split-unaligned-store
et-mavx256-split-unaligned-load
, qui sont activés par défaut pour-mtune=generic
et nuisent aux performances lorsque les données ne sont pas connues pour être alignées mais se trouvent au moment de l'exécution.-march=native
une erreur s'est produite alors que les autres options ne l'ont pas fait. C'est peut-être le compilateur spécifique. Je partageais cela précisément au cas où d'autres rencontreraient le même barrage routier.=
, ou que vous n'utilisez pasgcc
ouclang
, cela devrait fonctionner. Et ça-mtune=native -mavx2 -mfma
marche pour vous? Ou-mtune=skylake
? (Ou quel que soit le processeur dont vous disposez). BTW,-mavx2
implique-mavx
et-msse4.2
. Cela ne fait pas de mal de les inclure tous dans une recette, et je suppose qu'il est plus facile pour les gens de supprimer ceux que leur processeur ne prend pas en charge.-march=native
son système de construction, j'aimerais savoir. (Et / ou vous devez le signaler en amont afin qu'ils puissent corriger leurs scripts de construction).-march=native
et c'est l'erreur: / Users / jose / Documents / code / tmptensorflow / tensorflow / tensorflow / core / BUILD: 1442: 1: compilation C ++ de La règle '// tensorflow / core: lib_internal_impl' a échoué (sortie 1). Dans le fichier inclus depuis tensorflow / core / platform / denormal.cc: 37: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2/include/pmmintrin.h:28:2: erreur: "Jeu d'instructions SSE3 non activé" #error "Jeu d'instructions SSE3 non activé" avec Apple LLVM version 7.0.2 (clang-700.1.81)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 décrivent déjà pourquoi ces messages sont affichés. Ma réponse donne une étape par étape sur la façon d'installer isnstall, ce qui peut aider les gens à se débattre sur l'installation réelle comme je l'ai fait.
Téléchargez-le depuis l'une de leurs versions disponibles , par exemple 0.5.2 . Extrait, allez dans le répertoire et le configurer:
bash ./compile.sh
. Copiez l'exécutable dans/usr/local/bin
:sudo cp ./output/bazel /usr/local/bin
Clone tensorflow:
git clone https://github.com/tensorflow/tensorflow.git
Accédez au répertoire cloné pour le configurer:./configure
Cela vous demandera plusieurs questions, ci-dessous j'ai suggéré la réponse à chacune des questions, vous pouvez, bien sûr, choisir vos propres réponses selon vos préférences:
Créer un 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 package 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.
la source
-c opt --copt=-march=native
devrait être au moins aussi bon que--copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2
. (Les deux réduiront l'avertissement, mais-march=native
pourraient rendre le code encore plus rapide en optimisant spécifiquement le processeur sur le système sur lequel vous construisez). Notez également que cela--copt=-mavx2 --copt=-mfma
implique toutes les options AVX et SSE antérieures, donc cette longue chaîne d'options a été clairement écrite par quelqu'un qui ne comprend pas les options gcc.--copt=-mavx2
n'a pas marché. Si cela--copt=-mfma
fonctionne,--copt=-march=native
devrait fonctionner, sauf si l'analyse de la=
est un problème. Pour gcc / clang / icc, vous voulez définitivement que le script de construction passe finalement-march=native
au compilateur. Faire que cela se produise via des scripts de construction devient l'astuce.C'est la méthode la plus simple. Une seule étape.
Il a un impact significatif sur la vitesse. Dans mon cas, le temps pris pour une étape de formation a presque diminué de moitié.
Référencer des versions personnalisées de tensorflow
la source
TensFlow
version @SreeraghAR est 1.10.0 et utiliseMacOS Sierra
. Aidez-moi à trouver le fichier.J'ai compilé un petit script Bash pour Mac (peut facilement être porté sur Linux) pour récupérer toutes les fonctionnalités du CPU et en appliquer certaines pour construire TF. Im sur TF master et utilisez un peu souvent (quelques fois en un mois).
https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f
la source
Pour compiler TensorFlow avec SSE4.2 et AVX, vous pouvez utiliser directement
Source: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl
la source
--copt="-march=native"
c'était manger le=
. (Et BTW, ces guillemets doubles ne font rien; ils seront supprimés par le shell avant debazel
voir votre ligne de commande.)2.0 SOLUTION COMPATIBLE:
Exécutez les commandes ci-dessous dans Terminal (Linux / MacOS) ou dans l'invite de commandes (Windows) pour installer Tensorflow 2.0 à l'aide de Bazel :
la source
-march=native
, ou d'autres options GCC / clang? Je ne vois aucune mention d'AVX, FMA ou SSE4.2 dans cela. (Et le script de construction de Bazel ou de Tensorflow est-il toujours cassé d'une manière qui ne fonctionne que comme des options-mavx
, non-march=native
? Si c'est vraiment le problème dans la première réponse à cette question)Lors de la création de TensorFlow à partir de la source, vous exécuterez le
configure
script. L'une des questions que leconfigure
script pose est la suivante:Le
configure
script attachera les indicateurs que vous spécifiez à la commande bazel qui crée le package pip TensorFlow. D'une manière générale, vous pouvez répondre à cette invite de deux manières:-march=native
). Cette option optimisera le code généré pour le type de CPU de votre machine.Après avoir configuré TensorFlow comme décrit dans la liste à puces précédente, vous devriez être en mesure de créer TensorFlow entièrement optimisé pour le CPU cible simplement en ajoutant l'
--config=opt
indicateur à n'importe quelle commande bazel que vous exécutez.la source
Pour masquer ces avertissements, vous pouvez le faire avant votre code réel.
la source