Jupyter


Inicialmente serían algunas notas sobre la configuración y uso de Jupyter Lab, pero se amplió a los notebooks en sí y algunas cosas más. Entonces pensé en generalizar esto con algo dedicado al completo ecosistema del proyecto Jupyter.


Índice

Introducción

  1. Instalación y actualización
  2. Uso
    1. Arranque
    2. Notas diversas
    3. Kernels
    4. VS Code
  3. Troubleshooting

Referencias


Introducción

El Proyecto Jupyter1 nació del proyecto IPython. A medida que el proyecto evolucionó, el concepto giró y giró, hasta convertirse en algo que podía soportar múltiples lenguajes. Hoy, creo yo, es ya una tecnología. Como recordatorio, el nombre Jupyter es un acrónimo indirecto de los tres lenguajes principales para los que fue diseñado: JUlia, PYThon y R.

Jupyter Lab es la evolución del proyecto en un entorno de desarrollo interactivo basado en web para libretas, código y datos de Jupyter. Además es extensible y modular mediante complementos que se agregan o se integran con los ya existentes, o a nuevos componentes que han venido apareciendo.

1. Instalación y actualización

Para instalar Jupyter Lab, empleando, por ejemplo, pip o conda:

$ pip install jupyterlab

o

$ conda install jupyterlab


2. Uso

Aquí, algunas notas en cuanto al uso o curiosidades de esta plataforma. Por el momento sin ningún orden o clasificación.

2.1. Arranque

Regularmente el navegador por defecto abrirá con la interfaz de inicio para Jupyter Notebook o Jupyter Lab, dependiendo como se invoque. Después de instalarlo bastará ejecutar cada uno de estos, respectivamente, desde la línea de comando con jupyter notebook o jupyter lab para levantar un web server que por defecto atiende las solicitudes en el puerto 8888. Al final del arranque, el web server mostrará las instrucciones para acceder al entorno de las libretas (los notebooks) mediante una dirección a acceder desde un navegador de Internet, por ejemplo:

To access the notebook, open this file in a browser:
file:///home/evasd/.local/share/jupyter/runtime/nbserver-101-open.html
Or copy and paste one of these URLs:
http://localhost:8888/?token=e8605db6f3f7ffc1143ffe7e29ac40a02f9f5592479fddfb
or http://127.0.0.1:8888/?token=e8605db6f3f7ffc1143ffe7e29ac40a02f9f5592479fddfb

Usualmente, se activará el browser y se abrirá la página principal de la interfaz de Jupyter pero hay ocasiones en las que en algunos sistemas operativos deben hacerse algunas acciones de configuración para que sea automático.

2.2. Notas diversas

2.2.1 Editando una libreta en dos vistas

Muy útil para comparar (lado a lado, side-by-side) resultados desplegados en diferentes celdas de un notebook. Click derecho sobre la pestaña (tab) para desplegar el menú contextual. Seleccionar New View for Notebook. Una nueva pestaña será abierta.

2.2.2. Renombrando una libreta

2.2.3. Como personalizar los atajos de teclado

2.2.4. ¿Password?

2.2.5. Indentando un bloque de código en una celda

Tab para indentar, Shift + Tab para «desindentar».

2.3. Kernels

Un kernel  es un programa que se encarga de ejecutar código. Por ejemplo IPython incluye un kernel para código Python, pero hay otros kernels disponibles para otros lenguajes. Para el caso de conda, ipykernel ya está incluido (de cualquier modo, lo indicado a continuación sirve para éste) pero no ocurre así con otros administradores (como virtualenv, por ejemplo).

2.3.1. Python

a) Para instalar un kernel, lo primero es contar el kernel propiamente, que se obtiene creando el correspondiente entorno (en los siguientes ejemplos «entorno» debe substituirse por el nombre del entorno que se quiere crear). Por ejemplo para virtualenv:

$ python virtualenv entorno -p python3

o en el caso de conda:

$ conda create -n entorno python=3.8

b) Dentro de dicho entorno (activándolo), se instala ipykernel; pip para virtualenv (como se muestra), pip o conda para (Ana|Mini)conda.

$ pip install ipykernel

c) Para que el kernel esté disponible dentro de Jupyter, se debe registrarlo (en este ejemplo, sólo para el usuario actual):

