Один минимальный пример joblib работает на всех 4 ядрах, другой только на одном. Фикс? - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь использовать некоторые параллельные вычисления в моей реализации алгоритмов машинного обучения, используя joblib, особенно технику, используемую на этой странице .Следующие примеры предназначены для понимания параллелизма. У меня та же проблема, что и во втором примере в моих алгоритмах ML.

Этот пример работает на всех 4 ядрах, как и ожидалось:

from joblib import Parallel, delayed

N_PARAM = 10000
N_TEST_FUN = 10000000

def testfunc(data):
    for _ in range(N_TEST_FUN):
        for i in data:
                i*i

def run(niter=10):
    data = [list(range(N_PARAM)) for _ in range(niter)]
    pool = Parallel(n_jobs=-1, verbose=1, pre_dispatch='all')
    results = pool(delayed(testfunc)(dd) for dd in data)

if __name__ == '__main__':
    run()

Хотяэтот пример работает только на 1:

from joblib import Parallel, delayed

N_PARAM = 10000
N_TEST_FUN = 10000000

def testfunc():
    for _ in range(N_TEST_FUN):
        for i in range(N_PARAM):
            i**2

def run(niter=10):
    pool = Parallel(n_jobs=-1, verbose=1, pre_dispatch="all")
    pool(testfunc() for _ in range(niter))

if __name__ == "__main__":
    run()

, чего я совсем не понимаю.Почему это так?

Я Ubuntu 18.10, я использую joblib 0.13.2 и python 3.6.8 из дистрибутива Anaconda.

1 Ответ

0 голосов
/ 19 апреля 2019

вы можете найти ответ там:
, что-ли-The-отсроченная функция-д-используемый-с-joblib-в-питон, когда
Принятый ответ хорошо объяснен.

Насколько я понимаю, ваш второй пример pool(testfunc() for _ in range(niter)) возвращает результат до того, как функция может быть передана в многопроцессорный режим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...