wake-up-neo.net

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

Dies ist die Nachricht, die Sie beim Ausführen eines Skripts erhalten haben, 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

Ich habe bemerkt, dass es SSE4.2 und AVX erwähnt hat,

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 man Tensorflow mit den beiden Bibliotheken kompilieren lassen?

237
GabrielChu

Ich bin gerade auf dieses selbe Problem gestoßen, es scheint, als ob der Vorschlag von Yaroslav Bulatov die Unterstützung von SSE4.2 nicht abdeckt, und --copt=-msse4.2 wü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 erhalten.

Die beste Wahl für jedes System ist wahrscheinlich:

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

(Update: Die Build-Skripte können -march=native lesen, möglicherweise weil sie einen = enthalten.)

-mfpmath=both funktioniert nur mit gcc, nicht mit clang. -mfpmath=sse ist wahrscheinlich genauso gut, wenn nicht besser, und ist der Standard für x86-64. Der 32-Bit-Build-Standardwert ist -mfpmath=387, sodass eine Änderung für 32-Bit hilfreich ist. (Wenn Sie jedoch eine hohe Leistung für das Zahlenverdünnen wünschen, sollten Sie 64-Bit-Binärdateien erstellen.)

Ich bin nicht sicher, was TensorFlow standardmäßig für -O2 oder -O3 ist. gcc -O3 ermöglicht die vollständige Optimierung einschließlich automatischer Vektorisierung, dies kann jedoch manchmal dazu führen, dass Code langsamer wird.


Was dies bewirkt: --copt FÜR bazel 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 Optimierung der Verknüpfungszeit zwischen Dateien)

x86-64 gcc verwendet standardmäßig nur SSE2- oder ältere SIMD-Anweisungen, sodass Sie die Binärdateien auf any x86-64-Systemen ausführen 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 nutzt, die Ihre CPU ausführen kann, da Sie diese Binärdatei nur auf dem System ausführen, auf dem sie erstellt wurde.

-march=native aktiviert alle Optionen, die Ihre CPU unterstützt, wodurch -mavx512f -mavx2 -mavx -mfma -msse4.2 überflüssig wird. (Außerdem aktiviert -mavx2 bereits -mavx und -msse4.2, so dass der Befehl von Yaroslav gut gewesen sein sollte). Wenn Sie eine CPU verwenden, die eine dieser Optionen nicht unterstützt (z. B. FMA), würde die Verwendung von -mfma eine Binärdatei ergeben, die zu unzulässigen Anweisungen führt.

TensorFlows ./configure aktiviert standardmäßig -march=native , sodass die Verwendung der Compiler-Optionen nicht manuell festgelegt werden muss.

-march=native aktiviert -mtune=native, also es optimiert für Ihre CPU für Dinge wie die Reihenfolge der AVX-Anweisungen am besten für nicht ausgerichtete Ladevorgänge.

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

141
Mike Chiu

Beginnen wir mit der Erklärung von warum sehen Sie diese Warnungen an erster Stelle


Wahrscheinlich haben Sie TF nicht aus dem Quellcode installiert und stattdessen etwas wie pip install tensorflow verwendet. Das bedeutet, dass Sie vorgefertigte (von einer anderen Person) Binärdateien installiert haben, die nicht für Ihre Architektur optimiert wurden. Und diese Warnungen verraten genau das: etwas ist in Ihrer Architektur vorhanden, wird aber nicht verwendet, da die Binärdatei nicht damit kompiliert wurde. Hier ist der Teil von Dokumentation .

TensorFlow prüft beim Start, ob es mit der .__ kompiliert wurde. Optimierungen auf der CPU verfügbar. Wenn die Optimierungen nicht .__ sind. TensorFlow wird Warnungen ausgeben, z. AVX, AVX2 und FMA Anweisungen sind nicht enthalten.

Die gute Sache ist, dass Sie höchstwahrscheinlich nur mit TF lernen/experimentieren möchten, damit alles richtig funktioniert und Sie sich nicht darum kümmern müssen.


Was sind SSE4.2 und AVX?

Wikipedia hat eine gute Erklärung für SSE4.2 und AVX . Dieses Wissen ist nicht erforderlich, um maschinell zu lernen. Sie können sie als eine Reihe von zusätzlichen Anweisungen betrachten, damit ein Computer mehrere Datenpunkte für eine einzelne Anweisung verwendet, um Operationen auszuführen, die auf natürliche Weise parallelisiert werden können (z. B. zwei Arrays). 

Sowohl SSE als auch AVX sind eine Implementierung einer abstrakten Idee von SIMD (Einzelanweisung, mehrere Daten)

eine Klasse von Parallelcomputern in der Flynn-Taxonomie. Es beschreibt Computer mit mehreren Verarbeitungselementen, die dasselbe ausführen Betrieb an mehreren Datenpunkten gleichzeitig. Daher sind solche Maschinen Parallelität auf Datenebene ausnutzen, aber keine Parallelität: Es gibt gleichzeitige (parallele) Berechnungen, aber nur ein einzelner Prozess (Unterricht) zu einem bestimmten Zeitpunkt

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). Weitere Informationen finden Sie in diese Folien


Wie lässt sich Tensorflow mithilfe der beiden Bibliotheken kompilieren?

Sie benötigen eine Binärdatei, die kompiliert wurde, um diese Anweisungen zu nutzen. Der einfachste Weg ist, selbst kompilieren . Wie von Mike und Yaroslav vorgeschlagen, 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

119
Salvador Dali

Lassen Sie mich zuerst Ihre dritte Frage beantworten:

