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.
- Was sind SSE4.2 und AVX?
- Wie verbessern diese SSE4.2 und AVX die CPU-Berechnungen für Tensorflow-Aufgaben?
- Wie kann Tensorflow mithilfe der beiden Bibliotheken kompiliert werden?
tensorflow
x86
compiler-optimization
simd
compiler-options
GabrielChu
quelle
quelle
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)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_sourcesAntworten:
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.2
würde ausreichen. Am Ende habe ich erfolgreich mit gebautohne Warnung oder Fehler zu bekommen.
Die wahrscheinlich beste Wahl für jedes System ist:
( Update: Die Build-Skripte fressen
-march=native
möglicherweise, möglicherweise weil sie eine enthalten=
.)-mfpmath=both
funktioniert nur mit gcc, nicht mit clang.-mfpmath=sse
ist 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=387
dies ä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
-O2
oder-O3
ist.gcc -O3
ermöglicht die vollständige Optimierung einschließlich der automatischen Vektorisierung, dies kann jedoch manchmal den Code verlangsamen.Was dies bewirkt:
--copt
forbazel 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=native
Aktiviert alle Optionen, die Ihre CPU unterstützt, und macht sie so-mavx512f -mavx2 -mavx -mfma -msse4.2
überflüssig. (Ebenfalls,-mavx2
aktiviert-mavx
und-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-mfma
eine 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
-xHOST
anstelle von verwenden-march=native
.)quelle
-march=native
also 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.--copt=-mfpmath=both
, damit es unterclang
macOS funktioniert . Beeinflusst es die resultierende Binärdatei?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 .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)
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
quelle
bazel
in diesem Fall installieren ?FAILED: Build did NOT complete successfully
. Es ist nicht so einfach, es selbst zu kompilieren.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.
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.
quelle
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 :
quelle
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.Befolgen Sie die Anweisungen zur Dokumentation - Installieren von TensorFlow aus Quellen
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:
(Die Standardoption verursachte Fehler, ebenso einige der anderen Flags. Ich habe keine Fehler mit den obigen Flags erhalten. Übrigens habe ich
n
auf 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
quelle
-march=native
sollte noch besser sein, wenn Ihr Compiler es richtig unterstützt. Außerdem können Sie-mtune=native
gute Befehlsentscheidungen für Ihre CPU treffen. zB auf Haswell und höher, es sperrt-mavx256-split-unaligned-store
und-mavx256-split-unaligned-load
, die standardmäßig sind-mtune=generic
und verletzt Leistung , wenn die Daten nicht ausgerichtet werden bekannt , aber stellt sich heraus , zur Laufzeit sein.-march=native
ein 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.=
drin, oder Sie nicht verwendengcc
oderclang
, sollte es funktionieren. Und-mtune=native -mavx2 -mfma
arbeitet für Sie? Oder-mtune=skylake
? (Oder welche CPU auch immer Sie haben). Übrigens-mavx2
impliziert-mavx
und-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.-march=native
dem Build-System nicht stimmt , würde ich gerne wissen. (Und / oder Sie sollten es Upstream melden, damit sie ihre Build-Skripte reparieren können).-march=native
mit 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)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.
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
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:
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.
quelle
-c opt --copt=-march=native
sollte 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=native
den 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=-mfma
dies 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.--copt=-mavx2
das nicht funktioniert hat. Wenn es--copt=-mfma
funktioniert,--copt=-march=native
sollte 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=native
an den Compiler übergeben wird. Dies über Build-Skripte zu erreichen, wird zum Trick.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
quelle
TensFlow
Version ist 1.10.0 und verwendetMacOS Sierra
. Helfen Sie mir, die Datei zu finden.Ich habe ein kleines Bash-Skript für Mac kompiliert (kann leicht auf Linux portiert werden), um alle CPU-Funktionen abzurufen und einige davon zum Erstellen von TF anzuwenden. Ich bin auf TF Master und benutze ein bisschen oft (ein paar Mal im Monat).
https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f
quelle
Um TensorFlow mit SSE4.2 und AVX zu kompilieren, können Sie direkt verwenden
Quelle: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl
quelle
--copt="-march=native"
war das Essen=
. (Und übrigens, diese doppelten Anführungszeichen tun nichts; sie werden von der Shell entfernt, bevorbazel
Ihre Befehlszeile angezeigt wird.)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 :
quelle
-march=native
oder 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-mavx
Arbeit funktionieren, nicht-march=native
? Wenn das wirklich das Problem in der Top-Antwort auf diese Frage war)Wenn Sie TensorFlow aus dem Quellcode erstellen, führen Sie das
configure
Skript aus. Eine der Fragen, die dasconfigure
Skript stellt, lautet wie folgt:Das
configure
Skript 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:-march=native
) akzeptieren . Diese Option optimiert den generierten Code für den CPU-Typ Ihres Computers.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=opt
Sie einfach das Flag zu jedem von Ihnen ausgeführten Bazel-Befehl hinzufügen .quelle
Um diese Warnungen auszublenden, können Sie dies vor Ihrem eigentlichen Code tun.
quelle