TensorFlow con Python3

TensorFlow es una librería Open Source que Google ha liberado a principios de este mes. Permite de forma sencilla montar flujos de procesado y entrenamiento con elementos como redes neuronales, e incluso implementar nuevas operaciones sobre su arquitectura (tutorial y ejemplos).

Esta librería está escrita en C++, pero la arquitectura, los datos a tratar y las operaciones se declaran en Python. Esto está genial, ya que da un gran rendimiento sin tener que pelearse con Segmentation Faults, pero si pensabas utilizar Python3 para esto... quizá tengas que esperar un poco, resulta que aún no está soportado [issue #1 en el GitHub], aunque tienen intención de hacerlo en algún momento.

Mientras tanto, en este repo, en la rama python3 tenéis una forma de poder ir usándolo... no está totalmente actualizado y quedan cosas sin afinar, por ejemplo los checkpoints. Además hay que compilarlo a mano (no hay un paquete de pip ya preparado), pero ahora veremos que se puede hacer fácilmente.

Bazel

Bien, resulta que para compilar TensorFlow no basta con un make de toda la vida, sino que está preparado para hacerse con bazel. Instalar este es bastante sencillo, las instrucciones están en bazel.io. Una vez instaladas las dependencias, Bazel tiene un instalador que se puede ejecutar pipeando un curl de su script a una shell (ugh...) o clonando el repo, como pone en la web para esto último solo hace falta hacer

1
2
3
$ git clone https://github.com/bazelbuild/bazel.git
$ cd bazel
$ ./compile.sh

Esto generará el binario de Bazel en bazel-bin/src/bazel, que podemos mover al $PATH que queramos. Además tendremos un archivo para ayudar al autocompletado en scripts/bazel-complete-template.bash, que podemos añadir al .bashrc con una línea como esta

1
$ source <RUTA AL CÓDIGO DE BAZEL>/scripts/bazel-complete-template.bash

Virtual environment

Una vez tenemos preparado Bazel, tendremos que preparar el entorno virtual donde alojaremos todos los paquetes de los que depende TensorFlow, para esto solo hay que hacer

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Creamos el entorno virtual, por ejemplo en la ruta “tensorflow3-env”
# No tiene por que ser 3.4, otra versión de python3 puede funcionar
$ virtualenv-3.4 --system-site-packages tensorflow3-env
Using base prefix '/usr'
New python executable in tensorflow3-env/bin/python3
Not overwriting existing python script tensorflow3-env/bin/python (you must use tensorflow3-env/bin/python3)
Installing setuptools, pip, wheel...done.
# Lo activamos
$ source tensorflow3-env/bin/activate

#v-------------v podemos ver cuando estamos dentro del entorno virtual del python
(tensorflow3-env)$

# Instalamos las dependencias de TensorFlow
(tensorflow3-env)$ apt-get install python3-numpy swig python3-dev

TensorFlow

Cuando el entorno ya está completamente listo, solo queda generar el paquete pip, pero ojo con este tema: parece que con GCC-5 el proceso consume demasiada memoria, así que hay que evitar paralelizarlo para que no atasque el PC. Así que si la versión de GCC es inferior a la 5, las órden será

1
2
# Preparar lo necesario para construír el paquete pip
(tensorflow3-env)$ bazel build -c opt //tensorflow/tools/pip_package:build_pip_package

Para (en GCC 5), limitar la concurrencia del compilador, haremos

1
2
# Preparar lo necesario para construír el paquete pip
(tensorflow3-env)$ bazel build --ram_utilization_factor=1 -c opt //tensorflow/tools/pip_package:build_pip_package

Una vez que esto acabó, podemos generar el paquete con

1
(tensorflow3-env)$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

El segundo parámetro especifica donde se dejará el paquete compilado (/tmp/tensorflow_pkg), podemos usar el que queramos (también borrarlo una vez esté instalado). Con todo ya listo y el paquete generado solo queda instalarlo con

1
(tensorflow3-env)$ pip install /tmp/tensorflow_pkg/tensorflow-*.whl  # El nombre del archivo puede cambiar

Y listo, ya podemos utilizar esta librería

1
2
3
4
5
6
(tensorflow3-env)$ python3
Python 3.4.3+ (default, Oct 10 2015, 09:15:38) 
[GCC 5.2.1 20151028] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> # No hay problema!
El Julia set en un shader » « Subuser: un Docker para el escritorio