Wie kompiliere ich Tensorflow mit SSE4.2- und AVX-Anweisungen?


289

Dies ist die Nachricht, die beim Ausführen eines Skripts empfangen wird, um zu überprüfen, ob Tensorflow funktioniert:

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

Mir ist aufgefallen, dass SSE4.2 und AVX erwähnt wurden.

  1. Was sind SSE4.2 und AVX?
  2. Wie verbessern diese SSE4.2 und AVX die CPU-Berechnungen für Tensorflow-Aufgaben?
  3. Wie kann Tensorflow mithilfe der beiden Bibliotheken kompiliert werden?

18
Ich mag es, mit diesen Flags bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package auf Xeon E5 v3 zu bauen , die mir eine 3-fache Verbesserung der 8k-Matmul-CPU-Geschwindigkeit im Vergleich zur offiziellen Version (0,35 -> 1,05 T ops / s)
bieten

4
und vergessen Sie nicht 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.von hier aus tensorflow.org/install/install_sources
Ivan Kush

4
Ich habe einige kompilierte Binärdateien für TF, die diese Anweisungen unterstützen. Github.com/lakshayg/tensorflow-build . Dies könnte hilfreich sein.
Lakshay Garg

1
@IvanKush Nachdem ich dieses Flag hinzugefügt habe, kann ich Tensorflow immer noch nicht erfolgreich importieren (kompiliert einwandfrei). Wenn Sie erfolgreich mit gcc 5 kompiliert haben, sehen Sie bitte: stackoverflow.com/questions/45877158/…
anon01

1
Wenn Sie Ubuntu 16.04 verwenden, haben wir Builds für fast alle Varianten, die Sie möglicherweise benötigen, unter github.com/mind/wheels
danqing

Antworten:


160

Ich bin gerade auf dasselbe Problem gestoßen. Es scheint, als würde Jaroslaw Bulatows Vorschlag die SSE4.2-Unterstützung nicht abdecken. Das Hinzufügen --copt=-msse4.2würde ausreichen. Am Ende habe ich erfolgreich mit gebaut

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

ohne Warnung oder Fehler zu bekommen.

Die wahrscheinlich beste Wahl für jedes System ist:

bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

( Update: Die Build-Skripte fressen-march=native möglicherweise, möglicherweise weil sie eine enthalten= .)

-mfpmath=bothfunktioniert nur mit gcc, nicht mit clang. -mfpmath=sseist wahrscheinlich genauso gut, wenn nicht sogar besser und ist die Standardeinstellung für x86-64. 32-Bit-Builds sind standardmäßig auf eingestellt. Wenn Sie -mfpmath=387dies ändern, ist dies für 32-Bit hilfreich. (Wenn Sie jedoch eine hohe Leistung für das Knacken von Zahlen wünschen, sollten Sie 64-Bit-Binärdateien erstellen.)

Ich bin mir nicht sicher, wofür TensorFlow standardmäßig ist -O2oder -O3ist. gcc -O3ermöglicht die vollständige Optimierung einschließlich der automatischen Vektorisierung, dies kann jedoch manchmal den Code verlangsamen.


Was dies bewirkt: --coptforbazel build übergibt eine Option direkt an gcc zum Kompilieren von C- und C ++ - Dateien (aber keine Verknüpfung, daher benötigen Sie eine andere Option für die dateiübergreifende Optimierung der Verbindungszeit)

x86-64 gcc verwendet standardmäßig nur SSE2- oder ältere SIMD-Anweisungen, sodass Sie die Binärdateien ausführen können jedem x86-64-System können. (Siehe https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html ). Das willst du nicht. Sie möchten eine Binärdatei erstellen, die alle Anweisungen Ihrer CPU nutzt, da Sie diese Binärdatei nur auf dem System ausführen, auf dem Sie sie erstellt haben.

-march=nativeAktiviert alle Optionen, die Ihre CPU unterstützt, und macht sie so -mavx512f -mavx2 -mavx -mfma -msse4.2überflüssig. (Ebenfalls,-mavx2 aktiviert -mavxund -msse4.2, so sollte Jaroslaw Befehl gut gewesen sein). Auch wenn Sie eine CPU verwenden, die eine dieser Optionen nicht unterstützt (wie FMA), wird durch die Verwendung -mfmaeine Binärdatei erstellt, die fehlerhafte Anweisungen enthält.

