Construir a partir da fonte

Crie um pacote pip do TensorFlow a partir do código-fonte e instale-o no Ubuntu Linux e no macOS. Embora as instruções possam funcionar para outros sistemas, elas são testadas e suportadas apenas para Ubuntu e macOS.

Configuração para Linux e macOS

Instale as seguintes ferramentas de construção para configurar seu ambiente de desenvolvimento.

Instale o Python e as dependências do pacote TensorFlow

Ubuntu

sudo apt install python3-dev python3-pip

macOS

Requer Xcode 9.2 ou posterior.

Instale usando o gerenciador de pacotes Homebrew :

brew install python

Instale as dependências do pacote pip do TensorFlow (se estiver usando um ambiente virtual, omita o argumento --user ):

pip install -U --user pip

Instale o Bazel

Para construir o TensorFlow, você precisará instalar o Bazel. O Bazelisk é uma maneira fácil de instalar o Bazel e baixar automaticamente a versão correta do Bazel para o TensorFlow. Para facilitar o uso, adicione o Bazelisk como o executável bazel em seu PATH .

Se o Bazelisk não estiver disponível, você poderá instalar o Bazel manualmente. Certifique-se de instalar a versão correta do Bazel do arquivo .bazelversion do TensorFlow.

Clang é um compilador C/C++/Objective-C compilado em C++ baseado em LLVM. É o compilador padrão para construir o TensorFlow começando com o TensorFlow 2.13. A versão atualmente suportada é LLVM/Clang 17.

Os pacotes noturnos LLVM Debian/Ubuntu fornecem um script de instalação automática e pacotes para instalação manual no Linux. Certifique-se de executar o seguinte comando se você adicionar manualmente o repositório llvm apt às fontes do seu pacote:

sudo apt-get update && sudo apt-get install -y llvm-17 clang-17

Agora que /usr/lib/llvm-17/bin/clang é o caminho real para o clang neste caso.

Alternativamente, você pode baixar e descompactar o Clang + LLVM 17 pré-construído.

