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

289

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,

  1. Que sont SSE4.2 et AVX?
  2. Comment ces SSE4.2 et AVX améliorent-ils les calculs CPU pour les tâches Tensorflow?
  3. Comment faire compiler Tensorflow en utilisant les deux bibliothèques?
GabrielChu
la source
18
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 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)
Yaroslav Bulatov
4
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
Ivan Kush
4
J'ai quelques binaires compilés pour TF prenant en charge ces instructions github.com/lakshayg/tensorflow-build . Vous pourriez trouver cela utile.
Lakshay Garg
1
@IvanKush ayant ajouté cet indicateur, je ne parviens toujours pas à importer avec succès tensorflow (compilation correcte). Si vous avez compilé avec succès avec gcc 5, veuillez consulter: stackoverflow.com/questions/45877158/…
anon01
1
Si vous utilisez Ubuntu 16.04, nous avons des versions pour presque toutes les variantes dont vous aurez probablement besoin sur github.com/mind/wheels
danqing

Réponses:

160

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.2suffirait. 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 aucun avertissement ni 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 manger-march=native , peut-être parce qu'ils contiennent un= .)

-mfpmath=bothne fonctionne qu'avec gcc, pas clang. -mfpmath=sseest 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 -O2ou -O3est. gcc -O3permet une optimisation complète, y compris la vectorisation automatique, mais cela peut parfois ralentir le code.


Ce que cela fait: --coptforbazel 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=nativeactive toutes les options prises en charge par votre processeur, ce qui le rend -mavx512f -mavx2 -mavx -mfma -msse4.2redondant. (Aussi, -mavx2permet déjà -mavxet -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 -mfmarendrait un binaire défectueux avec des instructions illégales.

Par ./configuredéfaut , TensorFlow est activé-march=native , donc son utilisation devrait éviter d'avoir à spécifier manuellement les options du compilateur.

-march=nativeactive -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 -xHOSTplace de -march=native.)

Mike Chiu
la source
6
Cela fonctionne en effet> +1! Il ne -march=nativefait 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.
Marc
4
Après avoir désinstallé et réinstallé la nouvelle version compilée, je reçois toujours des avertissements pour AVX, AVX2 et FMA.
Benedikt S. Vogler
5
J'ai dû abandonner --copt=-mfpmath=bothpour le faire fonctionner clangsur macOS. Affecte-t-il le binaire résultant?
gc5
2
Juste pour clarification: quand je crée le fichier de configuration .... est-ce que j'utilise simplement --copt = -march = native? Ou est-ce que je mets toutes ces optimisations vues dans les articles originaux où j'ai la possibilité de mettre les optimisations?
Thornhale
1
J'obtiens une erreur indiquant que la commande 'build' n'est prise en charge que depuis l'espace de travail? Que faire?
humble
133

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 .

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

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

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

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

Salvador Dali
la source
4
Que signifie cette ligne de commande? Et dois-je installer bazeldans ce cas?
YZ
1
Quelqu'un a-t-il déjà construit sous des fenêtres 64 bits avec MSYS2 ou Visual Studio 2017 ommunity Edition? et peut partager les étapes?
James Chang
1
Ce package pip peut-il être installé dans un environnement conda sur la machine locale?
dgketchum
3
Après 3+ heures (temps écoulé: 11984.258s) j'ai eu FAILED: Build did NOT complete successfully. Ce n'est pas si simple de le compiler soi-même.
imbrizi
pareil ici. Ma génération a également échoué, puis dans les journaux, je peux voir que: cl: avertissement de ligne de commande D9002: ignorer l'option inconnue '-mavx' cl: avertissement de ligne de commande D9002: ignorer l'option inconnue '-mavx2' cl: avertissement de ligne de commande D9002: ignorer option inconnue '-mfma' cl: avertissement de ligne de commande D9002: ignorer l'option inconnue '-mfpmath = both' cl: avertissement de ligne de commande D9002: ignorer l'option inconnue '-msse4.2' cl: avertissement de ligne de commande D9002: ignorer l'option inconnue '- fno-strict-aliasing 'cl: avertissement de ligne de commande D9002: ignorer l'option inconnue' -fexceptions 'afin que ces options ne soient pas connues
Shilan
53

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.

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 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.