TensorFlow's ./configure standardmäßig aktiviert.-march=native dies verwenden, müssen Sie die Compileroptionen nicht manuell angeben.

-march=native ermöglicht -mtune=native , so dass es für Ihre CPU optimiert wird, z. B. welche Sequenz von AVX-Anweisungen für nicht ausgerichtete Lasten am besten geeignet ist.

Dies gilt alles für gcc, clang oder ICC. (Für ICC können Sie -xHOSTanstelle von verwenden -march=native.)


6
Es funktioniert tatsächlich> +1! Es scheint -march=nativealso nicht seine Aufgabe zu sein. Außerdem funktioniert das Löschen des --config=cuda(wenn keine CUDA-Unterstützung benötigt wird) und des -k(da während der Kompilierung kein Fehler aufgetreten ist) ebenfalls.
Marc

4
Nach der Deinstallation und Neuinstallation der neuen kompilierten Version erhalte ich weiterhin Warnungen für AVX, AVX2 und FMA.
Benedikt S. Vogler

5
Ich musste fallen lassen --copt=-mfpmath=both, damit es unter clangmacOS funktioniert . Beeinflusst es die resultierende Binärdatei?
GC5

2
Nur zur Verdeutlichung: Wenn ich die Konfigurationsdatei erstelle ... verwende ich einfach --copt = -march = native? Oder füge ich all die Optimierungen ein, die in den ursprünglichen Beiträgen zu sehen waren, in denen ich die Option habe, die Optimierungen vorzunehmen?
Thornhale

1
Ich erhalte die Fehlermeldung, dass der Befehl 'build' nur vom Arbeitsbereich aus unterstützt wird. Was ist zu tun?
bescheiden

133

Beginnen wir mit der Erklärung, warum diese Warnungen überhaupt angezeigt werden .


Höchstwahrscheinlich haben Sie TF nicht von der Quelle installiert und stattdessen so etwas wie verwendet pip install tensorflow. Das bedeutet, dass Sie vorgefertigte (von einer anderen Person) Binärdateien installiert haben, die nicht für Ihre Architektur optimiert wurden. Und diese Warnungen sagen Ihnen genau Folgendes: In Ihrer Architektur ist etwas verfügbar, das jedoch nicht verwendet wird, da die Binärdatei nicht damit kompiliert wurde. Hier ist der Teil aus der Dokumentation .

TensorFlow prüft beim Start, ob es mit den auf der CPU verfügbaren Optimierungen kompiliert wurde. Wenn die Optimierungen nicht enthalten sind, gibt TensorFlow Warnungen aus, z. B. AVX-, AVX2- und FMA-Anweisungen, die nicht enthalten sind.

Gut ist, dass Sie höchstwahrscheinlich nur mit TF lernen / experimentieren möchten, damit alles richtig funktioniert und Sie sich darüber keine Sorgen machen sollten


Was sind SSE4.2 und AVX?

Wikipedia hat eine gute Erklärung zu SSE4.2 und AVX . Dieses Wissen muss nicht gut im maschinellen Lernen sein. Sie können sie als einen Satz zusätzlicher Anweisungen für einen Computer betrachten, um mehrere Datenpunkte gegen eine einzelne Anweisung zu verwenden, um Operationen auszuführen, die natürlich parallelisiert werden können (z. B. Hinzufügen von zwei Arrays).

Sowohl SSE als auch AVX implementieren eine abstrakte Idee von SIMD (Single Instruction, Multiple Data)

eine Klasse von Parallelcomputern in Flynns Taxonomie. Es werden Computer mit mehreren Verarbeitungselementen beschrieben, die denselben Vorgang an mehreren Datenpunkten gleichzeitig ausführen. Daher nutzen solche Maschinen Parallelität auf Datenebene, jedoch keine Parallelität: Es gibt simultane (parallele) Berechnungen, aber zu einem bestimmten Zeitpunkt nur einen einzigen Prozess (Befehl)