$ python -m ipykernel install --user --name entorno --display-name "el nombre de mi entorno"

Finalmente, para remover un kernel, por ejemplo:

$ ipython kernel remove nombre-del-kernel

2.3.2. R

Aunque he visto varias referencias señalando que un kernel de R puede ser instalado haciendo uso de Conda en un entorno virtual, lo cierto es que por el momento ninguna me ha funcionado. Por otra parte, creo que si debe haber un sitio del cual se deba descargar un kernel de R debe ser de este proyecto. Así que por el momento, ya sea desde la consola de R Studio o desde la consola de R activada desde la línea de comando:

  1. Se instala el kernel de R con el comando: install.packages("IRkernel")
  2. Se registra el kernel ante Jupyter: IRkernel::installspec(). Esta acción requiere que previamente se haya instalado Jupyter en el entorno de Python que se estará usando (puede ser a nivel del sistema, del usuario o de un entorno virtual; ver página de R de este sitio para detalles sobre posibles mensajes de error en este comando).

Después de esto el kernel de R deberá estar disponible para crear notebooks en Jupyter.

2.3.4. Julia

2.3.5. Otros kernels

2.3.6 Remoción de kernels

En general, la remoción de un kernel es en orden inverso a como se llevo a cabo la instalación. Así, en el entorno donde se va a eliminar el kernel hacer:

  1. Revisar los kernels instalados para validar el nombre del que se desinstalará: jupyter kernelspec list
  2. Usar jupyter kernelspec remove <kernel_name> o jupyter kernelspec uninstall <kernel_name> para deregistrar el kernel de Jupyter.

Para el caso de que se trate de un kernel de R, adicionalmente, en la consola de R: remove.packages("IRkernel").

2.4. Visual Studio Code

VS Code permite ejecutar Jupyter notebooks con la ayuda de algunas extensiones5.


3. Troubleshooting

Esta es (por el momento) una recopilación de algunos errores o dificultades que se han experimentado de primera mano durante la instalación y uso del ecosistema de Jupyter Lab. Cada entrada se identifica por el mensaje de error o condición del problema, seguida por la descripción y posible solución.

Jupyter Lab no arranca (pese a estar instalado) o «Connection refused» es presentado en el browser.

Ya me pasó que, pese a estar instalado, en la primer invocación, el entorno no arrancó. Algunas cosas que he hecho cuando se ha presentado esto son:

Volver a intentarlo
Sip, aunque parezca la «típica solución de usuario», antes de ponerse a arreglar algo que no necesita arreglo, conviene hacer una segunda prueba, pero razonada. Esto me ha ocurrido cuando, por ejemplo: El browser detecta que no es el navegador por defecto y pregunta si quiere cambiarse esto. Al parecer esto rompe alguna secuencia de acciones y ni el servidor ni el cliente responden. Ya sea que se conteste sí o no la pregunta, al segundo intento puede haber una respuesta.
Reiniciar el equipo
Sip, otra típica solución de usuario, pero puede funcionar.

«No browser found«

Este mensaje aparece al intentar arrancar el servicio. La consola mostrará:

$ jupyter lab
...
[I 11:01:01.109 LabApp] The Jupyter Notebook is running at:
[I 11:01:01.109 LabApp] http://localhost:8888/?token=e8605db6f3f7ffc1143ffe7e29ac40a02f9f5592479fddfb
[I 11:01:01.111 LabApp] or http://127.0.0.1:8888/?token=e8605db6f3f7ffc1143ffe7e29ac40a02f9f5592479fddfb
[I 11:01:01.113 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 11:01:01.124 LabApp] No web browser found: could not locate runnable browser.
...

Una posible causa es que no esté indicado cuál es el navegador a abrir por defecto, que puede ser también causado por la ausencia del archivo de configuración. Si no existe este archivo, éste puede crearse con:

$ jupyter lab --generate-config
Writing default config to: /home/evasd/.jupyter/jupyter_notebook_config.py

Dentro de éste buscar la sección correspondiente al comentario:

## Specify what command to use to invoke a web browser when opening the notebook

y en ella, escribir lo necesario para abrir el navegador favorito, por ejemplo habilitar Google Chrome en Windows:

import webbrowser
webbrowser.register('chrome', None, webbrowser.GenericBrowser('/c/"Program Files (x86)/Google/Chrome/Application/chrome.exe"'))
webbrowser.open('http://localhost:8888')
c.NotebookApp.browser = 'chrome'