Abaixo está um exemplo de etapas que você pode seguir para configurar os binários Clang + LLVM 17 baixados em sistemas operacionais Debian/Ubuntu:

  1. Mude para o diretório de destino desejado: cd <desired directory>

  2. Carregue e extraia um arquivo compactado... (adequado à sua arquitetura):

    wget https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.2/clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04.tar.xz
    
    tar -xvf clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04.tar.xz
    

  3. Copie o conteúdo extraído (diretórios e arquivos) para /usr (você pode precisar de permissões sudo e o diretório correto pode variar de acordo com a distribuição). Isso instala efetivamente o Clang e o LLVM e os adiciona ao caminho. Você não deverá ter que substituir nada, a menos que tenha uma instalação anterior, caso em que deverá substituir os arquivos:

    cp -r clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04/* /usr

  4. Verifique a versão dos binários Clang + LLVM 17 obtida:

    clang --version

  5. Agora que /usr/bin/clang é o caminho real para o seu novo clang. Você pode executar o script ./configure ou definir manualmente as variáveis ​​de ambiente CC e BAZEL_COMPILER para esse caminho.

Instale o suporte GPU (opcional, somente Linux)

Não há suporte de GPU para macOS.

Leia o guia de suporte de GPU para instalar os drivers e software adicional necessários para executar o TensorFlow em uma GPU.

Baixe o código-fonte do TensorFlow

Use Git para clonar o repositório TensorFlow :

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

O padrão do repositório é o branch de desenvolvimento master . Você também pode verificar um branch de lançamento para construir:

git checkout branch_name  # r2.2, r2.3, etc.

Configurar a compilação

As compilações do TensorFlow são configuradas pelo arquivo .bazelrc no diretório raiz do repositório. Os scripts ./configure ou ./configure.py podem ser usados ​​para ajustar configurações comuns.

Execute o script ./configure no diretório raiz do repositório. Este script solicitará a localização das dependências do TensorFlow e solicitará opções adicionais de configuração de compilação (sinalizadores do compilador, por exemplo). Consulte a seção Amostra de sessão para obter detalhes.

./configure

Há também uma versão python deste script, ./configure.py . Se estiver usando um ambiente virtual, python configure.py prioriza caminhos dentro do ambiente, enquanto ./configure prioriza caminhos fora do ambiente. Em ambos os casos você pode alterar o padrão.

Sessão de amostra

Veja a seguir um exemplo de execução do script ./configure (sua sessão pode ser diferente):

Opções de configuração

Suporte para GPU

da v.2.18.0

Para suporte de GPU , defina cuda=Y durante a configuração e especifique as versões de CUDA e cuDNN, se necessário. O Bazel baixará pacotes CUDA e CUDNN automaticamente ou apontará para redistribuições CUDA/CUDNN/NCCL no sistema de arquivos local, se necessário.

antes da v.2.18.0

Para suporte de GPU , defina cuda=Y durante a configuração e especifique as versões de CUDA e cuDNN. Se o seu sistema tiver várias versões de CUDA ou cuDNN instaladas, defina explicitamente a versão em vez de confiar no padrão. ./configure cria links simbólicos para as bibliotecas CUDA do seu sistema – portanto, se você atualizar os caminhos da biblioteca CUDA, esta etapa de configuração deverá ser executada novamente antes da construção.

Otimizações

Para sinalizadores de otimização de compilação, o padrão ( -march=native ) otimiza o código gerado para o tipo de CPU da sua máquina. No entanto, ao criar o TensorFlow para um tipo de CPU diferente, considere um sinalizador de otimização mais específico. Verifique o manual do GCC para exemplos.

Configurações pré-configuradas

Existem algumas configurações de build pré-configuradas disponíveis que podem ser adicionadas ao comando bazel build , por exemplo:

  • --config=dbg —Construa com informações de depuração. Consulte CONTRIBUTING.md para obter detalhes.
  • --config=mkl —Suporte para Intel® MKL-DNN .
  • --config=monolithic —Configuração para uma construção monolítica e estática.

Construa e instale o pacote pip

Opções de compilação do Bazel

Consulte a referência de linha de comando do Bazel para opções de compilação .

Construir o TensorFlow a partir da fonte pode usar muita RAM. Se o seu sistema tiver restrição de memória, limite o uso de RAM do Bazel com: --local_ram_resources=2048 .

Os pacotes oficiais do TensorFlow são criados com um conjunto de ferramentas Clang que está em conformidade com o padrão de pacote manylinux2014.

Construa o pacote

Para construir o pacote pip, você precisa especificar o sinalizador --repo_env=WHEEL_NAME . dependendo do nome fornecido, o pacote será criado, por exemplo:

Para construir o pacote de CPU tensorflow:

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu

Para construir o pacote GPU tensorflow:

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow --config=cuda --config=cuda_wheel

Para construir o pacote tensorflow TPU:

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_tpu --config=tpu

Para construir o pacote noturno, defina tf_nightly em vez de tensorflow , por exemplo, para construir o pacote noturno da CPU:

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tf_nightly_cpu

Como resultado, a roda gerada estará localizada em

bazel-bin/tensorflow/tools/pip_package/wheel_house/

Instale o pacote

O nome do arquivo .whl gerado depende da versão do TensorFlow e da sua plataforma. Use pip install para instalar o pacote, por exemplo:

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Compilações do Docker Linux

As imagens de desenvolvimento do Docker do TensorFlow são uma maneira fácil de configurar um ambiente para criar pacotes Linux a partir do código-fonte. Essas imagens já contêm o código-fonte e as dependências necessárias para criar o TensorFlow. Acesse o guia do Docker do TensorFlow para obter instruções de instalação e a lista de tags de imagem disponíveis .

Somente CPU

O exemplo a seguir usa a imagem :devel para criar um pacote somente CPU a partir do código-fonte mais recente do TensorFlow. Verifique o guia do Docker para tags TensorFlow -devel disponíveis.

Baixe a imagem de desenvolvimento mais recente e inicie um contêiner Docker que você usará para criar o pacote 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

O comando docker run acima inicia um shell no diretório /tensorflow_src – a raiz da árvore de origem. Ele monta o diretório atual do host no diretório /mnt do contêiner e passa as informações do usuário do host para o contêiner por meio de uma variável ambiental (usada para definir permissões – o Docker pode tornar isso complicado).

Como alternativa, para criar uma cópia do host do TensorFlow em um contêiner, monte a árvore de origem do host no diretório /tensorflow do contêiner:

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

Com a árvore de origem configurada, crie o pacote TensorFlow no ambiente virtual do contêiner:

  1. Opcional: Configure o build — isso solicita que o usuário responda às perguntas de configuração do build.
  2. Construa o pacote pip .
  3. Ajuste as permissões de propriedade do arquivo fora do contêiner.
./configure  # if necessary

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu --config=opt
`
chown $HOST_PERMS bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Instale e verifique o pacote dentro do contêiner:

pip uninstall tensorflow  # remove current version

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

Na máquina host, o pacote pip do TensorFlow está no diretório atual (com permissões de usuário host): ./tensorflow- version - tags .whl

Suporte para GPU

Docker é a maneira mais fácil de criar suporte de GPU para TensorFlow, já que a máquina host requer apenas o driver NVIDIA® (o NVIDIA® CUDA® Toolkit não precisa estar instalado). Consulte o guia de suporte de GPU e o guia do TensorFlow Docker para configurar o nvidia-docker (somente Linux).

O exemplo a seguir baixa a imagem TensorFlow :devel-gpu e usa nvidia-docker para executar o contêiner habilitado para GPU. Esta imagem de desenvolvimento está configurada para construir um pacote pip com suporte de 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

Em seguida, dentro do ambiente virtual do contêiner, crie o pacote TensorFlow com suporte para GPU:

./configure  # if necessary

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow --config=cuda --config=cuda_wheel --config=opt

chown $HOST_PERMS bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Instale e verifique o pacote dentro do contêiner e verifique se há uma GPU:

pip uninstall tensorflow  # remove current version

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/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.list_physical_devices('GPU')))"

Configurações de compilação testadas

Linux

CPU

Versão Versão Python Compilador Ferramentas de construção
tensorflow-2.18.0 3.9-3.12 Clang 17.0.6 Bazel 6.5.0
tensorflow-2.17.0 3.9-3.12 Clang 17.0.6 Bazel 6.5.0
tensorflow-2.16.1 3.9-3.12 Clang 17.0.6 Bazel 6.5.0
tensorflow-2.15.0 3.9-3.11 Clang 16.0.0 Bazel 6.1.0
tensorflow-2.14.0 3.9-3.11 Clang 16.0.0 Bazel 6.1.0
tensorflow-2.13.0 3.8-3.11 Clang 16.0.0 Bazel 5.3.0
tensorflow-2.12.0 3.8-3.11 CGC 9.3.1 Bazel 5.3.0
tensorflow-2.11.0 3,7-3,10 CGC 9.3.1 Bazel 5.3.0
tensorflow-2.10.0 3,7-3,10 CGC 9.3.1 Bazel 5.1.1
tensorflow-2.9.0 3,7-3,10 CGC 9.3.1 Bazel 5.0.0
tensorflow-2.8.0 3,7-3,10 CGC 7.3.1 Bazel 4.2.1
tensorflow-2.7.0 3,7-3,9 CGC 7.3.1 Bazel 3.7.2
tensorflow-2.6.0 3,6-3,9 CGC 7.3.1 Bazel 3.7.2
tensorflow-2.5.0 3,6-3,9 CGC 7.3.1 Bazel 3.7.2
tensorflow-2.4.0 3,6-3,8 CGC 7.3.1 Bazel 3.1.0
tensorflow-2.3.0 3,5-3,8 CGC 7.3.1 Bazel 3.1.0
tensorflow-2.2.0 3,5-3,8 CGC 7.3.1 Bazel 2.0.0
tensorflow-2.1.0 2,7, 3,5-3,7 CGC 7.3.1 Bazel 0.27.1
tensorflow-2.0.0 2,7, 3,3-3,7 CGC 7.3.1 Bazel 0.26.1
tensorflow-1.15.0 2,7, 3,3-3,7 CGC 7.3.1 Bazel 0.26.1
tensorflow-1.14.0 2,7, 3,3-3,7 CGC 4.8 Bazel 0.24.1
tensorflow-1.13.1 2,7, 3,3-3,7 CGC 4.8 Bazel 0.19.2
tensorflow-1.12.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.15.0
tensorflow-1.11.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.15.0
tensorflow-1.10.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.15.0
tensorflow-1.9.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.11.0
tensorflow-1.8.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.10.0
tensorflow-1.7.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.10.0
tensorflow-1.6.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.9.0
tensorflow-1.5.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.8.0
tensorflow-1.4.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.5.4
tensorflow-1.3.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.4.5
tensorflow-1.2.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.4.5
tensorflow-1.1.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.4.2
tensorflow-1.0.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.4.2

GPU

Versão Versão Python Compilador Ferramentas de construção cuDNN CUDA
tensorflow-2.18.0 3.9-3.12 Clang 17.0.6 Bazel 6.5.0 9.3 12,5
tensorflow-2.17.0 3.9-3.12 Clang 17.0.6 Bazel 6.5.0 8,9 12.3
tensorflow-2.16.1 3.9-3.12 Clang 17.0.6 Bazel 6.5.0 8,9 12.3
tensorflow-2.15.0 3.9-3.11 Clang 16.0.0 Bazel 6.1.0 8,9 12.2
tensorflow-2.14.0 3.9-3.11 Clang 16.0.0 Bazel 6.1.0 8.7 11.8
tensorflow-2.13.0 3.8-3.11 Clang 16.0.0 Bazel 5.3.0 8.6 11.8
tensorflow-2.12.0 3.8-3.11 CGC 9.3.1 Bazel 5.3.0 8.6 11.8
tensorflow-2.11.0 3,7-3,10 CGC 9.3.1 Bazel 5.3.0 8.1 11.2
tensorflow-2.10.0 3,7-3,10 CGC 9.3.1 Bazel 5.1.1 8.1 11.2
tensorflow-2.9.0 3,7-3,10 CGC 9.3.1 Bazel 5.0.0 8.1 11.2
tensorflow-2.8.0 3,7-3,10 CGC 7.3.1 Bazel 4.2.1 8.1 11.2
tensorflow-2.7.0 3,7-3,9 CGC 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.6.0 3,6-3,9 CGC 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.5.0 3,6-3,9 CGC 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.4.0 3,6-3,8 CGC 7.3.1 Bazel 3.1.0 8,0 11,0
tensorflow-2.3.0 3,5-3,8 CGC 7.3.1 Bazel 3.1.0 7.6 10.1
tensorflow-2.2.0 3,5-3,8 CGC 7.3.1 Bazel 2.0.0 7.6 10.1
tensorflow-2.1.0 2,7, 3,5-3,7 CGC 7.3.1 Bazel 0.27.1 7.6 10.1
tensorflow-2.0.0 2,7, 3,3-3,7 CGC 7.3.1 Bazel 0.26.1 7.4 10,0
tensorflow_gpu-1.15.0 2,7, 3,3-3,7 CGC 7.3.1 Bazel 0.26.1 7.4 10,0
tensorflow_gpu-1.14.0 2,7, 3,3-3,7 CGC 4.8 Bazel 0.24.1 7.4 10,0
tensorflow_gpu-1.13.1 2,7, 3,3-3,7 CGC 4.8 Bazel 0.19.2 7.4 10,0
tensorflow_gpu-1.12.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.11.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.10.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.9.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.11.0 7 9
tensorflow_gpu-1.8.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.10.0 7 9
tensorflow_gpu-1.7.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.6.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.5.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.8.0 7 9
tensorflow_gpu-1.4.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.5.4 6 8
tensorflow_gpu-1.3.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.4.5 6 8
tensorflow_gpu-1.2.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.4.5 5.1 8
tensorflow_gpu-1.1.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.4.2 5.1 8
tensorflow_gpu-1.0.0 2,7, 3,3-3,6 CGC 4.8 Bazel 0.4.2 5.1 8

macOS

CPU

Versão Versão Python Compilador Ferramentas de construção
tensorflow-2.16.1 3.9-3.12 Clang do Xcode 13.6 Bazel 6.5.0
tensorflow-2.15.0 3.9-3.11 Clang do xcode 10.15 Bazel 6.1.0
tensorflow-2.14.0 3.9-3.11 Clang do xcode 10.15 Bazel 6.1.0
tensorflow-2.13.0 3.8-3.11 Clang do xcode 10.15 Bazel 5.3.0
tensorflow-2.12.0 3.8-3.11 Clang do xcode 10.15 Bazel 5.3.0
tensorflow-2.11.0 3,7-3,10 Clang do xcode 10.14 Bazel 5.3.0
tensorflow-2.10.0 3,7-3,10 Clang do xcode 10.14 Bazel 5.1.1
tensorflow-2.9.0 3,7-3,10 Clang do xcode 10.14 Bazel 5.0.0
tensorflow-2.8.0 3,7-3,10 Clang do xcode 10.14 Bazel 4.2.1
tensorflow-2.7.0 3,7-3,9 Clang do xcode 10.11 Bazel 3.7.2
tensorflow-2.6.0 3,6-3,9 Clang do xcode 10.11 Bazel 3.7.2
tensorflow-2.5.0 3,6-3,9 Clang do xcode 10.11 Bazel 3.7.2
tensorflow-2.4.0 3,6-3,8 Clang do xcode 10.3 Bazel 3.1.0
tensorflow-2.3.0 3,5-3,8 Clang do xcode 10.1 Bazel 3.1.0
tensorflow-2.2.0 3,5-3,8 Clang do xcode 10.1 Bazel 2.0.0
tensorflow-2.1.0 2,7, 3,5-3,7 Clang do xcode 10.1 Bazel 0.27.1
tensorflow-2.0.0 2,7, 3,5-3,7 Clang do xcode 10.1 Bazel 0.27.1
tensorflow-2.0.0 2,7, 3,3-3,7 Clang do xcode 10.1 Bazel 0.26.1
tensorflow-1.15.0 2,7, 3,3-3,7 Clang do xcode 10.1 Bazel 0.26.1
tensorflow-1.14.0 2,7, 3,3-3,7 Clang do xcode Bazel 0.24.1
tensorflow-1.13.1 2,7, 3,3-3,7 Clang do xcode Bazel 0.19.2
tensorflow-1.12.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.15.0
tensorflow-1.11.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.15.0
tensorflow-1.10.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.15.0
tensorflow-1.9.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.11.0
tensorflow-1.8.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.10.1
tensorflow-1.7.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.10.1
tensorflow-1.6.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.8.1
tensorflow-1.5.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.8.1
tensorflow-1.4.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.5.4
tensorflow-1.3.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.4.5
tensorflow-1.2.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.4.5
tensorflow-1.1.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.4.2
tensorflow-1.0.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.4.2

GPU

Versão Versão Python Compilador Ferramentas de construção cuDNN CUDA
tensorflow_gpu-1.1.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.4.2 5.1 8
tensorflow_gpu-1.0.0 2,7, 3,3-3,6 Clang do xcode Bazel 0.4.2 5.1 8