Dies reicht aus, um Ihre nächste Frage zu beantworten.


Wie verbessern diese SSE4.2 und AVX die CPU-Berechnungen für TF-Aufgaben?

Sie ermöglichen eine effizientere Berechnung verschiedener Vektoroperationen (Matrix / Tensor). Sie können mehr in diesen Folien lesen


Wie kann Tensorflow mithilfe der beiden Bibliotheken kompiliert werden?

Sie benötigen eine Binärdatei, die kompiliert wurde, um diese Anweisungen nutzen zu können. Am einfachsten ist es , es selbst zu kompilieren . Wie Mike und Jaroslaw vorgeschlagen haben, können Sie den folgenden Bazel-Befehl verwenden

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


4
Was bedeutet diese Befehlszeile? Und sollte ich bazelin diesem Fall installieren ?
YZ

1
Baut jemand jemals unter Windows 64-Bit mit MSYS2 oder Visual Studio 2017 Community Edition? und kann die Schritte teilen?
James Chang

1
Kann dieses Pip-Paket in einer Conda-Umgebung auf dem lokalen Computer installiert werden?
Dgketchum

3
Nach mehr als 3 Stunden (verstrichene Zeit: 11984.258s) bekam ich FAILED: Build did NOT complete successfully. Es ist nicht so einfach, es selbst zu kompilieren.
Imbrizi

hier gilt das gleiche. Mein Build ist ebenfalls fehlgeschlagen und dann kann ich in den Protokollen Folgendes sehen: cl: Befehlszeilenwarnung D9002: Unbekannte Option '-mavx' ignorieren cl: Befehlszeilenwarnung D9002: Unbekannte Option ignorieren '-mavx2' cl: Befehlszeilenwarnung D9002: Ignorieren unbekannte Option '-mfma' cl: Befehlszeilenwarnung D9002: unbekannte Option ignorieren '-mfpmath = beide' cl: Befehlszeilenwarnung D9002: unbekannte Option ignorieren '-msse4.2' cl: Befehlszeilenwarnung D9002: unbekannte Option ignorieren '- fno-strict-aliasing 'cl: Befehlszeilenwarnung D9002: Ignorieren der unbekannten Option' -fexceptions ', sodass diese Optionen nicht bekannt sind
Shilan

53

Lassen Sie mich zuerst Ihre dritte Frage beantworten:

Wenn Sie eine selbst kompilierte Version in einer conda-env ausführen möchten, können Sie dies tun. Dies sind die allgemeinen Anweisungen, die ich ausführe, damit Tensorflow mit zusätzlichen Anweisungen auf meinem System installiert wird. Hinweis: Dieser Build war für einen AMD A10-7850-Build (überprüfen Sie Ihre CPU, welche Anweisungen unterstützt werden ... er kann abweichen) mit Ubuntu 16.04 LTS. Ich benutze Python 3.5 in meinem conda-env. Die Gutschrift erfolgt auf der Installationsseite der Tensorflow-Quelle und den oben angegebenen Antworten.

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.

Zu Ihrer 2. Frage:

Eine selbst kompilierte Version mit Optimierungen ist meiner Meinung nach die Mühe wert. In meinem speziellen Setup dauern Berechnungen, die früher 560-600 Sekunden dauerten, jetzt nur noch etwa 300 Sekunden! Obwohl die genauen Zahlen variieren, können Sie meiner Meinung nach generell mit einer Geschwindigkeitssteigerung von 35-50% für Ihr spezielles Setup rechnen.

Zuletzt Ihre erste Frage:

Viele der Antworten wurden bereits oben gegeben. Zusammenfassend: AVX , SSE4.1, SSE4.2 , MFA sind verschiedene Arten von erweiterten Befehlssätzen auf X86-CPUs. Viele enthalten optimierte Anweisungen zum Verarbeiten von Matrix- oder Vektoroperationen.

