Środowisko

  • GNU / Linux (Fedora 25).
  • Środowisko Conda.
  • Python 3.6.1.
  • Numba 0.33.0 (NP112PE36_0).

Początkowa konfiguracja (działa dobrze)

Dwa pliki main.py i numbamodule.py:

main.py

Które odradza 2 procesy, aby uruchomić funkcję 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

Który definiuje prostą funkcję numba_function:

import numba


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

Mogę uruchomić skrypt main.py i zobaczyć oba procesy drukowanie:

$ 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...
[...]

Łamanie go.

Sposób, w jaki się złamę, jest trochę dziwne, ale to właśnie natknęłam się, gdy próbowałem zminimalizować powtarzalny przypadek testowy. Proszę, powiedz mi, czy możesz również odtwarzać te same zachowanie.

W main.py Właśnie dodam jeden z proponowanych (poniżej) importu po ostatnim imporcie Process Import (I.e

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):
# [...]

Następnie jeden proces może zablokować funkcję execute_numba (w szczególności w połączeniu 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...
[...]

Dla mnie, matplotlib i Pyro4 Import "Pracuj" najlepsze. Nie mogę nawet zdobyć bloku 100% biegów ...: - /

Zauważ, że po prostu dodam pojedynczą linię importową, nie używam opakowania. Niektóre inne imporę zewnętrzne powodują również blok, ale odkryłem, że te proponowane powyżej "pracą" najlepiej (najwyżej zablokuj).

Co się dzieje?

Przede wszystkim możesz rozmnażać tym samym zachowaniem? (Specjalnie zainteresowany niewirtualizowanym GNU / Linux Maszyny)

Nie wiem, jak debugować to lub dlaczego to się stanie. Jakieś pomysły?

Fakt, że dodanie jednego losowego {X0}} uruchamia, że blok przeraża mnie i nie ma dla mnie niewielkiego sensu. Czy to może być zależne od czasów / opóźnień i dlatego niektórzy import przełamuje go i niektórzy nie robią?

Uwagi

  • Jak widać, nie ma Traceback, proces tylko blokuje.
  • Jeśli wyjmę import numba i @numba.jit z numbamodule.py, to zawsze będzie działać, więc może ma coś wspólnego z Numbą?
  • Mogę reprodukować takie samo zachowanie ze starszymi wersjami NUMBA / Python. Wypróbowany z numbą 0,25.0 i 0,22.1 (zarówno z Python 3.5.3).

Aktualizacje

  • 2017-07-03: Wystarczy jasne, nie szukam obejścia (już mam jeden w prawdziwym kodzie). Jestem autentycznie zainteresowany wiedząc, jak postępować w takim przypadku. Rozumiem, co się dzieje i nauczyć się debugować i znaleźć problem, aby zgłosić go, jeśli jest to uszkodzony pakiet / budowanie / środowisko. Jak byś kontynuował?
  • 2017-07-10: Blok występuje w szczególności w połączeniu import_module().
  • 2017-07-11: Numba Problem potwierdzony.
18
Peque 26 czerwiec 2017, 19:41

3 odpowiedzi

Najlepsza odpowiedź

Wydaje się, że to błąd Numba, potwierdzony w Wydanie 2431.

Wydaje się, że jest teraz naprawiony. Jeśli wpadniesz na to, zaktualizuj instalacje numba i llvmlite. Jeśli to nie rozwiązuje problemu, prawdopodobnie powinieneś dodać komentarz w tej kwestii, aby go ponownie otworzyć.

Jak @stuartarchid skomentował:

[...] Wygląda na to, że jeden przetworzony jest zablokowany, jest to, że w rzeczywistym fakcie SIMFASHULDED [...]

[...] Segfaults pojawiające się z tej lokalizacji są prawie zawsze z powodu wątków wykonujących współbieżne operacje wewnątrz LLVM lub jakiś problem z instalacją funkcji podczas sekwencji inicjalizacji Numby. [...]

[...] Nie można powtórzyć więcej za pomocą llvmlite==0.22.0dev0 i numba==0.37.0.dev [...]

1
Peque 13 maj 2018, 21:02

Oto reprodukcja na oficjalnym środowisku Docker Python. Dockerfile następuje (umieść wzdłuż plików .py).

FROM python:3.5

RUN pip install numba matplotlib pyro4

ADD . /opt
WORKDIR /opt

CMD python main.py

Następnie:

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

Obie działają w ten sam sposób, bez importu "roboczego", matplotlib i Pyro4 i z nimi w main.py.

-1
saaj 3 lipiec 2017, 08:47

Dotyczy to tylko debugowania MatplOTLIB i naprawdę odgaduje, ale może ci trochę pomóc zawęzić problem.

Możesz uruchomić swój program, w tym MATPOTLIB, z:

python main.py --verbose-helpful

Który pokazuje, że debugowanie wyjścia na inicjalizacji MATPOTLIB. Ponieważ brzmiało to jak problem, który jest obecny tylko w danym systemie, może istnieć pewna kwestia konfiguracji z MATPOTLIBRC skonfigurowana w taki sposób, że rozpoczyna się w trybie interaktywnym.

Oto przegląd dostępnych trybów debugowania: https://matplotlib.org/users/customizing.html

0
devnull 10 lipiec 2017, 07:54