¿Cómo puedo evitar que `jupyter run` se agote?
Comenzar un kernel de Python Jupyter con
> ipython kernel
y luego ejecutar un script en una terminal separada usando
> jupyter run script.py --existing
resulta en un error de tiempo de espera después de aproximadamente 10 segundos:
Traceback (most recent call last):
File "/home/mason/.local/bin/jupyter-run", line 8, in <module>
sys.exit(RunApp.launch_instance())
File "/home/mason/.local/lib/python3.8/site-packages/jupyter_core/application.py", line 264, in launch_instance
return super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)
File "/home/mason/.local/lib/python3.8/site-packages/traitlets/config/application.py", line 846, in launch_instance
app.start()
File "/home/mason/.local/lib/python3.8/site-packages/jupyter_client/runapp.py", line 107, in start
reply = self.kernel_client.execute_interactive(code, timeout=OUTPUT_TIMEOUT)
File "/home/mason/.local/lib/python3.8/site-packages/jupyter_client/utils.py", line 26, in wrapped
raise e
File "/home/mason/.local/lib/python3.8/site-packages/jupyter_client/utils.py", line 23, in wrapped
return loop.run_until_complete(future)
File "/home/mason/.local/lib/python3.8/site-packages/nest_asyncio.py", line 81, in run_until_complete
return f.result()
File "/usr/lib/python3.8/asyncio/futures.py", line 178, in result
raise self._exception
File "/usr/lib/python3.8/asyncio/tasks.py", line 280, in __step
result = coro.send(None)
File "/home/mason/.local/lib/python3.8/site-packages/jupyter_client/client.py", line 515, in _async_execute_interactive
raise TimeoutError("Timeout waiting for output")
TimeoutError: Timeout esperando la salida
¿Cómo puedo evitar que esto ocurra? Intenté revisar el código de jupyter_client
y cambiar varias opciones de configuración de IPyKernel, pero no he tenido suerte. (Lo que estoy intentando hacer, en última instancia, es usar Jupyter/IPyKernel para volver a ejecutar rápidamente scripts de Python que dependen de módulos de inicialización lenta como PyTorch).
Para referencia, el único paquete Pip que necesité instalar para obtener este comportamiento fue ipykernel
, y el contenido de script.py
es
“`python
from time import sleep
for _ in range(20):
print('Aún en ejecución')
sleep(1)
“`
davy.ai
El error de tiempo de espera se produce porque el comando
jupyter run
espera que el kernel produzca resultados en un tiempo determinado. Como tu script tarda 20 segundos en producir cualquier resultado, se alcanza el límite de tiempo de espera y se genera el error.Una forma de solucionar esto sería aumentar el tiempo de espera. Puedes hacerlo pasando la bandera
--timeout
al ejecutarjupyter run
, de la siguiente manera:Esto aumentará el tiempo de espera a 30 segundos, que debería ser suficiente para que se ejecute tu script.
Otra opción sería modificar tu script para que produzca resultados más rápidamente. Por ejemplo, podrías agregar una declaración
print()
al comienzo del script para producir algunos resultados de inmediato, de la siguiente manera:Esto debería evitar que se produzca el error de tiempo de espera, ya que el script producirá resultados de inmediato.
Por último, si buscas ejecutar scripts rápidamente, puedes considerar el uso de una herramienta como
ipython
en lugar dejupyter run
.ipython
es una herramienta de línea de comandos que proporciona un entorno más liviano para ejecutar código Python. Puedes iniciar una sesión deipython
y ejecutar tu script de la siguiente manera:Esto ejecutará tu script sin problemas de tiempo de espera, ya que
ipython
no tiene configuraciones de tiempo de espera por defecto.