Thornhale
la source
où le fichier .whl est-il stocké car je veux également l'installer sur Windows?
WiLL_K
Il est stocké ici: / tmp / tensorflow_pkg (sur votre lecteur linux)
Thornhale
Pouvez-vous me dire combien de temps cela prendra? Il est environ 2 heures et mon ordinateur portable a gelé. Son ububtu en cours d'exécution avec 4 Go de RAM et un processeur i5
WiLL_K
Hmm, la compilation de tensorflow prend beaucoup de temps. Sur mon ordinateur portable avec 8 Go, cela a pris environ 1,5 heure. Cependant, vos temps d'installation peuvent varier et seront fortement influencés par le vérin disponible. Ces compilations sont connues pour prendre beaucoup de RAM. Pour réduire les besoins en ressources et peut-être éviter les blocages, vous pouvez exécuter la compilation en ajoutant l'indicateur suivant après "bazel build": --local_resources 2048, .5,1.0 Cela aide souvent avec les blocages mais doublera probablement le temps de compilation. Par exemple: sur l'un de mes systèmes les plus rapides, la compilation sans l'indicateur a pris 2200 secondes, avec l'indicateur 4500!
Thornhale
1
En général, j'ai trouvé que faire du ML sur les fenêtres était une grosse douleur à l'arrière. Vous finissez par passer beaucoup de temps à essayer de faire fonctionner les choses qui fonctionnent si vous travaillez dans un environnement Linux. Je pense que tensorflow doit être compilé pour chaque système d'exploitation. De plus, si vous allez ici: lien , vous verrez que tensorflow n'est pas officiellement supporté. Il existe un guide sur la façon de compiler tensorflow pour Windows ici: lien . Même si je dois l'admettre, je n'ai pas essayé cela. J'utilise juste ubuntu.
Thornhale
25

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 :

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

Josh Bleecher Snyder
la source
Pourquoi le binaire Tensorflow n'utilise-t-il pas la répartition du processeur? Est-ce mal soutenu par GCC?
Chris Pushbullet
4
Le lien "documents d'installation tensorflow" ne fonctionne pas. Je me demande donc si cette réponse est toujours valable. Répond s'il te plait!
Thornhale
@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 binaire. Je suppose que c'est la même chose pour le CPU.
Davidmh
22

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.

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

  2. 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:

-mavx -mavx2 -mfma -msse4.2

