Post

Configuración del entorno de desarrollo para aprendizaje automático

Este artículo trata sobre cómo configurar un entorno de desarrollo para estudiar aprendizaje automático en una máquina local. Todo el contenido está escrito basado en Ubuntu 20.04 LTS con una tarjeta gráfica NVIDIA Geforce RTX 3070.

Resumen

Este artículo trata sobre cómo configurar un entorno de desarrollo para estudiar aprendizaje automático en una máquina local. Todo el contenido está escrito basado en Ubuntu 20.04 LTS con una tarjeta gráfica NVIDIA Geforce RTX 3070.

  • Pila tecnológica a configurar
    • Ubuntu 20.04 LTS
    • Python 3.8
    • pip 21.0.1
    • jupyter
    • matplotlib
    • numpy
    • pandas
    • scipy
    • scikit-learn
    • CUDA 11.0.3
    • cuDNN 8.0.5
    • Frameworks de aprendizaje profundo (se recomienda instalar solo uno por entorno)
      • PyTorch 1.7.1
      • TensorFlow 2.4.0

Tabla comparativa con la nueva guía de configuración del entorno de desarrollo para aprendizaje automático

Aunque han pasado unos 3 años y medio desde que se subió al blog, el contenido de este artículo sigue siendo válido en general, excepto por algunos detalles específicos como las versiones de los paquetes y el lanzamiento del controlador de código abierto de NVIDIA. Sin embargo, al comprar una nueva PC en el verano de 2024 y configurar el entorno de desarrollo, hubo algunos cambios, por lo que escribí una nueva guía de configuración del entorno de desarrollo. Las diferencias se muestran en la siguiente tabla:

DiferenciaEste artículo (versión 2021)Nuevo artículo (versión 2024)
Distribución LinuxBasado en UbuntuAplicable a Ubuntu, Fedora/RHEL/Centos,
Debian, openSUSE/SLES, etc.
Método de configuración del entornoEntorno virtual de Python usando venvEntorno basado en contenedores Docker
usando NVIDIA Container Toolkit
Instalación del controlador gráfico NVIDIA
Instalación directa de CUDA y cuDNN
en el sistema host
Sí (usando el gestor de paquetes Apt)No (se usa una imagen preinstalada proporcionada
por NVIDIA en Docker Hub,
por lo que no es necesario hacerlo manualmente)
PortabilidadSe debe reconstruir el entorno de desarrollo
cada vez que se migra a otro sistema
Basado en Docker, por lo que se puede construir
fácilmente una nueva imagen con el Dockerfile
creado cuando sea necesario, o portar fácilmente
una imagen existente (excluyendo configuraciones
adicionales de volumen o red)
Uso de bibliotecas de aceleración GPU
adicionales además de cuDNN
NoIntroducción de CuPy, cuDF, cuML, DALI
Interfaz de Jupyter NotebookJupyter Notebook (clásico)JupyterLab (Next-Generation)
Configuración del servidor SSHNo se trataIncluye configuración básica del servidor SSH en la parte 3

Si deseas utilizar un entorno virtual de Python como venv en lugar de Docker, este artículo original sigue siendo válido, así que puedes continuar leyéndolo. Si quieres disfrutar de las ventajas de adoptar contenedores Docker, como una alta portabilidad, o si planeas usar otra distribución Linux además de Ubuntu, como Fedora, o si estás usando un entorno con tarjeta gráfica NVIDIA y quieres utilizar bibliotecas de aceleración GPU adicionales como CuPy, cuDF, cuML, DALI, o si deseas acceder remotamente mediante configuraciones SSH y JupyterLab, te recomiendo consultar también la nueva guía.

