¿Debe compilarse Tensorflow™?

En tan solo dos años, Tensorflow™ se ha convertido en una de las bibliotecas más populares para el aprendizaje automático profundo. Es esencial para lograr el mayor rendimiento posible a la hora de trabajar en proyectos Tensorflow™, al igual que en el desarrollo de cualquier otro producto de software.

Una de las formas más eficaces de aumentar la velocidad de los cálculos recomendada por Google es evitar el uso de un paquete precompilado de la biblioteca Tensorflow™ y sustituirlo con la versión de Tensorflow™ compilada directamente desde el código fuente. Recientemente, se llevó a cabo un estudio para probar el método propuesto por Google; se iniciaron los mismos proyectos utilizando Tensorflow™, sin el apoyo de la plataforma CUDA® instalada, de tres maneras distintas:

  • Utilizando un paquete precompilado;
  • Compilado directamente desde el código fuente sin el soporte de instrucciones de la CPU;
  • Compilado directamente desde el código fuente con el soporte de instrucciones de la CPU (AVX, AVX2, FMA, etc.).

Asimismo, se realizaron pruebas de la biblioteca Tensorflow™ con el soporte de la plataforma CUDA®. Los siguientes resultados de las pruebas se tomaron como índices de referencia:

Se realizaron pruebas en el servidor con la siguiente configuración (www.leadergpu.es):

  • 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

Comandos para la instalación de Tensorflow™ sin soporte de CUDA®:

Instalación de Tensorflow™ a partir de un paquete precompilado:

# pip install tensorflow

Instalación de Tensorflow™, compilada directamente desde el código fuente:

# git clone https://github.com/tensorflow/tensorflow
# cd tensorflow
# git checkout r1.3
# ./configure
  • para la compilación sin el soporte de comandos de la CPU:
    # bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
  • para la compilación con el soporte de comandos de la CPU:
    # 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

Pruebas con datos reales y datos sintéticos sin soporte de CUDA

Comandos para iniciar una red para realizar pruebas con datos reales:

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

Comandos para ejecutar pruebas con datos sintéticos:

# 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

Pruebas de Tensorflow™, instalada a partir de un paquete precompilado:
Resultados de las pruebas con datos reales: 10 images / sec; tiempo de ejecución del script de prueba = 20m55s.
Resultados de las pruebas con datos sintéticos: 0,73 images/sec; tiempo de ejecución del script de prueba = 36m25s.

Pruebas de Tensorflow™, compilada directamente desde el código fuente sin el soporte de instrucciones de la CPU:
Resultados de las pruebas con datos reales: 10 images/sec; tiempo de ejecución del script de prueba = 20m55s.
Resultados de las pruebas con datos sintéticos: 0,74 images/sec; tiempo de ejecución del script de prueba = 36m21s.

Pruebas de Tensorflow™, compilada directamente desde el código fuente con el soporte de instrucciones de la CPU:
Resultados de las pruebas con datos reales: 15-16 images/sec; tiempo de ejecución del script de prueba = 14m13s.
Resultados de las pruebas con datos sintéticos: 1,44 images/sec; tiempo de ejecución del script de prueba = 18m40s.

A continuación, se muestra un cuadro con los resultados de las pruebas.

Tests with real data
Tests with synthetic data

Comandos para la instalación de Tensorflow™ con soporte de CUDA®:

Instalación de Tensorflow™ a partir de un paquete precompilado:

# pip install tensorflow

Instalación de Tensorflow™, compilada directamente desde el código fuente:

# 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

Los comandos para iniciar redes son similares a los comandos de pruebas anteriores, excepto el comando para ejecutar el script para iniciar el aprendizaje de la red con datos sintéticos:

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

Pruebas con datos reales y datos sintéticos con soporte de CUDA

Pruebas de Tensorflow™, instalada a partir de un paquete precompilado:
Resultados de las pruebas con datos reales: 214 images/sec.
Resultados de las pruebas con datos sintéticos: 126,33 images/sec.

Pruebas de Tensorflow™, compilada directamente desde el código fuente con el soporte de instrucciones de la CPU:
Resultados de las pruebas con datos reales: 215 images/sec.
Resultados de las pruebas con datos sintéticos: 126,34 images/sec.

Para resumir los resultados de las pruebas realizadas, el uso de Tensorflow™ compilada directamente desde el código fuente (con soporte para instrucciones de la CPU) permite lograr una aceleración considerable (1,5 veces con datos reales y 2 veces con datos sintéticos) a la hora de realizar cálculos en la CPU. Sin embargo, a la hora de trabajar con GPU, el uso de Tensorflow™ compilada directamente desde el código fuente no logró ninguna mejora de los resultados en comparación con la Tensorflow™ instalada a partir de un paquete precompilado.