es posible que en el sistema operativo se requiera de una variable de ambiente, por ejemplo para Google Chrome en Windows con WLS:

export BROWSER="/c/Program Files (x86)/Google/Chrome/Application/chrome.exe"

(test) lalo@EDUARDO7737:~$ export BROWSER=»/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe»
(test) lalo@EDUARDO7737:~$ «$BROWSER»

import webbrowser
webbrowser.register('edge', None, webbrowser.GenericBrowser('/mnt/c/Program\ Files\ \(x86\)/Microsoft/Edge/Application/msedge.exe'))
webbrowser.open('http://localhost:8888')
c.NotebookApp.browser = 'edge'

«Jupyter Lab not found«

Al tratar de arrancar el servicio, se presenta el error mostrado abajo, ya sea porque algo quedó mal en la instalación o porque no está instalado.

$ jupyter lab
Traceback (most recent call last):
File "/home/evasd/miniconda3/envs/evamodels/bin/jupyter", line 10, in <module>
sys.exit(main())
File "/home/evasd/miniconda3/envs/evamodels/lib/python3.6/site-packages/jupyter_core/command.py", line 230, in main
command = _jupyter_abspath(subcommand)
File "/home/evasd/miniconda3/envs/evamodels/lib/python3.6/site-packages/jupyter_core/command.py", line 133, in _jupyter_abspath
'Jupyter command `{}` not found.'.format(jupyter_subcommand)
Exception: Jupyter command `jupyter-lab` not found.

Se corrige (re)instalando la aplicacion (ver Instalación y actualización).

«Connection lost» o sesiones de terminal no cerradas (colgadas)

Los problemas de conexión son comunes cuando se está trabajando remotamente a donde reside el servidor de Jupyter Lab (como es el caso de SageMaker); especialmente cuando se trabaja con terminales. Cualquier intermitencia o retraso en la red puede hacer que las sesiones de terminal se cierren, dejando el proceso colgado. Dos forma de lidiar con este problema son (en orden preferente):

  • Retomar la sesión desde Jupyter.
  • Matar los procesos de terminales colgadas.

«IOPub data rate exceeded«

La consola muestra el mensaje de error:

[W 2021-12-04 17:34:11.033 ServerApp] IOPub data rate exceeded.
The Jupyter server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--ServerApp.iopub_data_rate_limit`.

seguido de los valores actuales en la configuración. Esto puede ser provocado, por ejemplo, por una celda con el código:

with open('NLP_task_data.txt') as f:
    lines = f.readlines()
    print(lines)

Esto puede ser arreglado declarando en el archivo de configuración el parámetro ServerApp.iopub_data_rate_limit. El mencionado archivo de configuración puede no existir. Se crea con:

$ jupyter lab --generate-config

y una vez generado puede buscarse el parámetro mencionado, que seguramente aparecerá comentado. Descomentarlo y ajustar el valor de ser necesario. Una alternativa, si no se quiere generar el archivo de configuración y trabajar con los parámetros por defecto, es indicar este valor en la línea de comando con el valor requerido, e.g.:

$ jupyter lab --ServerApp.iopub_data_rate_limit 1e10

«ERROR: No matching distribution found for jupyterlab»

Al tratar de instalar Jupyter Lab haciendo uso de pip aparecen mensaje de advertencia y error (aunque con el comando conda funciona la instalación):

(conda-env) user@machine:~$ pip install jupyterlab
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f769fec9760>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/jupyterlab/
...
ERROR: Could not find a version that satisfies the requirement jupyterlab (from versions: none)
ERROR: No matching distribution found for jupyterlab

Aunque hay varias soluciones a problemas que parecen similares, que van desde la configuración de elementos de red en el sistema operativo donde se ejecuta el comando hasta elementos de red o seguridad entre sistema operativo huésped y anfitrión (por ejemplo, una distribución linux dentro de WSL), la solución más simple y efectiva ha sido ejecutar en un prompt de MS-DOS:

C:\> wsl --update 

«error: command ‘gcc’ failed: No such file or directory»

Al tratar de instalar el paquete jupyterlab (o algún otro de Python), una serie de mensajes de error aparecen mostrando:

(conda-env) user@machine:~$ pip install jupyterlab
Collecting jupyterlab
  Downloading jupyterlab-3.6.3-py3-none-any.whl (8.9 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.9/8.9 MB 12.4 MB/s eta 0:00:00
...
copying psutil/tests/__main__.py -> build/lib.linux-aarch64-cpython-39/psutil/tests
      running build_ext
      building 'psutil._psutil_linux' extension
      creating build/temp.linux-aarch64-cpython-39
      creating build/temp.linux-aarch64-cpython-39/psutil
      gcc -pthread -B /home/lalo/miniconda3/envs/test/compiler_compat -Wno-unused-result -Wsign-compare -DNDEBUG -O2 -Wall -fPIC -O2 -isystem /home/lalo/miniconda3/envs/test/include -I/home/lalo/miniconda3/envs/test/include -fPIC -O2 -isystem /home/lalo/miniconda3/envs/test/include -fPIC -DPSUTIL_POSIX=1 -DPSUTIL_SIZEOF_PID_T=4 -DPSUTIL_VERSION=595 -DPy_LIMITED_API=0x03060000 -DPSUTIL_ETHTOOL_MISSING_TYPES=1 -DPSUTIL_LINUX=1 -I/home/lalo/miniconda3/envs/test/include/python3.9 -c psutil/_psutil_common.c -o build/temp.linux-aarch64-cpython-39/psutil/_psutil_common.o
      psutil could not be installed from sources because gcc is not installed. Try running:
        sudo apt-get install gcc python3-dev
      error: command 'gcc' failed: No such file or directory
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for psutil
Failed to build psutil
ERROR: Could not build wheels for psutil, which is required to install pyproject.toml-based projects

Podrá observarse que como causa raíz el problema es la ausencia del compilador de C (marcado en rojo). La línea previa a ésta indica la forma de hacerse de él e instalarlo para el caso de Ubuntu. Si el uso de dicho comando (sudo apt-get install gcc python3-dev) también llegara a marcar un error, posiblemente sugiera también alguna alternativa (como podría ser sudo apt-get install --fix-missing gcc python3-dev). Antes de recurrir a ello se sugiere primer probar con sudo apt-get update, luego volver a intentar la instalación del compilador de C y finalmente instalar jupyterlab de ya no haber errores.


Referencias

  1. «Project Jupyter«, jupyter.org, web. Visited: 2020.05.12. URL: https://jupyter.org/.
  2. Giannis Doukas, «Jupyter kernels«, github.com, web. Visited: 2020.05.13. URL: https://github.com/jupyter/jupyter/wiki/Jupyter-kernels.
  3. «Installation«, jupyter.org, web. Visited: 2020.05.12. URL: https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html.
  4. Jeff Hale, «How to Customize JupyterLab Keyboard Shortcuts«, towardsdatascience.com, web. Published: 2018.09.23; visited: 2020.05.12. URL: https://towardsdatascience.com/how-to-customize-jupyterlab-keyboard-shortcuts-72321f73753d.
  5. «Working with Jupyter Notebooks in Visual Studio Code«, visualstudio.com, web. Visited: 2020.05.21. URL: https://code.visualstudio.com/docs/python/jupyter-support#_setting-up-your-environment/.
  6. «Jupyter Project Documentation«, jupyter.org, web. Visited: 2023.05.17. URL: https://docs.jupyter.org/en/latest/.

Entradas en el blog

  1. «The Jupyter ecosystem«, partes 1, 2, 3.
  2. «La vida detrás de un proxy«, URL: https://dredu.mx/2022/02/04/la-vida-detras-de-un-proxy/.

Twitter Wordpress eMail
© Todos los derechos reservados.
Dr. Eduardo René Rodríguez Avila
Creación: 2019.07.23
Última actualización: 2023.05.18
El contenido de este sitio puede ser copiado y reproducido libremente mientras no sea alterado y se cite su origen. Marcas y productos registrados son citados por referencia y sin fines de lucro o dolo. Todas las opiniones son a título personal del o los autores de éstas y, salvo sea expresado de otro modo, deben considerarse como registro y expresión de la experiencia de uso de aquello que es tratado. Para conocer más sobre la posición de privacidad y responsabilidad de lo que se presenta en este sitio web y como ha sido obtenido, consulte la declaración al respecto.