(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

JARS
la source
4
-march=nativedevrait être encore meilleur si votre compilateur le prend correctement en charge. Il permet également -mtune=nativede faire de bons choix d'instructions pour votre CPU. Par exemple, sur Haswell et versions ultérieures, il désactive -mavx256-split-unaligned-storeet -mavx256-split-unaligned-load, qui sont activés par défaut pour -mtune=genericet nuisent aux performances lorsque les données ne sont pas connues pour être alignées mais se trouvent au moment de l'exécution.
Peter Cordes
1
Merci! Dans mon cas, -march=nativeune 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.
JARS
1
Quelle erreur? À moins que le système de construction ne s'étouffe sur une chaîne avec un =, ou que vous n'utilisez pas gccou clang, 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, -mavx2implique -mavxet -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.
Peter Cordes
1
J'ai édité la réponse principale à cette question il y a un moment, mais je n'utilise pas moi-même tensorflow. S'il y a quelque chose qui ne va pas avec -march=nativeson système de construction, j'aimerais savoir. (Et / ou vous devez le signaler en amont afin qu'ils puissent corriger leurs scripts de construction).
Peter Cordes
1
Merci beaucoup pour la suggestion. Afin de vérifier cela, j'ai réexécuté le script .configure avec seulement -march=nativeet 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)
JARS
7

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.

  1. Installer Bazel

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

  1. Installer Tensorflow

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:

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é que vous manquiez).

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.

Eduardo
la source
4
Construire avec juste -c opt --copt=-march=nativedevrait ê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=nativepourraient 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=-mfmaimplique 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.
Peter Cordes
1
@PeterCordes, jetez un œil à ce problème ( github.com/tensorflow/tensorflow/issues/7449 ), même les responsables du bazel n'ont pas affirmé pourquoi march = native n'a pas fonctionné comme prévu. Comme vous semblez comprendre les options de gcc, vous pouvez probablement les aider à le corriger, car ils ont marqué le problème comme nécessitant un «support communautaire».
Eduardo
Merci, je vais y jeter un œil ... Hmm, certaines personnes disent que ça --copt=-mavx2n'a pas marché. Si cela --copt=-mfma fonctionne, --copt=-march=nativedevrait 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=nativeau compilateur. Faire que cela se produise via des scripts de construction devient l'astuce.
Peter Cordes
7

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

Sreeragh AR
la source
2
Constructions
Chris Moschini
@SreeraghAR Votre méthode a déclassé mon tensorflow et mes keras.
KPMG
Veuillez vous assurer d'installer le fichier correct en fonction de votre TensorFlow, versions Python et matériel.
Sreeragh AR
La TensFlowversion @SreeraghAR est 1.10.0 et utilise MacOS Sierra. Aidez-moi à trouver le fichier.
KPMG
Hmm .. Impossible de trouver celui correspondant à vos versions. Quelqu'un doit construire une roue personnalisée. github.com/yaroslavvb/tensorflow-community-wheels Une solution immédiate pourrait utiliser Tensorflow 1.9.0
Sreeragh AR
5

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

Alex Nikiforov
la source
5

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

bazel build --config = mkl --config = "opt" --copt = "- march = 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

supercheval
la source
1
Quelque chose a-t-il changé récemment? La dernière fois que j'ai vérifié, --copt="-march=native"c'était manger le =. (Et BTW, ces guillemets doubles ne font rien; ils seront supprimés par le shell avant de bazelvoir votre ligne de commande.)
Peter Cordes
4

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 :

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow

#The repo defaults to the master development branch. You can also checkout a release branch to build:
git checkout r2.0

#Configure the Build => Use the Below line for Windows Machine
python ./configure.py 

#Configure the Build => Use the Below line for Linux/MacOS Machine
./configure
#This script prompts you for the location of TensorFlow dependencies and asks for additional build configuration options. 

#Build Tensorflow package

#CPU support
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package 

#GPU support
bazel build --config=opt --config=cuda --define=no_tensorflow_py_deps=true //tensorflow/tools/pip_package:build_pip_package
Prise en charge de Tensorflow
la source
2
Quelle partie de cela spécifie -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)
Peter Cordes
pour le support CPU avec tf version 2.1.0, l'option --config = opt ne fonctionnait pas pour moi, je l'ai résolu avec --config = v2. Il est également bon de mentionner que la bonne version de bazel pour le construire est 29.0.
Tolik
2

Lors de la création de TensorFlow à partir de la source, vous exécuterez le configurescript. L'une des questions que le configurescript pose est la suivante:

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

Le configurescript 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:

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

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=optindicateur à n'importe quelle commande bazel que vous exécutez.

Barry Rosenberg
la source
-1

Pour masquer 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
javac
la source
5
Un fonctionnement silencieux plus lent qu'il ne le pourrait sur votre matériel semble être une mauvaise idée.
Peter Cordes
Je suis d'accord avec @Peter Cordes en général - mais parfois c'est agréable (de manière disciplinée et consciente) de cacher les avertissements et de se concentrer sur la tâche.
westsider
2
@westsider: oui, cela pourrait être utile dans certains cas, mais ce n'est pas une bonne réponse à moins qu'il ne souligne les implications: il y a de réelles performances perdues si vous masquez simplement les avertissements au lieu de recompiler. (Sauf peut-être que si vous utilisez un GPU pour le gros du travail, il pourrait quand même vous avertir des options de processeur?)
Peter Cordes