Ich werde mein eigenes Missverständnis hervorheben, um Ihnen hoffentlich etwas Zeit zu sparen: Es ist nicht so, dass SSE4.2 eine neuere Version von Anweisungen ist, die SSE4.1 ersetzen. SSE4 = SSE4.1 (ein Satz von 47 Anweisungen) + SSE4.2 (ein Satz von 7 Anweisungen).

Wenn Ihr Computer im Rahmen der Tensorflow-Kompilierung AVX2 und AVX sowie SSE4.1 und SSE4.2 unterstützt, sollten Sie diese Optimierungsflags für alle einfügen. Tun Sie nicht so wie ich und gehen Sie einfach mit SSE4.2 und denken Sie, dass es neuer ist und SSE4.1 ersetzen sollte. Das ist eindeutig FALSCH! Ich musste neu kompilieren, weil es mich gut 40 Minuten gekostet hat.


Wo wird die .whl-Datei gespeichert, weil ich sie auch unter Windows installieren möchte?
WiLL_K

Es ist hier gespeichert: / tmp / tensorflow_pkg (auf Ihrem Linux-Laufwerk)
Thornhale

Können Sie mir sagen, wie viel Zeit dies dauern wird? Es ist ungefähr 2 Stunden und mein Laptop ist eingefroren. Es läuft Ububtu mit 4 GB RAM und einem i5-Prozessor
WiLL_K

Hmm, das Kompilieren des Tensorflusses dauert lange. Auf meinem Laptop mit 8 GB dauerte es ungefähr 1,5 Stunden. Ihre Installationszeiten können jedoch variieren und werden stark vom verfügbaren RAM beeinflusst. Es ist bekannt, dass diese Kompilierungen viel RAM benötigen. Um den Ressourcenbedarf zu verringern und möglicherweise ein Einfrieren zu verhindern, können Sie die Kompilierung ausführen, indem Sie nach "bazel build" das folgende Flag hinzufügen: --local_resources 2048, .5,1.0 Dies hilft häufig beim Einfrieren, verdoppelt jedoch wahrscheinlich die Kompilierungszeit. Zum Beispiel: Auf einem meiner schnelleren Systeme dauerte das Kompilieren ohne Flag 2200 Sekunden, mit Flag 4500!
Thornhale

1
Im Allgemeinen fand ich, dass ML unter Windows ein großer Schmerz im Hintergrund ist. Am Ende verbringen Sie viel Zeit damit, Dinge zum Laufen zu bringen, die nur funktionieren, wenn Sie in einer Linux-Umgebung arbeiten. Ich glaube, dass Tensorflow für jedes Betriebssystem kompiliert werden muss. Wenn Sie hier klicken : Link , werden Sie außerdem feststellen, dass Tensorflow nicht offiziell unterstützt wird. Hier gibt es eine Anleitung zum Kompilieren von Tensorflow für Windows: Link . Obwohl ich zugeben muss, habe ich das nicht ausprobiert. Ich benutze nur Ubuntu.
Thornhale

25

Dies sind SIMD- Vektorverarbeitungsbefehlssätze .

Die Verwendung von Vektoranweisungen ist für viele Aufgaben schneller. maschinelles Lernen ist eine solche Aufgabe.

Zitieren der Tensorflow-Installationsdokumente :

Um mit möglichst vielen Computern kompatibel zu sein, verwendet TensorFlow standardmäßig nur SSE4.1-SIMD-Anweisungen auf x86-Computern. Die meisten modernen PCs und Macs unterstützen erweiterte Anweisungen. Wenn Sie also eine Binärdatei erstellen, die nur auf Ihrem eigenen Computer ausgeführt wird, können Sie diese mithilfe --copt=-march=nativeIhres Befehls bazel build aktivieren.


Warum verwendet die Tensorflow-Binärdatei kein CPU-Dispatching? Wird das von GCC schlecht unterstützt?
Chris Pushbullet

4
Der Link "Tensorflow-Installationsdokumente" funktioniert nicht. Ich frage mich also, ob diese Antwort noch gültig ist. Bitte antworten!
Thornhale

@ChrisPushbullet Sie können Tensorflow kompilieren, um verschiedene Rechenfunktionen für die GPU zu unterstützen, aber sie erhöhen die Binärgröße erheblich. Ich vermute, dass dies auch für die CPU gilt.
Davidmh

