【问题标题】:One minimal example of joblib runs on all 4 cores another only on one. Fix?joblib 的一个最小示例在所有 4 个内核上运行,另一个仅在一个内核上运行。使固定?
【发布时间】:2019-04-18 13:50:34
【问题描述】:

我正在尝试在我的机器学习算法实现中使用一些并行计算,使用joblib,尤其是this page 上使用的技术。 下面的例子是为了让我理解并行性,我在我的 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,我使用 Anaconda 发行版中的 joblib 0.13.2 和 python 3.6.8。

【问题讨论】:

    标签: python parallel-processing multiprocessing joblib


    【解决方案1】:

    你可以在那里找到答案:
    what-does-the-delayed-function-do-when-used-with-joblib-in-python
    接受的答案得到了很好的解释。

    据我了解,您的第二个示例 pool(testfunc() for _ in range(niter)) 在函数可以传递给多进程之前返回结果。

    【讨论】:

      猜你喜欢
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多