Compilação do TensorFlow 0.10 para Linux (com GPU)

Esse tutorial é sobre a construção do pacote do TensorFlow 0.10 para Linux com suporte a GPU. Para esse procedimento é usado o Docker com uma imagem do Ubuntu 16.04, GCC 5.4, Python 2.7, Cuda 8.0 (RC) e cuDNN 5.1. A motivação desse trabalho é usar o TensorFlow com as novas gerações de GPUs da Nvidia (Pascal). Um segundo objetivo é a criação de um pacote do TensorFlow com capacidades específicas (por exemplo, um “Compute Capability” específico).

O procedimento também está disponível como um script para Docker (ainda é necessário fazer o download do Cuda manualmente).

https://github.com/cirocavani/tensorflow-build

Compilação

O procedimento consiste em:

  1. Instalar o Cuda 8.0rc com o patch para GCC 5.4
  2. Instalar o cuDNN 5.1 para Cuda 8.0
  3. Instalar o Java 8
  4. Instalar o Bazel 0.3
  5. Construir TensorFlow 0.10

O resultado é o pacote do TensorFlow para Python 2 e Linux (com GPU):

tensorflow-0.10.0-py2-none-linux_x86_64.whl

Baseado na documentação:

https://www.tensorflow.org/versions/r0.10/get_started/os_setup.html#installing-from-sources

Um procedimento alternativo:

https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/tools/docker/Dockerfile.devel-gpu

Download do Cuda 8.0rc, cuDNN 5.1

É necessário o download dos pacotes:

cuda_8.0.27_linux.run
cuda_8.0.27.1_linux.run
cudnn-8.0-linux-x64-v5.1.tgz

Esses pacotes devem ser colocados na pasta build_deps/.

No momento, a versão mais recente do Cuda é a 8.0 RC e só está disponível para download para membros do Accelerated Computing Developer Program no site da Nvidia (o cadastro é gratuito).

https://developer.nvidia.com/cuda-release-candidate-download

Select Target Platform:

Operating System = Linux
Architecture = x86_64
Distribution = Ubuntu
Version = 16.04
Installer Type = runfile (local)

Download:

  • Base Installer - cuda_8.0.27_linux.run
  • Patch 1 - cuda_8.0.27.1_linux.run

https://developer.nvidia.com/rdp/cudnn-download

Selecione:

1. I Agree To the Terms of the cuDNN Software License Agreement
2. Download cuDNN v5.1 (August 10, 2016), for CUDA 8.0 RC
3. cuDNN v5.1 Library for Linux

Download:

  • cudnn-8.0-linux-x64-v5.1.tgz.

Setup inicial no Docker para Ubuntu 16.04

Download dos demais pacotes necessários para o build:

cd build_deps

curl -k -L \
  -H "Cookie: oraclelicense=accept-securebackup-cookie" \
  -O http://download.oracle.com/otn-pub/java/jdk/8u102-b14/jdk-8u102-linux-x64.tar.gz

curl -k -L \
  -O https://github.com/bazelbuild/bazel/releases/download/0.3.1/bazel-0.3.1-installer-linux-x86_64.sh

chmod +x cuda_8.0.27_linux.run
chmod +x cuda_8.0.27.1_linux.run
chmod +x bazel-0.3.1-installer-linux-x86_64.sh

cd ..

Criação do Container com as dependências:

docker create -t --name=tensorflow_build ubuntu:16.04
docker cp build_deps tensorflow_build:/

Execução do Shell no Container:

docker start tensorflow_build
docker exec -i -t tensorflow_build /bin/bash

Setup do Container:

echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
echo 'APT::Install-Recommends "0";' > 01norecommend
mv 01norecommend /etc/apt/apt.conf.d

apt-get update
apt-get upgrade -y

apt-get install -y \
    build-essential \
    python-dev \
    python-wheel \
    python-setuptools \
    python-numpy \
    swig \
    zlib1g-dev \
    unzip \
    file \
    git \
    ca-certificates \
    rsync

Instalação do Cuda 8.0rc e cuDNN 5.1

(comandos a serem executados dentro do container)

/build_deps/cuda_8.0.27_linux.run --silent --toolkit --override

/build_deps/cuda_8.0.27.1_linux.run --silent --accept-eula

tar zxf /build_deps/cudnn-8.0-linux-x64-v5.1.tgz \
    -C /usr/local/cuda-8.0 --strip-components=1

Instalação do Java 8

(comandos a serem executados dentro do container)

tar zxf /build_deps/jdk-8u102-linux-x64.tar.gz -C /opt --no-same-owner

echo 'export JAVA_HOME=/opt/jdk1.8.0_102' > /etc/profile.d/java.sh
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile.d/java.sh
chmod a+x /etc/profile.d/java.sh

source /etc/profile.d/java.sh

Instalação do Bazel 0.3

(comandos a serem executados dentro do container)

/build_deps/bazel-0.3.1-installer-linux-x86_64.sh --prefix=/opt/bazel-0.3.1

echo 'export PATH=$PATH:/opt/bazel-0.3.1/bin' > /etc/profile.d/bazel.sh
chmod a+x /etc/profile.d/bazel.sh

source /etc/profile.d/bazel.sh

Construção do TensorFlow 0.10

Considerações:

  • Configuração da GPU

    É necessário definir qual “Compute Capability” o binário do TensorFlow vai suportar.

    https://developer.nvidia.com/cuda-gpus

    Por exemplo:

    A GeForce GT 740M tem Compute Capability 3.0

    export TF_CUDA_COMPUTE_CAPABILITIES=3.0
    
  • Uso de Memória

    O build executa várias tarefas em paralelo e o consumo de memória pode aumentar rapidamente.

    Para limitar o número de execuções paralelas é usada a opção -j 4 no build.

    Em um notebook com 8 cores (HT), 8G de memória é insuficiente.

(comandos a serem executados dentro do container)

useradd -m tensorflow
passwd -d tensorflow

su - tensorflow

git clone https://github.com/tensorflow/tensorflow.git -b r0.10 ~/tensorflow-0.10

cd ~/tensorflow-0.10

export PYTHON_BIN_PATH=/usr/bin/python
export TF_NEED_GCP=0
export TF_NEED_CUDA=1
export GCC_HOST_COMPILER_PATH=/usr/bin/gcc
export TF_CUDA_VERSION=8.0
export CUDA_TOOLKIT_PATH=/usr/local/cuda-8.0
export TF_CUDNN_VERSION=5
export CUDNN_INSTALL_PATH=/usr/local/cuda-8.0
export TF_CUDA_COMPUTE_CAPABILITIES=3.0
./configure

bazel build -j 4 -c opt --config=cuda \
    //tensorflow/tools/pip_package:build_pip_package

bazel-bin/tensorflow/tools/pip_package/build_pip_package $HOME

mv ~/tensorflow-0.10.0-py2-none-{any,linux_x86_64}.whl

# saindo su
exit

# saindo do container
exit

Para baixar o pacote (fora do container):

docker cp \
    tensorflow_build:/home/tensorflow/tensorflow-0.10.0-py2-none-linux_x86_64.whl \
    .

Conclusão

O procedimento de build do TensorFlow não é complicado, mas pequenas variações podem atingir alguns bugs do build (exemplo). Com um script bem definido, fica fácil criar o pacote do TensorFlow.

Com esse pacote, é possível usar o TensorFlow nas GPUs mais recentes da Nvidia.

No próximo artigo será um tutorial de como configurar um ambiente de desenvolvimento com Jupyter.

 
comments powered by Disqus