joblib.Parallel 如何处理全局变量?

Ale*_*are 6 python parallel-processing joblib

我的代码看起来像这样:

from joblib import Parallel, delayed

# prediction model - 10s of megabytes on disk
LARGE_MODEL = load_model('path/to/model')

file_paths = glob('path/to/files/*')

def do_thing(file_path):
  pred = LARGE_MODEL.predict(load_image(file_path))
  return pred

Parallel(n_jobs=2)(delayed(do_thing)(fp) for fp in file_paths)
Run Code Online (Sandbox Code Playgroud)

我的问题是是否LARGE_MODEL会在循环的每次迭代中进行腌制/取消腌制。如果是这样,我如何确保每个工作人员都缓存它(如果可能的话)?

Olu*_*ule 4

总长DR

父进程对大型模型进行一次腌制。通过确保大型模型是支持 memfile 的 numpy 数组,可以提高性能。工作人员可以load_temporary_memmap比从磁盘快得多。

您的工作是并行的并且可能正在使用joblibs._parallel_backends.LokyBackend.

在 中joblib.parallel.Parallel.__call__,joblib 尝试初始化后端以在设置为大于 1 的计数LokyBackend时使用。n_jobs

LokyBackend对同一Parallel对象使用共享临时文件夹。这与修改默认酸洗行为的减速器相关。

现在,LokyBackend配置MemmappingExecutor将此文件夹共享reducers.

如果您安装了 numpy并且您的模型是一个干净的numpy array,则保证使用ArrayMemmapForwardReducer将其作为 memmap 文件进行一次 pickle并从父进程传递到子进程。

否则,将使用默认的酸洗作为bytes对象进行酸洗。

您可以通过从 joblib 读取调试日志来了解您的模型在父进程中是如何被 pickle 的。

每个工作人员都会“解封”大型模型,因此在那里缓存大型模型确实没有意义。

您只能通过将模型支持为内存映射文件来改进工作程序中加载 pickle 大型模型的源。