Moet Tensorflow™ worden gecompileerd?

In slechts twee jaar tijd is Tensorflow™ uitgegroeid tot een van de populairste bibliotheken voor deep-machine-learning. Het is essentieel om de hoogst mogelijke prestaties te bereiken tijdens het werken aan Tensorflow™-projecten, net als bij de ontwikkeling van elk ander softwareproduct.

Een van de effectieve manieren om de snelheid van de berekeningen te verhogen die Google adviseert, is het gebruik van een voorgecompileerd pakket van de Tensorflow™-bibliotheek te vermijden en dit te vervangen door een Tensorflow™-versie die rechtstreeks uit de broncode is gecompileerd. Onlangs werd een onderzoek uitgevoerd om de door Google voorgestelde methode te testen. Hierbij werden dezelfde projecten met Tensorflow™ gestart op drie verschillende manieren zonder de ondersteuning van het geïnstalleerde CUDA®-platform:

  • Met behulp van een voorgecompileerd pakket;
  • Direct gecompileerd vanuit de broncode zonder ondersteunende CPU-instructies;
  • Direct gecompileerd vanuit de broncode met ondersteunende CPU-instructies (AVX, AVX2 en FMA, enz.).

Er werden ook Tensorflow™-bibliotheektesten met ondersteuning voor het CUDA®-platform uitgevoerd. De volgende testresultaten werden als benchmarks genomen:

De testen zijn uitgevoerd op de server met de volgende configuratie (www.leadergpu.nl):

  • GPU: NVIDIA® Tesla® P100 (16 GB)
  • CPU: 2 x Intel® Xeon® E5-2630v4 2.2 GHz
  • RAM: 128 GB
  • SSD: 960 GB
  • Ports: 40 Gbps
  • OS: CentOS 7
  • Python 2.7
  • TensorFlow™ 1.3

Opdrachten voor het installeren van Tensorflow™ zonder CUDA®-ondersteuning:

Installatie van Tensorflow™ vanuit een voorgecompileerd pakket:

# pip install tensorflow

Installatie van Tensorflow™, rechtstreeks gecompileerd vanuit de broncode:

# git clone https://github.com/tensorflow/tensorflow
# cd tensorflow
# git checkout r1.3
# ./configure
  • voor compilatie zonder ondersteuning voor CPU-opdrachten:
    # bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
  • voor compilatie met ondersteuning voor CPU-opdrachten:
    # bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.1 --copt=-msse4.2 //tensorflow/tools/pip_package:build_pip_package
    bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
    # pip install /tmp/tensorflow_pkg/1.3.0-cp27-cp27mu-linux_x86_64.whl

Testen op echte gegevens en synthetische gegevens zonder ondersteuning van CUDA

Opdrachten voor het starten van een netwerk voor testen met echte gegevens:

# cd gender_net
# python download_data.py
# python convert_data_FS.py
# time python model_FS_mulGPU_v3.py

Opdrachten voor het uitvoeren van testen met synthetische gegevens:

# mkdir ~/Anaconda
# cd ~/Anaconda
# git clone https://github.com/tensorflow/benchmarks.git
# cd ~/Anaconda/benchmarks/scripts/tf_cnn_benchmarks
# python tf_cnn_benchmarks.py --devicecpu model --inception3 --batch_size 32 --data_format NHWC --num_batches 40

Tensorflow™ testen, geïnstalleerd vanuit een voorgecompileerd pakket:
Resultaat van testen met echte gegevens: 10 images / sec; uitvoeringstijd testscript = 20m55s.
Resultaat van testen met synthetische gegevens: 0,73 images/sec; uitvoeringstijd testscript = 36m25s.

Tensorflow™ testen, direct gecompileerd vanuit de broncode zonder ondersteunende CPU-instructies:
Resultaat van testen met echte gegevens: 10 images/sec; uitvoeringstijd testscript = 20m55s.
Resultaat van testen met synthetische gegevens: 0,74 images/sec; uitvoeringstijd testscript = 36m21s.

Tensorflow™ testen, direct gecompileerd vanuit de broncode met ondersteunende CPU-instructies:
Resultaat van testen met echte gegevens: 15-16 images/sec; uitvoeringstijd testscript = 14m13s.
Resultaat van testen met synthetische gegevens: 1,44 images/sec; uitvoeringstijd testscript = 18m40s.

Hieronder vindt u een grafiek met de testresultaten.

Tests with real data
Tests with synthetic data

Opdrachten voor het installeren van Tensorflow™ met CUDA®-ondersteuning:

Installatie van Tensorflow™ vanuit een voorgecompileerd pakket:

# pip install tensorflow

Installatie van Tensorflow™, rechtstreeks gecompileerd vanuit de broncode:

# git clone https://github.com/tensorflow/tensorflow
# cd tensorflow
# git checkout r1.3
#./configure
# bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.1 --copt=-msse4.2 --config=cuda //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
# pip install /tmp/tensorflow_pkg/1.3.0-cp27-cp27mu-linux_x86_64.whl

De opdrachten voor het starten van netwerken zijn vergelijkbaar met de opdrachten van de vorige testen, behalve de opdracht om het script uit te voeren om te beginnen met het inleren van het netwerk met synthetische gegevens:

# python tf_cnn_benchmarks.py --num_gpus=1 --model inception3 --batch_size 32

Testen met echte gegevens en synthetische gegevens met ondersteuning van CUDA

Tensorflow™ testen, geïnstalleerd vanuit een voorgecompileerd pakket:
Resultaat van testen met echte gegevens: 214 images/sec.
Resultaat van testen met synthetische gegevens: 126,33 images/sec.

Tensorflow™ testen, direct gecompileerd vanuit de broncode met ondersteunende CPU-instructies:
Resultaat van testen met echte gegevens: 215 images/sec.
Resultaat van testen met synthetische gegevens: 126,34 images/sec.

Om de resultaten van de uitgevoerde testen samen te vatten, maakt het gebruik van Tensorflow™ rechtstreeks vanuit de broncode gecompileerd (met ondersteuning voor CPU-instructies) het mogelijk om een aanzienlijke versnelling te bereiken (1,5 keer met echte gegevens en het dubbele met synthetische gegevens) bij het uitvoeren van berekeningen op de CPU. Tijdens het werken met GPU kon met het gebruik van Tensorflow™, rechtstreeks gecompileerd vanuit de broncode, echter geen verbetering van de resultaten worden bereikt in vergelijking met Tensorflow™, geïnstalleerd vanuit het voorgecompileerde pakket.