tutorial prange python numba

python - prange - numba tutorial



Bloque multiproceso extraño que importa la función Numba (3)

Ambiente

  • GNU / Linux (Fedora 25).
  • Conda entorno.
  • Python 3.6.1.
  • Numba 0.33.0 (np112py36_0).

Configuración inicial (funciona bien)

Dos archivos main.py y numbamodule.py :

main.py

Que genera 2 procesos para ejecutar la función execute_numba .

import time from importlib import import_module from multiprocessing import Process def execute_numba(name): # Import the function importfunction = ''numbamodule.numba_function'' module = import_module(importfunction.split(''.'')[0]) function = getattr(module, importfunction.split(''.'')[-1]) while True: print(str(name) + '' - executing Numba function...'') # Execute the function function(10) time.sleep(0.1) if __name__ == ''__main__'': processes = [Process(target=execute_numba, args=(i,)) for i in range(2)] [p.start() for p in processes] time.sleep(1) [p.terminate() for p in processes]

numbamodule.py

Lo que define una función simple numba_function :

import numba @numba.jit() def numba_function(x): total = 0 for i in range(x): total += i return total

Puedo ejecutar el script main.py y ver la impresión de ambos procesos:

$ python main.py 0 - executing Numba function... 1 - executing Numba function... 0 - executing Numba function... 1 - executing Numba function... 0 - executing Numba function... 1 - executing Numba function... [...]

Rompiendolo

La forma en que lo rompo es un poco extraño, pero esto es lo que encontré al intentar minimizar un caso de prueba reproducible. Por favor, dime si puedes reproducir el mismo comportamiento también.

En main.py acabo de agregar una de las importaciones propuestas (abajo) después de la última importación del Process (es decir, descomentar una línea y probar):

import time from importlib import import_module from multiprocessing import Process # # Adding one of the import lines bellow results in a block... # (you may need to install the packages first in the virtual environment) # #import matplotlib #import Pyro4 #import scipy #import dill def execute_numba(name): # [...]

Entonces, un proceso puede bloquear en la función execute_numba (en particular en la llamada import_module() ):

$ python main.py 1 - executing Numba function... 1 - executing Numba function... 1 - executing Numba function... 1 - executing Numba function... 1 - executing Numba function... 1 - executing Numba function... [...]

Para mí, matplotlib y Pyro4 importan "trabajar" mejor. Ni siquiera puedo conseguir el bloque al 100% de las carreras ...: - /

Tenga en cuenta que simplemente estoy agregando una sola línea de importación, no utilizando el paquete. Algunas otras importaciones externas también dan como resultado un bloqueo, pero he encontrado que las que se proponen más arriba "funcionan" mejor (las que más bloquean).

¿Que esta pasando?

En primer lugar, ¿puedes reproducir el mismo comportamiento? (Especialmente interesado en máquinas GNU / Linux no virtualizadas)

No sé cómo depurar esto o por qué podría estar sucediendo esto. ¿Algunas ideas?

El hecho de que agregar una import xxx aleatoria import xxx active el bloqueo me asusta y no tiene mucho sentido para mí. ¿Podría esto depender del tiempo / demoras y es por eso que algunas importaciones lo rompen y otras no?

Notas

  • Como puede ver, no hay rastreo, el proceso simplemente se bloquea.
  • Si import numba la import numba y @numba.jit de numbamodule.py , entonces siempre funcionará, ¿así que tal vez tenga algo que ver con Numba?
  • También puedo reproducir el mismo comportamiento con versiones anteriores de Numba / Python. Probado con Numba 0.25.0 y 0.22.1 (ambos con Python 3.5.3).

Actualizaciones

  • 2017-07-03: Solo para dejarlo claro, no estoy buscando una solución (ya tengo una en el código real). Estoy realmente interesado en saber cómo proceder en un caso como este. Entienda lo que está sucediendo y aprenda cómo depurar y encontrar el problema para informar si es un paquete / compilación / entorno dañado. ¿Cómo procederías?
  • 2017-07-10: El bloqueo ocurre en particular en la llamada import_module() .
  • 2017-07-11: Numba problema reconocido .

Aquí está la reproducción en el ambiente oficial de Python Docker. Dockerfile sigue (ponga a lo largo de sus archivos .py ).

FROM python:3.5 RUN pip install numba matplotlib pyro4 ADD . /opt WORKDIR /opt CMD python main.py

Entonces:

docker build -t so-44764520 . docker run --rm -it so-44764520

Ambos funcionan de la misma manera, sin las importaciones "de trabajo", matplotlib y Pyro4 , y con ellos en main.py


Esto solo se aplica a la depuración de matplotlib y realmente está adivinando pero podría ayudarlo un poco a reducir el problema.

Puedes iniciar tu programa, al incluir matplotlib, con:

python main.py --verbose-helpful

que muestra la salida de depuración en la inicialización de matplotlib. Dado que sonaba como un problema que solo está presente en su sistema en particular, puede haber algún problema de configuración con matplotlibrc configurado de tal manera que se inicie en modo interactivo.

Aquí hay una descripción general de los modos de depuración disponibles: https://matplotlib.org/users/customizing.html


Parece que fue un error Numba, reconocido en el número 2431 .

Parece estar arreglado ahora. Si te topas con esto, actualiza tus instalaciones numba y llvmlite . Si eso no soluciona el problema, probablemente debería agregar un comentario en ese problema para volver a abrirlo.

Como comentó @stuartarchibald:

[...] parece que uno de los procesados ​​está bloqueado, porque en realidad ha [...]

Los [...] Segfaults que aparecen en esta ubicación casi siempre se deben a subprocesos que realizan operaciones simultáneas dentro de LLVM, o algún problema relacionado con la instalación de funciones durante la secuencia de inicialización de Numba. [...]

[...] ya no puede reproducir con llvmlite==0.22.0dev0 y numba==0.37.0.dev [...]