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
.)
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_sources5 votes
J'ai quelques binaires compilés pour TF supportant ces instructions. github.com/lakshayg/tensorflow-build . Vous pourriez trouver cela utile.
1 votes
@IvanKush après avoir ajouté ce drapeau, je suis toujours incapable d'importer avec succès tensorflow (compile bien). Si vous avez réussi à compiler avec gcc 5, veuillez voir : stackoverflow.com/questions/45877158/
1 votes
Si vous utilisez Ubuntu 16.04, nous avons construit presque toutes les variantes dont vous pourriez avoir besoin à l'adresse suivante github.com/mind/wheels
0 votes
Vous pouvez vous référer à ce tutoriel medium.com/@exMachina9/
0 votes
Je voudrais signaler à tous ceux qui compilent avec Microsoft Visual C++ (msvc), que la plupart des réponses ici supposent que vous utilisez
gcc
ouclang
. Les options du compilateur dans ces réponses ne feront rien dans msvc. En tant que personne qui n'a compilé qu'une poignée de choses, ce n'était pas évident pour moi.