Come compilare Tensorflow con le istruzioni SSE4.2 e AVX?

Questo è il messaggio ricevuto dall’esecuzione di uno script per verificare se Tensorflow funziona:

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 

Ho notato che ha menzionato SSE4.2 e AVX,

1) Cosa sono SSE4.2 e AVX?

2) In che modo questi SSE4.2 e AVX migliorano i calcoli della CPU per le attività di Tensorflow.

3) Come compilare Tensorflow usando le due librerie?

Mi sono imbattuto in questo stesso problema, sembra che il suggerimento di Yaroslav Bulatov non copra il supporto di SSE4.2, aggiungendo --copt=-msse4.2 sarebbe sufficiente. Alla fine, ho costruito con successo

 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 

senza ricevere avvisi o errori.

Probabilmente la scelta migliore per qualsiasi sistema è:

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

( Aggiornamento: gli script di compilazione potrebbero essere in uso -march=native , probabilmente perché contiene un = .)

-mfpmath=both funzionano solo con gcc, non con clang. -mfpmath=sse è probabilmente altrettanto buono, se non migliore, ed è il default per x86-64. -mfpmath=387 a 32 bit predefinite per -mfpmath=387 , quindi la modifica aiuterà a 32 bit. (Ma se si desidera un rendimento elevato per il numero di crunch, è necessario creare file binari a 64 bit.)

Non sono sicuro di quale sia l’impostazione predefinita di TensorFlow per -O2 o -O3 . gcc -O3 consente l’ottimizzazione completa inclusa l’auto-vettorizzazione, ma a volte può rallentare il codice.


Che cosa fa: --copt per bazel build passa un’opzione direttamente a gcc per compilare i file C e C ++ (ma non il collegamento, quindi hai bisogno di un’opzione diversa per l’ottimizzazione link-time cross-file)

x86-64 gcc usa per impostazione predefinita solo SSE2 o le istruzioni SIMD meno recenti, quindi è ansible eseguire i file binari su qualsiasi sistema x86-64. (Vedi https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html ). Non è quello che vuoi. Si desidera creare un binario che sfrutti tutte le istruzioni che possono essere eseguite dalla CPU, poiché si esegue solo questo binario sul sistema in cui è stato creato.

-march=native abilita tutte le opzioni supportate dalla CPU, quindi rende -mavx512f -mavx2 -mavx -mfma -msse4.2 ridondante. (Inoltre, -mavx2 abilita già -mavx e -msse4.2 , quindi il comando di Yaroslav avrebbe dovuto andare bene). Inoltre, se stai usando una CPU che non supporta una di queste opzioni (come FMA), usando -mfma creerebbe un file binario che -mfma con istruzioni illegali.

TensorFlow’s ./configure impostazione predefinita l’triggerszione di -march=native , quindi l’utilizzo di tale file dovrebbe evitare di dover specificare manualmente le opzioni del compilatore.

-march=native consente -mtune=native , quindi ottimizza la CPU per cose come la sequenza di istruzioni AVX è la migliore per carichi non allineati.

Questo vale per gcc, clang o ICC. (Per ICC, puoi usare -xHOST invece di -march=native .)

Iniziamo con la spiegazione del perché vedi questi avvertimenti in primo luogo .


Molto probabilmente non hai installato TF dal sorgente e invece di usare qualcosa come pip install tensorflow . Ciò significa che hai installato binari pre-costruiti (da qualcun altro) che non erano ottimizzati per la tua architettura. E questi avvertimenti ti dicono esattamente questo: qualcosa è disponibile sulla tua architettura, ma non sarà usato perché il binario non è stato compilato con esso. Ecco la parte dalla documentazione .

TensorFlow verifica all’avvio se è stato compilato con le ottimizzazioni disponibili sulla CPU. Se le ottimizzazioni non sono incluse, TensorFlow emetterà avvisi, ad esempio le istruzioni AVX, AVX2 e FMA non incluse.

La cosa buona è che molto probabilmente vuoi solo imparare / sperimentare con TF, quindi tutto funzionerà correttamente e non dovresti preoccupartene


Cosa sono SSE4.2 e AVX?

