Я использовал numba для многопроцессорной обработки.

Единственная проблема - numba перекомпилирует код для каждого процесса отдельно.

(Это не большая проблема, когда количество процессов равно количеству физических процессоров, но огромная, когда это не так!)

Есть ли способ заставить numba скомпилировать код один раз, а затем поделиться скомпилированными артефактами через границы процесса?

Пример -

from multiprocessing import Process
from time import time, sleep
from numba import njit


@njit
def child():
    pass


if __name__ == "__main__":
    ps = [Process(target=child) for _ in range(100)]
    for p in ps:
        p.start()
    s = time()
    for p in ps:
        p.join()
    print("compile time:", time() - s)
compile time: 19.10037922859192

Использование ЦП на всех ядрах привязано к @ 100%. Я пробовал numba cache = True, но мой код, к сожалению, не кэшируется.

/Users/dev/PycharmProjects/trading/tradingdo/strategy.py:91: NumbaWarning: Cannot cache compiled function "_strategy1" as it uses dynamic globals (such as ctypes pointers and large global arrays)
  @njit
1
Dev Aggarwal 14 Сен 2020 в 00:26

1 ответ

Лучший ответ

В системах с поддержкой fork() (Linux) это просто -

Просто скомпилируйте функцию один раз перед запуском процессов - это заставит numba кэшировать вывод компилятора, как обычно.

Но из-за магии копирования при записи fork этот кеш автоматически становится доступным для дочерних процессов!

Что не так ясно, так это то, как это сделать в системах без надлежащей поддержки fork(). Можно кеш numba замариновать?

from multiprocessing import Process
from time import time, sleep
from numba import njit


@njit
def child():
    pass


if __name__ == "__main__":
    child() # this will do it

    ps = [Process(target=child) for _ in range(100)]
    for p in ps:
        p.start()
    s = time()
    for p in ps:
        p.join()
    print("compile time:", time() - s)

compile time: 0.011722326278686523

Также стоит взглянуть на nogil от numba. Это может устранить необходимость в процессах, и потоки прекрасно совместно используют кеш компиляции numba.

1
Dev Aggarwal 14 Сен 2020 в 07:03