RSVP for your your local TensorFlow Everywhere event today!

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 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/opt/python/libexec/bin:$PATH"
# if you are on macOS 10.12 (Sierra) use export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
brew install python

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

pip install -U --user pip numpy wheel
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  # r2.2, r2.3, 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

Si vous utilisez un environnement virtuel, la commande python configure.py donne la priorité aux chemins d'accès présents dans l'environnement, tandis que la commande ./configure, à ceux présents hors de celui-ci. Dans les deux cas, vous pouvez modifier le paramètre par défaut.

Exemple de session

Voici un exemple d'exécution du script ./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

Installez Bazel et utilisez bazel build pour créer le package TensorFlow 2.x package avec la compatibilité du processeur uniquement :

bazel build [--config=option] //tensorflow/tools/pip_package:build_pip_package

Compatibilité avec les GPU

Pour créer un package TensorFlow avec la compatibilité GPU, procédez comme suit :

bazel build --config=cuda [--config=option] //tensorflow/tools/pip_package:build_pip_package

TensorFlow 1.x

Pour créer un package TensorFlow 1.x, utilisez l'option --config=v1 :

bazel build --config=v1 [--config=option] //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. Utilisez la commande pip install pour installer le package, 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 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 et utilise nvidia-docker pour exécuter le conteneur compatible GPU. L'image de développement est configurée pour compiler un package pip compatible avec les GPU :

docker pull tensorflow/tensorflow:devel-gpu
docker run --gpus all -it -w /tensorflow -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:devel-gpu 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(\"Num GPUs Available: \", len(tf.config.experimental.list_physical_devices('GPU')))"

Configurations de compilation testées

Linux

Processeur

VersionVersion PythonCompilateurOutils de compilation
tensorflow-2.4.03.6-3.8GCC 7.3.1Bazel 3.1.0
tensorflow-2.3.03.5-3.8GCC 7.3.1Bazel 3.1.0
tensorflow-2.2.03.5-3.8GCC 7.3.1Bazel 2.2.0
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.15.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.4.03.6-3.8GCC 7.3.1Bazel 3.1.08.011.0
tensorflow-2.3.03.5-3.8GCC 7.3.1Bazel 3.1.07.610.1
tensorflow-2.2.03.5-3.8GCC 7.3.1Bazel 2.2.07.610.1
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.15.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.4.03.6-3.8Clang (contenu dans Xcode 10.3)Bazel 3.1.0
tensorflow-2.3.03.5-3.8Clang (contenu dans Xcode 10.1)Bazel 3.1.0
tensorflow-2.2.03.5-3.8Clang (contenu dans Xcode 10.1)Bazel 2.2.0
tensorflow-2.1.02.7, 3.5-3.7Clang (contenu dans Xcode 10.1)Bazel 0.27.1
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.15.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