22

Dank all dieser Antworten und einiger Versuche und Fehler konnte ich es auf einem Mac mit installieren clang. Teilen Sie also einfach meine Lösung mit, falls sie für jemanden nützlich ist.

  1. Befolgen Sie die Anweisungen zur Dokumentation - Installieren von TensorFlow aus Quellen

  2. Wenn Sie dazu aufgefordert werden

    Bitte geben Sie Optimierungsflags an, die während der Kompilierung verwendet werden sollen, wenn die Bazel-Option "--config = opt" angegeben ist. [Standard ist -march = native]

Kopieren Sie dann diese Zeichenfolge und fügen Sie sie ein:

-mavx -mavx2 -mfma -msse4.2

(Die Standardoption verursachte Fehler, ebenso einige der anderen Flags. Ich habe keine Fehler mit den obigen Flags erhalten. Übrigens habe ich nauf alle anderen Fragen geantwortet .)

Nach der Installation überprüfe ich eine ~ 2x bis 2,5x Beschleunigung, wenn ich Deep-Modelle in Bezug auf eine andere Installation trainiere, die auf den Standardrädern basiert - Installation von TensorFlow unter macOS

Ich hoffe es hilft


4
-march=nativesollte noch besser sein, wenn Ihr Compiler es richtig unterstützt. Außerdem können Sie -mtune=nativegute Befehlsentscheidungen für Ihre CPU treffen. zB auf Haswell und höher, es sperrt -mavx256-split-unaligned-storeund -mavx256-split-unaligned-load, die standardmäßig sind -mtune=genericund verletzt Leistung , wenn die Daten nicht ausgerichtet werden bekannt , aber stellt sich heraus , zur Laufzeit sein.
Peter Cordes

1
Vielen Dank! In meinem Fall wurde -march=nativeein Fehler verursacht, während die anderen Optionen dies nicht taten. Vielleicht ist es der spezifische Compiler. Ich teilte dies genau für den Fall, dass andere die gleiche Straßensperre erlebten.
JARS

1
Welcher Fehler? Es sei denn , das Build - System auf einer Schnur mit einem Drosseln =drin, oder Sie nicht verwenden gccoder clang, sollte es funktionieren. Und -mtune=native -mavx2 -mfma arbeitet für Sie? Oder -mtune=skylake? (Oder welche CPU auch immer Sie haben). Übrigens -mavx2impliziert -mavxund -msse4.2. Es tut nicht weh , sie alle in ein Rezept aufzunehmen, und ich denke, es macht es den Leuten leichter, diejenigen wegzulassen, die ihre CPU nicht unterstützt.
Peter Cordes

1
Ich habe die Top-Antwort auf diese Frage vor einiger Zeit bearbeitet, verwende aber selbst keinen Tensorflow. Wenn etwas mit -march=nativedem Build-System nicht stimmt , würde ich gerne wissen. (Und / oder Sie sollten es Upstream melden, damit sie ihre Build-Skripte reparieren können).
Peter Cordes

1
Vielen Dank für den Vorschlag. Um dies zu überprüfen, habe ich das Skript .configure nur -march=nativemit erneut ausgeführt. Dies ist der Fehler: / Users / jose / Documents / code / tmptensorflow / tensorflow / tensorflow / core / BUILD: 1442: 1: C ++ - Kompilierung von Regel '// tensorflow / core: lib_internal_impl' fehlgeschlagen (Exit 1). In der Datei aus tensorflow / core / platform / denormal.cc: 37: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2/include/pmmintrin.h:28:2: Fehler: "SSE3-Befehlssatz nicht aktiviert" #Fehler "SSE3-Befehlssatz nicht aktiviert" unter Verwendung von Apple LLVM Version 7.0.2 (clang-700.1.81)
JARS

7

Ich habe es kürzlich von der Quelle installiert und unten sind alle Schritte aufgeführt, die erforderlich sind, um es von der Quelle mit den genannten verfügbaren Anweisungen zu installieren.

