Avec la dernière version de Tensor Flow maintenant sur Windows, j'essaie de faire en sorte que tout fonctionne le plus efficacement possible. Cependant, même lors de la compilation à partir des sources, je n'arrive toujours pas à comprendre comment activer les instructions SSE et AVX.
Le processus par défaut: https://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/contrib/cmake Ne sait pas comment procéder.
La seule référence que j'ai trouvée utilise Google Bazel: Comment compiler Tensorflow avec les instructions SSE4.2 et AVX?
Est-ce que quelqu'un connaît un moyen simple d'activer ces instructions avancées à l'aide de MSBuild? J'entends qu'ils donnent au moins une vitesse 3X.
Pour aider ceux qui recherchent une solution similaire, voici l'avertissement que je reçois actuellement. Il ressemble à ceci: https://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/contrib/cmake
J'utilise Windows 10 Professionnel sur une plate-forme 64 bits, Visual Studio 2015 Community Edition, Anaconda Python 3.6 avec cmake version 3.6.3 (les versions ultérieures ne fonctionnent pas pour Tensor Flow).
Toute aide appréciée!
Eh bien, j'ai essayé de résoudre ce problème, mais je ne sais pas si cela a vraiment fonctionné.
Dans CMakeLists.txt
, vous trouverez les déclarations suivantes:
if (tensorflow_OPTIMIZE_FOR_NATIVE_Arch)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_Arch_NATIVE_SUPPORTED)
Sur la plate-forme MSVC, le test échoue car MSVC ne prend pas en charge l'indicateur -march=native
. J'ai modifié les déclarations comme ci-dessous:
if (tensorflow_OPTIMIZE_FOR_NATIVE_Arch)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_Arch_NATIVE_SUPPORTED)
if (COMPILER_OPT_Arch_NATIVE_SUPPORTED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
else()
CHECK_CXX_COMPILER_FLAG("/Arch:AVX" COMPILER_OPT_Arch_AVX_SUPPORTED)
if(COMPILER_OPT_Arch_AVX_SUPPORTED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Arch:AVX")
endif()
endif()
endif()
Ce faisant, cmake vérifiera si /Arch:AVX
est disponible et l’utilisera. Selon le type MSDN et MSDN , la prise en charge de SSE2 est activée par défaut pour la compilation x86 mais n'est pas disponible pour la compilation x64. Pour la compilation x64, vous pouvez choisir d’utiliser AVX ou AVX2. J'ai utilisé AVX ci-dessus car mon processeur ne prend en charge que AVX. Vous pouvez essayer AVX2 si vous avez un processeur compatible.
En compilant le CMakeLists.txt
ci-dessus, la procédure de compilation était beaucoup plus lente que la version officielle et l'avertissement concernant «AVX/AVX2» disparaissait, mais il existait toujours un avertissement concernant SSE/SSE2/3/4.1/4.2. Je pense que ces avertissements peuvent être ignorés car il n'y a pas de support SSE pour x64 MSBuild.
Je teste le nouveau paquet pip maintenant. C'est peut-être plus rapide qu'avant, mais je ne veux pas écrire de nouveau point de repère ...
Si vous êtes intéressé, veuillez vérifier si le nouveau package est vraiment plus rapide.
J'ai fait tout cela sur la dernière branche de git master, le 03/03/2017. Le nom du paquet pip indique qu'il s'agissait de tensorflow 1.0.1
Je pense que vous devriez ajouter /Arch:avx2
aux drapeaux du compilateur . Une façon de le faire est de modifier votre CMakeCache.txt
dans votre dossier de construction. Rechercher une ligne CMAKE_CXX_FLAGS:STRING
et la modifier en
CMAKE_CXX_FLAGS:STRING=/DWIN32 /D_WINDOWS /W3 /GR /EHsc /Arch:AVX2 /fp:fast
Cependant, selon ce problème sur github. /Arch:avx2
est cassé pour le moment (à HEAD).
Tensorflow commet une erreur sur l'indicateur "tensorflow_WIN_CPU_SIMD_OPTIONS".
C'est un drapeau, pas un booléen.
"Tensorflow-github/tensorflow/contrib/cmake/CMakeLists.txt", ligne 34, il y a:
option(tensorflow_WIN_CPU_SIMD_OPTIONS "Enables CPU SIMD instructions")
Le remplacer par
set(tensorflow_WIN_CPU_SIMD_OPTIONS "/Arch:AVX" CACHE STRING "Enables CPU SIMD instructions" )
Ensuite, effacez le cache cmake ( location ) et reconfigurez.
Vous trouverez que tensorflow_WIN_CPU_SIMD_OPTIONS est un indicateur avec zone de saisie au lieu d'une case à cocher.
"/ Arch: AVX" ou "/ Arch: AVX2" est disponible