joblib 的一个最小示例在所有 4 个内核上运行,另一个仅在一个内核上运行。使固定?
One minimal example of joblib runs on all 4 cores another only on one. Fix?
我正在尝试在我的机器学习算法实现中使用一些并行计算,使用 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。
你可以在那里找到答案:
接受的答案解释得很好。
根据我的理解,您的第二个示例 pool(testfunc() for _ in range(niter))
returns 函数可以传递给多进程之前的结果。
我正在尝试在我的机器学习算法实现中使用一些并行计算,使用 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。
你可以在那里找到答案:
接受的答案解释得很好。
根据我的理解,您的第二个示例 pool(testfunc() for _ in range(niter))
returns 函数可以传递给多进程之前的结果。