Wikipedia ha una buona spiegazione su SSE4.2 e AVX . Non è necessario che questa conoscenza sia efficace nell’apprendimento automatico. Potresti pensarci come un insieme di alcune istruzioni aggiuntive per un computer per utilizzare più punti dati contro una singola istruzione per eseguire operazioni che possono essere parallelizzate in modo naturale (ad esempio aggiungendo due array).

Sia SSE che AVX sono l’implementazione di un’idea astratta di SIMD (Single instruction, multiple data), che è

una class di computer paralleli nella tassonomia di Flynn. Descrive computer con più elementi di elaborazione che eseguono la stessa operazione su più punti di dati contemporaneamente. Quindi, tali macchine sfruttano il parallelismo a livello di dati, ma non la concorrenza: ci sono calcoli simultanei (paralleli), ma solo un singolo processo (istruzione) in un dato momento

Questo è sufficiente per rispondere alla tua prossima domanda.


Come fanno questi SSE4.2 e AVX a migliorare i calcoli della CPU per le attività TF

Consentono un calcolo più efficiente di varie operazioni vettoriali (matrice / tensore). Puoi leggere di più in queste diapositive


Come compilare Tensorflow usando le due librerie?

È necessario disporre di un file binario che è stato compilato per sfruttare queste istruzioni. Il modo più semplice è compilarlo da solo . Come suggerito da Mike e Yaroslav, puoi usare il seguente comando di bazel

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

Lasciami rispondere prima alla tua terza domanda:

Se vuoi eseguire una versione compilata automaticamente in un conda-env, puoi farlo. Queste sono le istruzioni generali che eseguo per far installare sul mio sistema tensorflow con istruzioni aggiuntive. Nota: questa build era per una build AMD A10-7850 (controlla la tua CPU per quali istruzioni sono supportate … potrebbe essere diversa) su Ubuntu 16.04 LTS. Io uso Python 3.5 all’interno del mio conda-env. Il credito va alla pagina di installazione della sorgente di tensorflow e alle risposte fornite sopra.

 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. 

Per quanto riguarda la tua seconda domanda:

A mio avviso, una versione auto-compilata con ottimizzazioni vale la pena. Nella mia particolare configurazione, i calcoli che richiedevano 560-600 secondi ora richiedono solo circa 300 secondi! Anche se i numeri esatti varieranno, penso che ci si possa aspettare un aumento della velocità del 35-50% in generale sul proprio setup particolare.

Infine la tua prima domanda:

Molte delle risposte sono già state fornite sopra. Per riassumere: AVX , SSE4.1, SSE4.2 , MFA sono diversi tipi di set di istruzioni estese sulle CPU X86. Molti contengono istruzioni ottimizzate per l’elaborazione di operazioni con matrici o vettori.

Metterò in risalto il mio malinteso sperare di salvarti un po ‘di tempo: non è che SSE4.2 sia una versione più recente delle istruzioni che sostituisce SSE4.1. SSE4 = SSE4.1 (un insieme di 47 istruzioni) + SSE4.2 (un set di 7 istruzioni).

Nel contesto della compilazione di tensorflow, se il computer supporta AVX2 e AVX e SSE4.1 e SSE4.2, è necessario inserire tutti quei flag di ottimizzazione. Non fare come ho fatto e basta andare con SSE4.2 pensando che sia più recente e dovrebbe superare SSE4.1. È chiaramente SBAGLIATO! Ho dovuto ricompilare per quello che mi è costato 40 minuti buoni.

Questi sono insiemi di istruzioni di elaborazione vettoriale SIMD .

L’uso delle istruzioni vettoriali è più veloce per molte attività; l’apprendimento automatico è un compito del genere.

Citando i documenti di installazione di tensorflow :

Per essere compatibile con una gamma di macchine il più ampia ansible, TensorFlow utilizza solo le istruzioni SIMD SSE4.1 sulle macchine x86. La maggior parte dei PC e Mac moderni supportano istruzioni più avanzate, quindi se stai costruendo un binario che verrà eseguito solo sulla tua macchina, puoi abilitarli usando --copt=-march=native nel comando di build di bazel.

