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 :
- Configurez la compilation. Vous serez invité à répondre à des questions sur la configuration de la compilation.
- Compilez l'outil utilisé pour créer le package pip.
- Exécutez l'outil pour créer le package pip.
- 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
Version | Version Python | Compilateur | Outils de compilation |
---|---|---|---|
tensorflow-2.4.0 | 3.6-3.8 | GCC 7.3.1 | Bazel 3.1.0 |
tensorflow-2.3.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 3.1.0 |
tensorflow-2.2.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 2.2.0 |
tensorflow-2.1.0 | 2.7, 3.5-3.7 | GCC 7.3.1 | Bazel 0.27.1 |
tensorflow-2.0.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 |
tensorflow-1.15.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 |
tensorflow-1.14.0 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.24.1 |
tensorflow-1.13.1 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.7.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.6.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 |
tensorflow-1.5.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 |
tensorflow-1.4.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
GPU
Version | Version Python | Compilateur | Outils de compilation | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow-2.4.0 | 3.6-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 8.0 | 11.0 |
tensorflow-2.3.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 7.6 | 10.1 |
tensorflow-2.2.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 2.2.0 | 7.6 | 10.1 |
tensorflow-2.1.0 | 2.7, 3.5-3.7 | GCC 7.3.1 | Bazel 0.27.1 | 7.6 | 10.1 |
tensorflow-2.0.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.15.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.14.0 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.24.1 | 7.4 | 10.0 |
tensorflow_gpu-1.13.1 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.19.2 | 7.4 | 10.0 |
tensorflow_gpu-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.9.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
tensorflow_gpu-1.8.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | 7 | 9 |
tensorflow_gpu-1.7.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.6.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.5.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
tensorflow_gpu-1.4.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
tensorflow_gpu-1.3.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
tensorflow_gpu-1.2.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
macOS
Processeur
Version | Version Python | Compilateur | Outils de compilation |
---|---|---|---|
tensorflow-2.4.0 | 3.6-3.8 | Clang (contenu dans Xcode 10.3) | Bazel 3.1.0 |
tensorflow-2.3.0 | 3.5-3.8 | Clang (contenu dans Xcode 10.1) | Bazel 3.1.0 |
tensorflow-2.2.0 | 3.5-3.8 | Clang (contenu dans Xcode 10.1) | Bazel 2.2.0 |
tensorflow-2.1.0 | 2.7, 3.5-3.7 | Clang (contenu dans Xcode 10.1) | Bazel 0.27.1 |
tensorflow-2.0.0 | 2.7, 3.5-3.7 | Clang (contenu dans Xcode 10.1) | Bazel 0.27.1 |
tensorflow-2.0.0 | 2.7, 3.3-3.7 | Clang (contenu dans Xcode 10.1) | Bazel 0.26.1 |
tensorflow-1.15.0 | 2.7, 3.3-3.7 | Clang (contenu dans Xcode 10.1) | Bazel 0.26.1 |
tensorflow-1.14.0 | 2.7, 3.3-3.7 | Clang (contenu dans Xcode) | Bazel 0.24.1 |
tensorflow-1.13.1 | 2.7, 3.3-3.7 | Clang (contenu dans Xcode) | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.10.1 |
tensorflow-1.7.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.10.1 |
tensorflow-1.6.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.8.1 |
tensorflow-1.5.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.8.1 |
tensorflow-1.4.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.4.2 |
GPU
Version | Version Python | Compilateur | Outils de compilation | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.1.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7, 3.3-3.6 | Clang (contenu dans Xcode) | Bazel 0.4.2 | 5.1 | 8 |