Andere Antworten beschreiben bereits, warum diese Nachrichten angezeigt werden. Meine Antwort enthält eine schrittweise Anleitung zur Installation, die möglicherweise dazu beiträgt, dass die Leute wie ich Probleme mit der eigentlichen Installation haben.

  1. Installieren Sie Bazel

Laden Sie es von einer der verfügbaren Versionen herunter , z. B. 0.5.2 . Extrahieren Sie es, gehen Sie in das Verzeichnis und konfigurieren Sie es : bash ./compile.sh. Kopieren Sie die ausführbare Datei nach /usr/local/bin:sudo cp ./output/bazel /usr/local/bin

  1. Installieren Sie Tensorflow

Tensorflow klonen: Wechseln git clone https://github.com/tensorflow/tensorflow.git Sie in das geklonte Verzeichnis, um es zu konfigurieren:./configure

Es werden Sie mit mehreren Fragen aufgefordert. Unten habe ich die Antwort auf jede der Fragen vorgeschlagen. Sie können natürlich Ihre eigenen Antworten auswählen, wie Sie es bevorzugen:

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. Das Pip-Paket. Um es zu erstellen, müssen Sie beschreiben, welche Anweisungen Sie möchten (Sie wissen, diese Tensorflow haben Sie darüber informiert, dass Sie fehlen).

Pip-Skript erstellen: 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

Pip-Paket erstellen: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

Installieren Sie das gerade erstellte Tensorflow-Pip-Paket: sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

Wenn Sie Tensorflow das nächste Mal starten, wird es sich nicht mehr über fehlende Anweisungen beschweren.


4
Bauen mit nur -c opt --copt=-march=nativesollte mindestens so gut sein wie --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2. (Beide werden die Warnung stumm schalten, können jedoch -march=nativeden Code noch schneller machen, indem sie speziell auf die CPU des Systems abgestimmt werden, auf dem Sie aufbauen.) Beachten Sie auch, dass --copt=-mavx2 --copt=-mfmadies alle früheren AVX- und SSE-Optionen impliziert, sodass diese lange Reihe von Optionen eindeutig von jemandem geschrieben wurde, der die gcc-Optionen nicht versteht.
Peter Cordes

1
@PeterCordes, werfen Sie einen Blick auf dieses Problem ( github.com/tensorflow/tensorflow/issues/7449 ), selbst die Bazel-Betreuer waren sich nicht sicher, warum March = Native nicht wie erwartet funktionierte. Wenn Sie anscheinend "gcc-Optionen verstehen", können Sie ihnen wahrscheinlich helfen, das Problem zu beheben, da sie das Problem als "Community-Unterstützung" kennzeichnend markiert haben.
Eduardo

Danke, ich werde einen Blick darauf werfen ... Hmm, einige Leute sagen, dass --copt=-mavx2das nicht funktioniert hat. Wenn es --copt=-mfma funktioniert, --copt=-march=nativesollte es funktionieren, es sei denn, das Parsen des =ist ein Problem. Für gcc / clang / icc möchten Sie auf jeden Fall, dass das Build-Skript schließlich -march=nativean den Compiler übergeben wird. Dies über Build-Skripte zu erreichen, wird zum Trick.
Peter Cordes

7

Dies ist die einfachste Methode. Nur ein Schritt.

Dies hat erhebliche Auswirkungen auf die Geschwindigkeit. In meinem Fall hat sich die Zeit für einen Trainingsschritt fast halbiert.

Verweisen Sie auf benutzerdefinierte Builds von Tensorflow


2
Windows Builds einschließlich AVX2 github.com/fo40225/tensorflow-windows-wheel
Chris Moschini

@SreeraghAR Ihre Methode hat meinen Tensorflow und meine Keras herabgestuft.
KPMG

Bitte stellen Sie sicher, dass Sie die richtige Datei gemäß Ihren TensorFlow-, Python-Versionen und HW installieren.
Sreeragh AR

@SreeraghAR TensFlowVersion ist 1.10.0 und verwendet MacOS Sierra. Helfen Sie mir, die Datei zu finden.
KPMG

