Es normal que al usar Jupyter se use Tensorflow, siguiendo con el ejemplo de Docker anterior voy a poner dos ejemplos, uno para usar una configuración de Docker con la última versión de TensorFlow y otra para tener dos versiones de TensorFlow, la correspondiente a la rama 1.x y otra con la versión 2.x.
TensorFlow 1.x y 2.x
El siguiente DockerFile está basado en el anterior así que solo se comentarán las diferencias.
FROM ubuntu:latest
# 1. Environment vars
ARG DEBIAN_FRONTEND=noninteractive
ARG TZ=Europe/Madrid
ENV TZ=$TZ
ENV NODE_OPTIONS=--max-old-space-size=768
# 2. Install packages
# 2.1 Update system and install Jupyter
RUN apt-get update && apt-get -y upgrade && \
apt-get install -y --no-install-recommends libhdf5-dev && \
apt-get install -y --no-install-recommends tzdata && \
apt-get install -y --no-install-recommends libzbar-dev libzbar0 && \
apt-get install -y --no-install-recommends build-essential python3-pip python3-dev python3-venv && \
apt-get install -y --no-install-recommends git && \
apt-get install -y --no-install-recommends software-properties-common && \
python3 -m pip install --upgrade virtualenv && \
python3 -m pip install --upgrade wheel && \
python3 -m pip install --upgrade ipykernel && \
python3 -m pip install --upgrade pip && \
python3 -m pip install --upgrade setuptools && \
# 2.2 Build git extension
python3 -m pip install jupyter && \
apt-get install -y --no-install-recommends nodejs && \
apt-get install -y --no-install-recommends npm && \
python3 -m pip install jupyterlab && \
python3 -m pip install --upgrade jupyterlab-git && \
jupyter lab build --minimize=False && \
# 2.3 Clean
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /tmp/*
# 3 Install TensorFlow
RUN python3 -m pip install --no-cache-dir --force-reinstall grpcio
# 3.1 Install Tensorflow 1 for Python 3.7
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt-get install -y python3.7 python3.7-dev python3.7-venv
RUN python3.7 -m pip install --upgrade pip && python3.7 -m pip install setuptools
COPY tensorflow-1.14.0-cp37-none-linux_armv7l.whl ./
RUN python3.7 -m pip install tensorflow-1.14.0-cp37-none-linux_armv7l.whl
# 3.2 Install Tensorflow 2 for Python 3.8
COPY tensorflow-2.4.0rc0-cp38-none-linux_armv7l.whl ./
RUN python3 -m pip install tensorflow-2.4.0rc0-cp38-none-linux_armv7l.whl
# 4. Add Jupyter user
RUN adduser --disabled-password --gecos '' jupyter
RUN adduser jupyter sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER jupyter
WORKDIR /home/jupyter/
RUN chmod a+rwx /home/jupyter/
# 5. Folder to download git files
RUN mkdir /home/jupyter/notebooks
# 6. Execute jupyter
CMD ["jupyter", "lab", "--port=8888", "--no-browser", "--ip=0.0.0.0", "--allow-root", "--notebook-dir=/home/jupyter/notebooks", "--NotebookApp.token=''", "--NotebookApp.password]
Hay que instalar algunos paquetes nuevos como wheel, virtualenv o ipykernel para poder usar varias versiones de Python en Jupyter a través del uso de kernels, esto se comentará más adelante para configuraciones con varias versiones de TensorFlow.
Instalamos libhdf5-dev y actualizamos el paquete setuptools para evitar un error durante la instalación del paquete grpcio y para evitar posibles errores en la creación de entornos virtuales.
El paquete software-properties-common es necesario para poder agregar repositorios personalizados que harán falta más adelante.
Install TensorFlow (3)
Este código ejecuta las dos versiones de Python, la correspondiente a la 1.14 y 2.0rc4 en el caso de grpcio lo instalamos previamente ya que va a ser usado por ambas versiones de TensorFlow y además necesita una configuración especial para no producir un error durante la instalación.
Install TensorFlow 1 para Python 3.7 (3.1)
La versión Ubuntu de RaspberryPi Buster incorpora la versión 3.8 de Python pero la última versión disponible de TensorFlow 1.x (1.4) solo funciona con Python 3.7 que no se puede instalar a través de los repositorios oficiales de Ubuntu, por lo que configuramos un repositorio alternativo (3.1) donde se encuentran versiones de Python para varias versiones de Ubuntu.
Instalamos los mismos paquetes Python que hemos instalado para la versión 3.8 pero en este caso para la versión 3.7 usando el repositorio anterior y copiamos el paquete de TensorFlow 1.4 (3.1) para poder instalarlo, el paquete lo podemos compilar o cogerlo de aquí.
Install Tensorflow 2 for Python 3.8
En el caso de TensorFlow 2 solo tenemos que copiar (3.2) la versión correspondiente que podemos copiarla del mismo repositorio anterior o compilarla como se describe aquí.
TensorFlow 2.x
La configuración de Docker sería muy similar a la anterior, simplemente quitamos la parte relacionada con TensorFlow 1.x
FROM ubuntu:latest
# 1. Environment vars
ARG DEBIAN_FRONTEND=noninteractive
ARG TZ=Europe/Madrid
ENV TZ=$TZ
ENV NODE_OPTIONS=--max-old-space-size=768
# 2. Install packages
# 2.1 Update system and install Jupyter
RUN apt-get update && apt-get -y upgrade && \
apt-get install -y --no-install-recommends libhdf5-dev && \
apt-get install -y --no-install-recommends tzdata && \
apt-get install -y --no-install-recommends libzbar-dev libzbar0 && \
apt-get install -y --no-install-recommends build-essential python3-pip python3-dev python3-venv && \
apt-get install -y --no-install-recommends git && \
apt-get install -y --no-install-recommends software-properties-common && \
python3 -m pip install --upgrade virtualenv && \
python3 -m pip install --upgrade wheel && \
python3 -m pip install --upgrade ipykernel && \
python3 -m pip install --upgrade pip && \
python3 -m pip install --upgrade setuptools && \
# 2.2 Build git extension
python3 -m pip install jupyter && \
apt-get install -y --no-install-recommends nodejs && \
apt-get install -y --no-install-recommends npm && \
python3 -m pip install jupyterlab && \
python3 -m pip install --upgrade jupyterlab-git && \
jupyter lab build --minimize=False && \
# 2.3 Clean
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /tmp/*
# 3 Install TensorFlow
RUN python3 -m pip install --no-cache-dir --force-reinstall grpcio
COPY tensorflow-2.4.0rc0-cp38-none-linux_armv7l.whl ./
RUN python3 -m pip install tensorflow-2.4.0rc0-cp38-none-linux_armv7l.whl
# 4. Add Jupyter user
RUN adduser --disabled-password --gecos '' jupyter
RUN adduser jupyter sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER jupyter
WORKDIR /home/jupyter/
RUN chmod a+rwx /home/jupyter/
# 5. Folder to download git files
RUN mkdir /home/jupyter/notebooks
# 6. Execute jupyter
CMD ["jupyter", "lab", "--port=8888", "--no-browser", "--ip=0.0.0.0", "--allow-root", "--notebook-dir=/home/jupyter/notebooks", "--NotebookApp.token=''", "--NotebookApp.password=''"]
Compilación
La compilación no tiene ninguna novedad, en este caso el proceso es mucho más largo y para la configuración con dos versiones de TensorFlow puede llevar entre 8-10 horas en una Raspberry Pi 3.
docker image prune -f
docker image build --tag user/image_name .
Ejecución
La ejecución tampoco tiene modificaciones.
docker container run --init -p 8888:8888 --detach --volume /home/pi/jupyter:/home/jupyter/notebooks id_imagen
