Compiler à partir de la source

Ce guide explique comment compiler un package pip TensorFlow à partir de la source et l'installer sur Ubuntu Linux et macOS. Bien que les instructions ci-dessous puissent fonctionner pour d'autres systèmes, elles ne sont testées et compatibles qu'avec Ubuntu et macOS.

Configuration pour Linux et macOS

Installez les outils de compilation suivants pour configurer votre environnement de développement.

Installer Python et les dépendances de package TensorFlow

Ubuntu

sudo apt install python-dev python-pip  # or python3-dev python3-pip

macOS

Nécessite Xcode 9.2 ou version ultérieure.

Effectuez l'installation à l'aide du gestionnaire de packages Homebrew :

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
brew install python@2  # or python (Python 3)

Installez les dépendances du package pip TensorFlow (si vous utilisez un environnement virtuel, omettez l'argument --user) :

pip install -U --user pip six numpy wheel setuptools mock 'future>=0.17.1'
pip install -U --user keras_applications --no-deps
pip install -U --user keras_preprocessing --no-deps

Installer Bazel

Pour compiler TensorFlow, vous devez installer Bazel. Bazelisk est un moyen simple d'installer Bazel. Il permet de télécharger automatiquement la version Bazel appropriée pour TensorFlow. Pour faciliter l'utilisation, ajoutez Bazelisk en tant qu'exécutable bazel dans votre variable PATH.

Si Bazelisk n'est pas disponible, vous pouvez l'installer manuellement. Veillez à installer une version compatible de Bazel, à savoir toute version comprise entre _TF_MIN_BAZEL_VERSION et _TF_MAX_BAZEL_VERSION, comme indiqué dans le fichier tensorflow/configure.py.

Installer la compatibilité GPU (facultatif, Linux uniquement)

La compatibilité GPU n'est pas proposée sous macOS.

Consultez le guide Compatibilité avec les GPU pour installer les pilotes et les logiciels supplémentaires requis pour exécuter TensorFlow sur un GPU.

Télécharger le code source de TensorFlow

Utilisez Git pour cloner le dépôt TensorFlow :

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow

Le dépôt est défini par défaut sur la branche de développement master. Vous pouvez également vous positionner sur une branche de publication pour effectuer la compilation :

git checkout branch_name  # r1.9, r1.10, etc.

Configurer la compilation

Configurez la compilation pour votre système en exécutant la commande ./configure à la racine de votre arborescence source TensorFlow. Le script vous invite à indiquer l'emplacement des dépendances TensorFlow et à définir des options de configuration de compilation supplémentaires (indicateurs de compilation, par exemple).

./configure

Exemple de session

Script ./configure. Voici un exemple d'exécution de ./configure (votre session peut se présenter différemment) :

Options de configuration

Compatibilité avec les GPU

Pour inclure la compatibilité avec les GPU, définissez cuda=Y lors de la configuration et spécifiez les versions de CUDA et cuDNN. Si plusieurs versions de CUDA ou de cuDNN sont installées sur votre système, définissez-la explicitement au lieu d'utiliser la version par défaut. La commande ./configure crée des liens symboliques vers les bibliothèques CUDA de votre système. Ainsi, si vous modifiez les chemins d'accès de votre bibliothèque CUDA, cette étape de configuration doit être exécutée à nouveau avant la compilation.

Optimisations

En ce qui concerne les indicateurs d'optimisation de la compilation, la valeur par défaut (-march=native) permet d'optimiser le code généré pour le type de processeur de votre machine. Cependant, si vous compilez TensorFlow pour un autre type de processeur, songez à utiliser un indicateur d'optimisation plus spécifique. Pour obtenir des exemples, consultez le manuel GCC.

Configurations prédéfinies

Certaines configurations de compilation prédéfinies peuvent être ajoutées à la commande bazel build, comme dans l'exemple suivant :

  • --config=mkl : compatibilité pour la bibliothèque Intel® MKL-DNN.
  • --config=monolithic : configuration pour une architecture principalement statique et monolithique.
  • --config=v1 : compilation de TensorFlow 1.x au lieu de la version 2.x.

Créer le package pip

TensorFlow 2.x

Le dépôt tensorflow:master a été mis à jour pour la version 2.x. Installez Bazel et utilisez bazel build pour créer le package TensorFlow.

bazel build //tensorflow/tools/pip_package:build_pip_package

TensorFlow 1.x

Pour compiler la version 1.x de TensorFlow à partir de la branche master, utilisez bazel build --config=v1 pour créer un package TensorFlow 1.x.

bazel build --config=v1 //tensorflow/tools/pip_package:build_pip_package

Processeur uniquement

Utilisez bazel pour préparer le compilateur de packages TensorFlow compatible uniquement avec les processeurs :

bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

Compatibilité avec les GPU

Pour créer un package TensorFlow compatible avec les GPU, procédez comme suit :

bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

Options de compilation Bazel

Consultez la documentation de référence sur la ligne de commande Bazel pour connaître les options de compilation.

Compiler TensorFlow à partir de la source peut utiliser beaucoup de mémoire RAM. Si votre système dispose d'une mémoire RAM limitée, vous pouvez restreindre l'utilisation qu'en fait Bazel en ajoutant l'argument : --local_ram_resources=2048.

Les packages TensorFlow officiels sont créés avec une chaîne d'outils GCC 7.3 conforme à la spécification de package manylinux2010.

Pour GCC 5 et versions ultérieures, la compatibilité avec l'ancienne version ABI peut être ajoutée en utilisant l'argument suivant : --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0". L'interface binaire compatibilité (ABI) garantit que les opérations personnalisées créées avec le package TensorFlow officiel continuent de fonctionner avec le package GCC 5.

Créer le package

La commande bazel build crée un fichier exécutable intitulé build_pip_package. Il s'agit du programme qui permet de créer le package pip. Lancez le fichier exécutable comme indiqué ci-dessous pour créer un package .whl dans le répertoire /tmp/tensorflow_pkg.

Pour effectuer la compilation à partir d'une branche de publication, utilisez la commande suivante :

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

Pour effectuer la compilation à partir de la branche master, utilisez l'option --nightly_flag pour obtenir les dépendances appropriées :

./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg

Bien qu'il soit possible de créer des configurations CUDA et non-CUDA sous la même arborescence source, nous vous recommandons d'exécuter bazel clean lorsque vous passez de l'une à l'autre.

Installer le package

Le nom du fichier .whl généré dépend de la version de TensorFlow et de votre plate-forme. Installez le package à l'aide de pip install, comme dans l'exemple suivant :

pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl

Images Docker Linux

Les images de développement Docker de TensorFlow sont un moyen simple de configurer un environnement pour compiler des packages Linux à partir de la source. Elles contiennent déjà le code source et les dépendances nécessaires pour compiler TensorFlow. Consultez le guide Docker de TensorFlow pour obtenir des instructions d'installation et la liste des tags d'image disponibles.

Processeur uniquement

L'exemple suivant utilise l'image :devel pour créer un package Python 2 pour processeur uniquement à partir du code source TensorFlow le plus récent. Consultez le guide Docker pour obtenir la liste des tags TensorFlow -devel disponibles.

Téléchargez l'image de développement la plus récente et démarrez un conteneur Docker que vous utiliserez pour créer le package pip :

docker pull tensorflow/tensorflow:devel
docker run -it -w /tensorflow_src -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:devel bash

git pull  # within the container, download the latest source code

La commande docker run ci-dessus démarre une interface système dans le répertoire /tensorflow_src, c'est-à-dire à la racine de l'arborescence source. Elle installe le répertoire actuel de l'hôte dans le répertoire /mnt du conteneur et transmet les informations de l'utilisateur hôte au conteneur à l'aide d'une variable d'environnement (utilisée pour définir les autorisations, tâche que Docker peut rendre difficile).

Pour créer une copie hôte de TensorFlow dans un conteneur, installez l'arborescence source de l'hôte dans le répertoire /tensorflow du conteneur :

docker run -it -w /tensorflow -v /path/to/tensorflow:/tensorflow -v $PWD:/mnt \
    -e HOST_PERMS="$(id -u):$(id -g)" tensorflow/tensorflow:devel bash

Une fois l'arborescence source configurée, créez le package TensorFlow dans l'environnement virtuel du conteneur :

  1. Configurez la compilation. Vous serez invité à répondre à des questions sur la configuration de la compilation.
  2. Compilez l'outil utilisé pour créer le package pip.
  3. Exécutez l'outil pour créer le package pip.
  4. Définissez les droits de propriété du fichier à l'extérieur du conteneur.
./configure  # answer prompts or use defaults

bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /mnt  # create package

chown $HOST_PERMS /mnt/tensorflow-version-tags.whl

Installez et vérifiez le package dans le conteneur :

pip uninstall tensorflow  # remove current version

pip install /mnt/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(tf.__version__)"

Sur votre machine hôte, le package pip TensorFlow se trouve dans le répertoire actuel (avec les autorisations utilisateur hôte) : ./tensorflow-version-tags.whl

Compatibilité avec les GPU

Docker est le moyen le plus simple d'ajouter la compatibilité avec les GPU pour TensorFlow, puisque la machine hôte nécessite uniquement le pilote NVIDIA® (le NVIDIA® CUDA® Toolkit n'a pas besoin d'être installé). Consultez le guide sur la compatibilité avec les GPU et le guide Docker de TensorFlow pour configurer nvidia-docker (Linux uniquement).

L'exemple suivant télécharge l'image TensorFlow :devel-gpu-py3 et utilise nvidia-docker pour exécuter le conteneur compatible GPU. L'image de développement est configurée pour compiler un package pip Python 3 compatible avec les GPU :

docker pull tensorflow/tensorflow:devel-gpu-py3
docker run --gpus all -it -w /tensorflow -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:devel-gpu-py3 bash
git pull  # within the container, download the latest source code

Ensuite, dans l'environnement virtuel du conteneur, compilez le package TensorFlow compatible GPU :

./configure  # answer prompts or use defaults

bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /mnt  # create package

chown $HOST_PERMS /mnt/tensorflow-version-tags.whl

Installez et vérifiez le package dans le conteneur, puis recherchez un GPU :

pip uninstall tensorflow  # remove current version

pip install /mnt/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(tf.contrib.eager.num_gpus())"

Configurations de compilation testées

Linux

Processeur

VersionVersion PythonCompilateurOutils de compilation
tensorflow-2.1.02.7, 3.5-3.7GCC 7.3.1Bazel 0.27.1
tensorflow-2.0.02.7, 3.3-3.7GCC 7.3.1Bazel 0.26.1
tensorflow-1.14.02.7, 3.3-3.7GCC 4.8Bazel 0.24.1
tensorflow-1.13.12.7, 3.3-3.7GCC 4.8Bazel 0.19.2
tensorflow-1.12.02.7, 3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.11.02.7, 3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.10.02.7, 3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.9.02.7, 3.3-3.6GCC 4.8Bazel 0.11.0
tensorflow-1.8.02.7, 3.3-3.6GCC 4.8Bazel 0.10.0
tensorflow-1.7.02.7, 3.3-3.6GCC 4.8Bazel 0.10.0
tensorflow-1.6.02.7, 3.3-3.6GCC 4.8Bazel 0.9.0
tensorflow-1.5.02.7, 3.3-3.6GCC 4.8Bazel 0.8.0
tensorflow-1.4.02.7, 3.3-3.6GCC 4.8Bazel 0.5.4
tensorflow-1.3.02.7, 3.3-3.6GCC 4.8Bazel 0.4.5
tensorflow-1.2.02.7, 3.3-3.6GCC 4.8Bazel 0.4.5
tensorflow-1.1.02.7, 3.3-3.6GCC 4.8Bazel 0.4.2
tensorflow-1.0.02.7, 3.3-3.6GCC 4.8Bazel 0.4.2

GPU

VersionVersion PythonCompilateurOutils de compilationcuDNNCUDA
tensorflow-2.1.02.7, 3.5-3.7GCC 7.3.1Bazel 0.27.17.610.1
tensorflow-2.0.02.7, 3.3-3.7GCC 7.3.1Bazel 0.26.17.410.0
tensorflow_gpu-1.14.02.7, 3.3-3.7GCC 4.8Bazel 0.24.17.410.0
tensorflow_gpu-1.13.12.7, 3.3-3.7GCC 4.8Bazel 0.19.27.410.0
tensorflow_gpu-1.12.02.7, 3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.11.02.7, 3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.10.02.7, 3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.9.02.7, 3.3-3.6GCC 4.8Bazel 0.11.079
tensorflow_gpu-1.8.02.7, 3.3-3.6GCC 4.8Bazel 0.10.079
tensorflow_gpu-1.7.02.7, 3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.6.02.7, 3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.5.02.7, 3.3-3.6GCC 4.8Bazel 0.8.079
tensorflow_gpu-1.4.02.7, 3.3-3.6GCC 4.8Bazel 0.5.468
tensorflow_gpu-1.3.02.7, 3.3-3.6GCC 4.8Bazel 0.4.568
tensorflow_gpu-1.2.02.7, 3.3-3.6GCC 4.8Bazel 0.4.55.18
tensorflow_gpu-1.1.02.7, 3.3-3.6GCC 4.8Bazel 0.4.25.18
tensorflow_gpu-1.0.02.7, 3.3-3.6GCC 4.8Bazel 0.4.25.18

macOS

Processeur

VersionVersion PythonCompilateurOutils de compilation
tensorflow-2.0.02.7, 3.5-3.7Clang (contenu dans Xcode 10.1)Bazel 0.27.1
tensorflow-2.0.02.7, 3.3-3.7Clang (contenu dans Xcode 10.1)Bazel 0.26.1
tensorflow-1.14.02.7, 3.3-3.7Clang (contenu dans Xcode)Bazel 0.24.1
tensorflow-1.13.12.7, 3.3-3.7Clang (contenu dans Xcode)Bazel 0.19.2
tensorflow-1.12.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.15.0
tensorflow-1.11.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.15.0
tensorflow-1.10.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.15.0
tensorflow-1.9.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.11.0
tensorflow-1.8.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.10.1
tensorflow-1.7.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.10.1
tensorflow-1.6.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.8.1
tensorflow-1.5.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.8.1
tensorflow-1.4.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.5.4
tensorflow-1.3.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.4.5
tensorflow-1.2.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.4.5
tensorflow-1.1.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.4.2
tensorflow-1.0.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.4.2

GPU

VersionVersion PythonCompilateurOutils de compilationcuDNNCUDA
tensorflow_gpu-1.1.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.4.25.18
tensorflow_gpu-1.0.02.7, 3.3-3.6Clang (contenu dans Xcode)Bazel 0.4.25.18