Hmm .. Ich kann keine finden, die Ihren Versionen entspricht. Jemand muss ein benutzerdefiniertes Rad bauen. github.com/yaroslavvb/tensorflow-community-wheels Sofortige Lösung könnte Tensorflow 1.9.0
Sreeragh AR


5

Um TensorFlow mit SSE4.2 und AVX zu kompilieren, können Sie direkt verwenden

bazel build --config = mkl --config = "opt" --copt = "- March = Broadwell" --copt = "- O3" // tensorflow / tools / pip_package: build_pip_package

Quelle: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl


1
Hat sich in letzter Zeit etwas geändert? Das letzte Mal, dass ich nachgesehen habe, --copt="-march=native"war das Essen =. (Und übrigens, diese doppelten Anführungszeichen tun nichts; sie werden von der Shell entfernt, bevor bazelIhre Befehlszeile angezeigt wird.)
Peter Cordes

4

2.0 KOMPATIBLE LÖSUNG:

Führen Sie die folgenden Befehle in Terminal (Linux / MacOS) oder in der Eingabeaufforderung (Windows) aus, um Tensorflow 2.0 mit Bazel zu installieren :

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

2
Welcher Teil davon spezifiziert -march=nativeoder andere GCC / Clang-Optionen? Ich sehe darin keine Erwähnung von AVX, FMA oder SSE4.2. (Und ist das Build-Skript von Bazel oder Tensorflow immer noch so kaputt, dass nur Optionen wie -mavxArbeit funktionieren, nicht -march=native? Wenn das wirklich das Problem in der Top-Antwort auf diese Frage war)
Peter Cordes

Für die CPU-Unterstützung mit tf Version 2.1.0 hat die Option --config = opt bei mir nicht funktioniert, ich habe sie mit --config = v2 gelöst. Es ist auch gut zu erwähnen, dass die richtige Bazel-Version zum Erstellen 29.0 ist.
Tolik

2

Wenn Sie TensorFlow aus dem Quellcode erstellen, führen Sie das configureSkript aus. Eine der Fragen, die das configureSkript stellt, lautet wie folgt:

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

Das configureSkript hängt die von Ihnen angegebenen Flags an den Befehl bazel an, mit dem das TensorFlow-Pip-Paket erstellt wird. Grundsätzlich können Sie auf diese Aufforderung auf zwei Arten reagieren:

  • Wenn Sie TensorFlow auf demselben CPU-Typ wie dem erstellen, auf dem Sie TensorFlow ausführen, sollten Sie den Standardwert ( -march=native) akzeptieren . Diese Option optimiert den generierten Code für den CPU-Typ Ihres Computers.
  • Wenn Sie TensorFlow auf einem CPU-Typ erstellen, TensorFlow jedoch auf einem anderen CPU-Typ ausführen, sollten Sie ein spezifischeres Optimierungsflag bereitstellen, wie in der gcc-Dokumentation beschrieben .

Nachdem Sie TensorFlow wie in der vorherigen Liste mit Aufzählungszeichen beschrieben konfiguriert haben, sollten Sie in der Lage sein, TensorFlow vollständig für die Ziel-CPU optimiert zu erstellen, indem --config=optSie einfach das Flag zu jedem von Ihnen ausgeführten Bazel-Befehl hinzufügen .


-1

Um diese Warnungen auszublenden, können Sie dies vor Ihrem eigentlichen Code tun.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf

5
Lautlos langsamer zu laufen, als es auf Ihrer Hardware möglich wäre, scheint eine schlechte Idee zu sein.
Peter Cordes

Ich stimme @Peter Cordes im Allgemeinen zu - aber manchmal ist es nett (diszipliniert und achtsam), die Warnungen zu verbergen und sich auf die Aufgabe zu konzentrieren.
Westsider

2
@westsider: Ja, es könnte in einigen Fällen nützlich sein, aber dies ist keine gute Antwort, es sei denn, es weist auf die Auswirkungen hin: Es geht echte Leistung verloren, wenn Sie nur die Warnungen ausblenden, anstatt sie neu zu kompilieren. (Außer vielleicht, wenn Sie eine GPU für das schwere Heben verwenden, könnte es immer noch vor CPU-Optionen warnen?)
Peter Cordes
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.