Grazie a tutte queste risposte + alcune prove ed errori, sono riuscito a installarlo su un Mac con clang . Quindi, basta condividere la mia soluzione nel caso in cui sia utile a qualcuno.

  1. Seguire le istruzioni in Documentazione – Installazione di TensorFlow da fonti

  2. Quando richiesto

    Specificare i flag di ottimizzazione da utilizzare durante la compilazione quando viene specificata l’opzione bazel “–config = opt” [l’impostazione predefinita è -march = native]

quindi copia-incolla questa stringa:

 -mavx -mavx2 -mfma -msse4.2 

(L’opzione predefinita ha causato degli errori, così ha fatto alcuni degli altri flag.Non ho avuto errori con i flag di cui sopra. BTW ho risposto n a tutte le altre domande)

Dopo l’installazione, verificherò una velocità da 2x a 2.5x durante l’allenamento di modelli profondi rispetto a un’altra installazione basata sulle ruote predefinite – Installazione di TensorFlow su macOS

Spero che sia d’aiuto

L’ho installato di recente dal sorgente e qui sotto sono tutti i passaggi necessari per installarlo dal sorgente con le istruzioni citate disponibili.

Altre risposte già descrivono perché questi messaggi sono mostrati. La mia risposta fornisce un passo dopo passo su come installare isnstall, il che può aiutare le persone a fare il push dell’installazione reale come ho fatto io.

  1. Installa Bazel

Scaricalo da una delle versioni disponibili, ad esempio 0.5.2 . Estrailo, vai nella directory e configuralo: bash ./compile.sh . Copia l’eseguibile in /usr/local/bin : sudo cp ./output/bazel /usr/local/bin

  1. Installa Tensorflow

Clone tensorflow: git clone https://github.com/tensorflow/tensorflow.git Vai alla directory clonata per configurarlo: ./configure

Ti verrà chiesto di rispondere a diverse domande, di seguito ho suggerito la risposta a ciascuna delle domande, puoi, ovviamente, scegliere le tue risposte come preferisci:

 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. Il pacchetto pip. Per costruirlo devi descrivere quali istruzioni vuoi (sai, quelle che Tensorflow ha informato che manchi).

Crea script pip: 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

Creazione del pacchetto pip: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

Installa il pacchetto pip Tensorflow appena creato: sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

La prossima volta che avvii Tensorflow non si lamenterà più delle istruzioni mancanti.

Ho compilato un piccolo script Bash per Mac (che può essere facilmente portato su Linux) per recuperare tutte le funzionalità della CPU e applicarne alcune per creare TF. Im su master TF e uso un po ‘spesso (un paio di volte in un mese).

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

Questo è il metodo più semplice. Solo un passaggio.

Ha un impatto significativo sulla velocità. Nel mio caso, il tempo impiegato per un passo di formazione si è quasi dimezzato.

Fare riferimento a build personalizzate di tensorflow

Quando crei TensorFlow dal sorgente, esegui lo script configure . Una delle domande che lo script configure richiede è la seguente:

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

Lo script configure allegherà le flag specificate al comando bazel che crea il pacchetto pip TensorFlow. In generale, puoi rispondere a questo prompt in due modi:

  • Se stai costruendo TensorFlow sullo stesso tipo di CPU di quello su cui eseguirai TensorFlow, allora dovresti accettare il default ( -march=native ). Questa opzione ottimizzerà il codice generato per il tipo di CPU della tua macchina.
  • Se stai costruendo TensorFlow su un tipo di CPU ma eseguirai TensorFlow su un diverso tipo di CPU, allora considera di fornire un flag di ottimizzazione più specifico come descritto nella documentazione di gcc .

Dopo aver configurato TensorFlow come descritto nel precedente elenco puntato, dovresti essere in grado di creare TensorFlow completamente ottimizzato per la CPU di destinazione semplicemente aggiungendo il flag --config=opt a qualsiasi comando di bazel in esecuzione.

Per hide questi avvisi, puoi farlo prima del tuo codice reale.

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

Per compilare TensorFlow con SSE4.2 e AVX, è ansible utilizzare direttamente

bazel build –config = mkl –config = “opt” –copt = “- march = broadwell” –copt = “- O3” // tensorflow / tools / pip_package: build_pip_package

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