gpt4 book ai didi

python - Joblib 的 Loky 后端如何处理对全局变量的访问?

转载 作者:行者123 更新时间:2023-12-05 03:43:51 25 4
gpt4 key购买 nike

在 Joblib 中使用处理全局变量的函数时,可以从函数访问全局变量,而无需在 Linux 上进行任何复制。

我们可以在下面的脚本中进行测试:

import joblib
import numpy as np

print("Initializing global")
# Let's create a global that is big, so it takes time to create it
my_global = np.random.uniform(0,100, size=(10**4, 10**4))
print("done")

# A simple function working on the global variable
def fun_with_global():
return id(my_global)

print("starting // loop")
joblib.Parallel(n_jobs=3, backend="multiprocessing", verbose=100)((joblib.delayed(fun_with_global)() for i in range(1000)))
joblib.Parallel(n_jobs=3, backend="loky", verbose=100)((joblib.delayed(fun_with_global)() for i in range(1000)))
# We get that the two last parallel calls execute almost instantly, even for 1000 jobs.
# When we instead return id(my_global.copy()) in fun_with_global, here we see the copy operation is lengthy.

事实上,对 Parallel 的调用几乎是即时的,这意味着没有对全局变量进行 pickling/unpickling。

此行为实际上是后端相关的:

  • multiprocessing 后端来看,这是完全合乎逻辑的,因为 multiprocessing workers fork 了原始进程,这意味着全局变量 my_global 已经存在于 worker 内存中而不需要努力.
  • 来自 loky 后端,它在 documentation 中说明loky worker fork/exec,这意味着他们无法轻松访问此全局变量。

那么,Loky 如何在不创建副本或 fork 的情况下访问父进程的全局变量?

编辑:下面的示例仅适用于基于 numpy 数组的全局变量。使用另一个变量,会有不同的行为:

import joblib
import numpy as np
import pandas as pd
import time

print("Initializing global")
# This time, let's create a big variable, that is not based on np arrays
with open("/dev/urandom", "rb") as fd:
my_global = fd.read(10**9)
print("done")

def fun_with_global():
return id(my_global)

print("starting // loop")
joblib.Parallel(n_jobs=3, backend="multiprocessing", verbose=100)((joblib.delayed(fun_with_global)() for i in range(1000)))
joblib.Parallel(n_jobs=3, backend="loky", verbose=100)((joblib.delayed(fun_with_global)() for i in range(1000)))
# Here the multiprocessing backend still executes instantly, but the Loky backends is slow

最佳答案

其实Loky除了函数之外,还序列化了函数的全局变量,如我们所见here .所以这意味着所有使用的全局变量都通过序列化方法发送给工作人员。

此外,在上面的示例中观察到的对 Loky 后端的安装调用仅在 numpy 数组的情况下有效。在 numpy 数组的情况下,Loky 巧妙地映射了 numpy 数组,使数组立即传输到其他进程。当使用 numpy 数组以外的变量时,Loky 必须序列化和反序列化整个变量(不是 memmap 句柄),这会花费更多时间,如上面的第二个示例所示。

关于python - Joblib 的 Loky 后端如何处理对全局变量的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66605590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com