0. Requisitos previos

  • Se recomienda usar Linux para estudiar aprendizaje automático. Aunque es posible en Windows, puede haber muchas pérdidas de tiempo en varios aspectos menores. Lo más conveniente es usar la última versión LTS de Ubuntu. Es conveniente porque los controladores propietarios también se instalan automáticamente, y como hay muchos usuarios, la mayoría de la documentación técnica está escrita basada en Ubuntu.
  • Generalmente, Python viene preinstalado en la mayoría de las distribuciones Linux, incluido Ubuntu. Sin embargo, si Python no está instalado, debes instalarlo antes de seguir este artículo.
  • Si planeas estudiar aprendizaje automático en una máquina local, es bueno tener al menos una GPU. Aunque el preprocesamiento de datos es posible con CPU, la diferencia en la velocidad de entrenamiento entre CPU y GPU es abrumadora a medida que aumenta el tamaño del modelo (especialmente en el caso del aprendizaje profundo).
    • Para el aprendizaje automático, la opción de fabricante de GPU es prácticamente una: debes usar productos NVIDIA. NVIDIA es una empresa que ha invertido mucho en el campo del aprendizaje automático, y casi todos los frameworks de aprendizaje automático utilizan la biblioteca CUDA de NVIDIA.
    • Si planeas usar GPU para aprendizaje automático, primero debes verificar si el modelo de tarjeta gráfica que planeas usar es compatible con CUDA. Puedes verificar el nombre del modelo de GPU instalado en tu computadora actual con el comando uname -m && cat /etc/*release en la terminal. Busca el nombre del modelo correspondiente en la lista de GPU en el enlace y verifica el valor de Compute Capability. Este valor debe ser al menos 3.5 para poder usar CUDA.
    • Los criterios de selección de GPU están bien resumidos en el siguiente artículo. El autor actualiza continuamente el artículo.
      Which GPU(s) to Get for Deep Learning
      A Full Hardware Guide to Deep Learning escrito por la misma persona también es muy útil. La conclusión del artículo anterior es la siguiente:

      The RTX 3070 and RTX 3080 are mighty cards, but they lack a bit of memory. For many tasks, however, you do not need that amount of memory.
      The RTX 3070 is perfect if you want to learn deep learning. This is so because the basic skills of training most architectures can be learned by just scaling them down a bit or using a bit smaller input images. If I would learn deep learning again, I would probably roll with one RTX 3070, or even multiple if I have the money to spare. The RTX 3080 is currently by far the most cost-efficient card and thus ideal for prototyping. For prototyping, you want the largest memory, which is still cheap. With prototyping, I mean here prototyping in any area: Research, competitive Kaggle, hacking ideas/models for a startup, experimenting with research code. For all these applications, the RTX 3080 is the best GPU.

Si cumples con todos los requisitos mencionados anteriormente, comencemos a configurar el entorno de trabajo.

1. Creación del directorio de trabajo

Abre la terminal y modifica el archivo .bashrc para registrar la variable de entorno (el comando está después del prompt $).
Primero, abre el editor nano con el siguiente comando (puedes usar vim u otro editor si lo prefieres):

1
$ nano ~/.bashrc

Agrega el siguiente contenido en la última línea. Puedes cambiar el contenido entre comillas dobles a otra ruta si lo deseas.
export ML_PATH="$HOME/ml"

Presiona Ctrl+O para guardar y luego Ctrl+X para salir.

Ahora ejecuta el siguiente comando para aplicar la variable de entorno:

1
$ source ~/.bashrc

Crea el directorio:

1
$ mkdir -p $ML_PATH

2. Instalación del gestor de paquetes pip

Hay varias formas de instalar los paquetes de Python necesarios para el aprendizaje automático. Puedes usar una distribución de Python científico como Anaconda (método recomendado para el sistema operativo Windows), o puedes usar pip, la herramienta de empaquetado propia de Python. Aquí usaremos el comando pip en el shell bash de Linux o macOS.

Verifica si pip está instalado en tu sistema con el siguiente comando:

1
2
3
4
5
6
$ pip3 --version

No se pudo encontrar el comando 'pip3'. Sin embargo, se puede instalar con:

sudo apt install python3-pip

Si aparece algo así, significa que pip no está instalado en tu sistema. Instálalo usando el gestor de paquetes del sistema (aquí apt) (si aparece un número de versión, significa que ya está instalado, así que omite este comando):

1
$ sudo apt install python3-pip

Ahora pip está instalado en tu sistema.

3. Creación de un entorno virtual independiente (recomendado)

Para crear un entorno virtual (para evitar conflictos con las versiones de bibliotecas de otros proyectos), instala venv:

1
$ sudo apt install python3-venv

Luego, crea un entorno Python independiente de la siguiente manera. Esto se hace para evitar conflictos entre las versiones de bibliotecas necesarias para cada proyecto, así que debes crear un nuevo entorno virtual cada vez que inicies un nuevo proyecto para establecer un entorno independiente.

1
2
$ cd $ML_PATH
$ python3 -m venv --system-site-packages ./(nombre del entorno)

Para activar este entorno virtual, abre una terminal y ingresa el siguiente comando:

1
2
$ cd $ML_PATH
$ source ./(nombre del entorno)/bin/activate

Después de activar el entorno virtual, actualiza pip dentro del entorno virtual:

1
(env) $ pip install -U pip

Para desactivar el entorno virtual más tarde, usa el comando deactivate. Cuando el entorno está activado, cualquier paquete que instales con el comando pip se instalará en este entorno independiente y Python usará estos paquetes.

3′. (Si no creas un entorno virtual) Actualización de la versión de pip

Al instalar pip en el sistema, se descarga e instala un archivo binario del servidor espejo de la distribución (aquí Ubuntu), pero este archivo binario generalmente no es la última versión debido a actualizaciones lentas (en mi caso, se instaló la versión 20.3.4). Para usar la última versión de pip, ejecuta el siguiente comando para instalar (o actualizar si ya está instalado) pip en el directorio home del usuario:

1
2
3
4
5
$ python3 -m pip install -U pip

Collecting pip
(omitido)
Successfully installed pip-21.0.1

Puedes ver que pip se ha instalado en la versión 21.0.1, que es la última en el momento de escribir este artículo. En este punto, el pip instalado en el directorio home del usuario no es reconocido automáticamente por el sistema, por lo que debes registrarlo como una variable de entorno PATH para que el sistema lo reconozca y use.

Abre nuevamente el archivo .bashrc con un editor:

1
$ nano ~/.bashrc

Esta vez, busca la línea que comienza con export PATH=. Si no hay una ruta escrita después de eso, simplemente agrega el contenido como lo hiciste en el paso 1. Si hay otras rutas registradas existentes, agrega el contenido al final usando dos puntos:
export PATH="$HOME/.local/bin"
export PATH="(ruta existente):$HOME/.local/bin"

Actualizar el pip del sistema de una manera diferente al gestor de paquetes del sistema puede causar problemas debido a conflictos de versiones. Por eso instalamos pip por separado en el directorio home del usuario. Por la misma razón, es mejor usar el comando python3 -m pip en lugar del comando pip para usar pip cuando no estés dentro de un entorno virtual.

4. Instalación de paquetes para aprendizaje automático (jupyter, matplotlib, numpy, pandas, scipy, scikit-learn)

Instala todos los paquetes necesarios y otros paquetes conectados como dependencias con el siguiente comando pip.
En mi caso, uso el comando pip porque estoy usando venv, pero si no estás usando venv, se recomienda usar el comando python3 -m pip en su lugar, como se mencionó anteriormente.

1
2
3
4
5
6
(env) $ pip install -U jupyter matplotlib numpy pandas scipy scikit-learn

Collecting jupyter
  Downloading jupyter-1.0.0-py2.py3-none-any.whl (2.7 kB)
Collecting matplotlib
(omitido)

Si usaste venv, registra un kernel en Jupyter y dale un nombre:

1
(env) $ python3 -m ipykernel install --user --name=(nombre del kernel)

A partir de ahora, para ejecutar Jupyter, usa el siguiente comando:

1
(env) $ jupyter notebook

5. Instalación de CUDA & cuDNN

5-1. Verificación de las versiones necesarias de CUDA & cuDNN

Verifica las versiones de CUDA compatibles en la documentación oficial de PyTorch.
Verificación de la versión de CUDA compatible con PyTorch
Basado en PyTorch versión 1.7.1, las versiones de CUDA compatibles son 9.2, 10.1, 10.2, 11.0. Para las GPU NVIDIA serie 30, se requiere CUDA 11, por lo que podemos ver que necesitamos la versión 11.0.

También verifica las versiones de CUDA necesarias en la documentación oficial de TensorFlow 2.
Verificación de la versión de CUDA compatible con TensorFlow 2
Basado en TensorFlow versión 2.4.0, confirmamos que necesitamos CUDA versión 11.0 y cuDNN versión 8.0.

En mi caso, verifiqué las versiones de CUDA compatibles con ambos paquetes porque a veces uso PyTorch y otras veces TensorFlow 2. Debes verificar los requisitos del paquete que necesites y ajustarte a ellos.

5-2. Instalación de CUDA

Accede al Archivo de CUDA Toolkit y selecciona la versión que verificaste anteriormente. En este artículo, seleccionamos CUDA Toolkit 11.0 Update1.
CUDA 11.0 Update 1
Ahora selecciona la plataforma y el tipo de instalador correspondientes, y sigue las instrucciones que aparecen en la pantalla. En este punto, es preferible usar el gestor de paquetes del sistema para el instalador. Mi método preferido es deb (network).
Selección de plataforma CUDA
Instalación de CUDA

Ejecuta los siguientes comandos para instalar CUDA:

1
2
3
4
5
6
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
$ sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
$ sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
$ sudo apt update
$ sudo apt install cuda-toolkit-11-0 cuda-drivers

Si tienes buen ojo, habrás notado que la última línea es ligeramente diferente de las instrucciones que aparecen en la imagen. En la instalación de red, si solo ingresas cuda como se muestra en la imagen, se instalará la versión más reciente, 11.2, lo cual no es lo que queremos. Puedes ver varias opciones de metapaquetes en la Guía de instalación de CUDA 11.0 para Linux. Aquí, modificamos la última línea para instalar específicamente el paquete CUDA Toolkit versión 11.0 y permitir que el paquete de controladores se actualice automáticamente.

5-3. Instalación de cuDNN

Instala cuDNN de la siguiente manera:

1
2
$ sudo apt install libcudnn8=8.0.5.39-1+cuda11.0
$ sudo apt install libcudnn8-dev=8.0.5.39-1+cuda11.0

6. Instalación de PyTorch

Si creaste un entorno virtual en el paso 3, procede con el entorno virtual que planeas usar activado. Si no necesitas PyTorch, omite este paso.
Accede a la página de inicio de PyTorch y selecciona la compilación de PyTorch a instalar (Stable), el sistema operativo (Linux), el paquete (Pip), el lenguaje (Python) y CUDA (11.0), luego sigue las instrucciones que aparecen en la pantalla.
Instalación de PyTorch

1
(env) $ pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio===0.7.2 -f https://download.pytorch.org/whl/torch_stable.html

Para verificar si has instalado PyTorch correctamente, ejecuta el siguiente comando después de iniciar el intérprete de Python. Si se devuelve un tensor, has tenido éxito.

1
2
3
4
5
6
7
8
9
10
11
12
(env) $ python3
Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> x = torch.rand(5, 3)
>>> print(x)"
tensor([[0.8187, 0.5925, 0.2768],
        [0.9884, 0.8298, 0.8553],
        [0.6350, 0.7243, 0.2323],
        [0.9205, 0.9239, 0.9065],
        [0.2424, 0.1018, 0.3426]])

Para verificar si el controlador de GPU y CUDA están activados y disponibles, ejecuta el siguiente comando:

1
2
>>> torch.cuda.is_available()
True

7. Instalación de TensorFlow 2

Si no necesitas TensorFlow, ignora este paso.
Si instalaste PyTorch en un entorno virtual en el paso 6, desactiva ese entorno virtual, vuelve a los pasos 3 y 4 para crear y activar un nuevo entorno virtual, y luego procede. Si omitiste el paso 6, simplemente continúa.
Instala TensorFlow de la siguiente manera:

1
(env2) $ pip install --upgrade tensorflow

Para verificar si has instalado TensorFlow correctamente, ejecuta el siguiente comando. Si muestra el nombre de la GPU y devuelve un tensor, has tenido éxito.

1
2
3
4
5
6
(env2) $ python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

2021-02-07 22:45:51.390640: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0
(omitido)
2021-02-07 22:45:54.592749: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1406] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 6878 MB memory) -> physical GPU (device: 0, name: GeForce RTX 3070, pci bus id: 0000:01:00.0, compute capability: 8.6)
tf.Tensor(526.1059, shape=(), dtype=float32)
This post is licensed under CC BY-NC 4.0 by the author.

Comments powered by Disqus.