Wenn Sie eine selbstkompilierte Version in einer Conda-Umgebung ausführen möchten, können Sie dies tun. Dies sind die allgemeinen Anweisungen, die ich ausführte, um den Tensorflow zusammen mit zusätzlichen Anweisungen auf meinem System zu installieren. Hinweis: Dieser Build war für einen AMD A10-7850-Build (prüfen Sie, welche Anweisungen von der CPU unterstützt werden ... es kann anders sein), wenn Ubuntu 16.04 LTS ausgeführt wird. Ich benutze Python 3.5 in meinem conda-env. Die Gutschrift geht auf die Tensorflow-Quellinstallationsseite und die 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 zweiten Frage:

Eine selbst kompilierte Version mit Optimierungen ist meiner Meinung nach den Aufwand wert. In meinem speziellen Setup dauern Berechnungen, die früher 560-600 Sekunden dauerten, nur etwa 300 Sekunden! Obwohl die genauen Zahlen variieren werden, kann man davon ausgehen, dass die Geschwindigkeit in Ihrem speziellen Setup um 35-50% erhöht wird.

Zuletzt deine erste Frage:

Viele Antworten wurden bereits oben gegeben. Zusammenfassend gilt: AVX , SSE4.1, SSE4.2 , MFA sind verschiedene Arten von erweiterten Befehlssätzen auf X86-CPUs. Viele enthalten optimierte Anweisungen für die Verarbeitung 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 der Computer im Rahmen der Tensorflow-Kompilierung AVX2 und AVX sowie SSE4.1 und SSE4.2 unterstützt, sollten Sie diese Optimierungsflags für alle setzen. Tun Sie es nicht wie ich und gehen Sie einfach zu SSE4.2 und denken Sie, dass es neuer ist und SSE4.1 überlegen sein sollte. Das ist eindeutig FALSCH! Ich musste neu kompilieren, was mich gute 40 Minuten kostete.

50
Thornhale

Dies sind SIMDVektorverarbeitungsbefehlssätze

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

Zitieren der Installationsdokumente tensorflow :

TensorFlow verwendet standardmäßig nur SSE4.1-SIMD-Anweisungen auf x86-Maschinen, um mit so vielen verschiedenen Maschinen wie möglich kompatibel zu sein. 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 mit --copt=-march=native in Ihrem Bazel-Buildbefehl aktivieren.

25

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

  1. Folgen Sie den Anweisungen auf Dokumentation - TensorFlow aus Quellen installieren

  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 wird. [Standardwert ist -march = native].

dann kopiere und füge diese Zeichenfolge ein: 

-mavx -mavx2 -mfma -msse4.2

(Die Standardoption hat Fehler verursacht, auch einige der anderen Flags. Ich habe keine Fehler mit den obigen Flags erhalten. Übrigens: Ich habe n auf alle anderen Fragen geantwortet.)

Nach der Installation vergewissere ich mich beim Trainieren tiefer Modelle in Bezug auf eine andere Installation auf der Grundlage der Standardräder mit einem ~ 2- bis 2,5-fachen Beschleunigen. - TensorFlow unter macOS installieren

Ich hoffe es hilft

14
JARS

Ich habe es vor kurzem von Source installiert und unten sind alle Schritte, die erforderlich sind, um es von Source mit den erwähnten Anweisungen zu installieren.

Andere Antworten beschreiben bereits, warum diese Meldungen angezeigt werden. In meiner Antwort wird Schritt für Schritt beschrieben, wie isnstall installiert wird. Dies kann dazu beitragen, dass andere Benutzer Probleme mit der eigentlichen Installation haben.

  1. Installieren Sie Bazel

Laden Sie es von einem ihrer verfügbaren releases herunter, zum Beispiel 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: git clone https://github.com/tensorflow/tensorflow.git Gehen 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, je nachdem, wie Sie möchten:

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 bauen, müssen Sie beschreiben, welche Anweisungen Sie wünschen (Sie wissen, dass Tensorflow informiert hat, 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 soeben hergestellte 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, werden Sie sich nicht mehr über fehlende Anweisungen beschweren.

6
Eduardo

Dies ist die einfachste Methode. Nur ein Schritt.

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

Refer benutzerdefinierte Tensorfluss-Builds

6
Sreeragh A R

Ich habe ein kleines Bash-Skript für Mac erstellt (kann problemlos auf Linux portiert werden), um alle CPU-Funktionen abzurufen und einige davon zum Erstellen von TF zu verwenden. Ich bin auf TF Master und benutze irgendwie oft (paar Male in einem Monat).

https://Gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f

4
Alex Nikiforov

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

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

3
supercheval

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

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

Das Skript configure hängt die von Ihnen angegebenen Markierungen an den Bazel-Befehl an, mit dem das TensorFlow-Pip-Paket erstellt wird. Im Großen und Ganzen können Sie auf zwei Arten auf diese Aufforderung antworten:

  • Wenn Sie TensorFlow auf dem gleichen CPU-Typ bauen, auf dem Sie TensorFlow ausführen, sollten Sie den Standardwert (-march=native) akzeptieren. Diese Option optimiert den generierten Code für den CPU-Typ Ihrer Maschine.
  • Wenn Sie TensorFlow auf einem CPU-Typ erstellen, TensorFlow jedoch auf einem anderen CPU-Typ ausführen, sollten Sie ein spezifischeres Optimierungsflag angeben, wie in the gcc Documentation beschrieben.

Nachdem Sie TensorFlow wie in der vorangegangenen Liste mit Aufzählungszeichen beschrieben konfiguriert haben, sollten Sie TensorFlow für die Ziel-CPU vollständig optimiert erstellen können, indem Sie einfach den Flag --config=opt zu jedem von Ihnen ausgeführten Basiskommando hinzufügen.

2
Barry Rosenberg

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
0
javac