- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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/
我正在努力解决 joblib 问题。 我需要将推理应用程序推送到远程服务器,并且我还需要加载保存的标准缩放器,因为如果我尝试适应,我会收到内存不足异常。我无法对服务器进行物理更改,因为它是 sap c
我在 Docker 容器内的 Flask 应用程序中运行 joblib 以及由 supervisord 启动的 uWSGI(启动时启用线程)。 网络服务器启动显示如下错误: unable to loa
我正在尝试在 python 中使用并行计算包 joblib。我可以执行下面的例子并得到结果 Parallel(n_jobs=8)(delayed(sqrt)(i) for i in range(10)
这是我的代码: from math import sqrt from joblib import Parallel, delayed import multiprocessing def parall
我正在使用Python中joblib包中的Parallel函数。我只想使用此函数来处理我的函数之一,但不幸的是整个代码是并行运行的(除了其他函数)。 示例: from joblib import Pa
我正在努力学习 joblib模块作为 python 中内置 multiprocessing 模块的替代品。我习惯于使用 multiprocessing.imap 在可迭代对象上运行一个函数并返回结果。
我正在尝试使用 joblib 来并行化一个在函数上运行的循环。我希望显示函数的中间 print 命令,而不仅仅是函数的 return 值。 from joblib import Parallel, d
我想打乱 3D numpy 数组中的值,但前提是它们 > 0。 当我用单核运行我的函数时,它甚至比使用 2 个核快得多。这远远超出了创建新 python 进程的开销。我错过了什么? 以下代码输出: r
我的目标结构: 工具 model_maker.py 模特 模型在这里 我当前的代码,位于工具目录中 joblib.dump(pipeline, "../models/model_full_June20
是否可以使用 joblib.Memory 以线程安全的方式写入跨多个进程的公共(public)缓存。在什么情况下,这会失败或导致错误? 最佳答案 库首先写入临时文件,然后将临时文件移动到目的地。 So
我目前正在尝试实现 parallel for循环使用 joblib在 python 中 3.8.3 . 在 for 循环中,我想将一个类方法应用于一个类的实例,同时在另一个类中应用一个方法。 这是一个
我的代码看起来像这样: from joblib import Parallel, delayed # prediction model - 10s of megabytes on disk LARGE
from joblib import Parallel, delayed def func(v): temp.append(v) return temp = [] Parallel(n
有关于使用内存映射文件在 Joblib 中持久保存 Numpy 数组的良好文档。 在最近的版本中,Joblib(显然)会以这种方式自动保留和共享 Numpy 数组。 Pandas 数据帧也会被持久化,
我正在运行一个需要一段时间才能评估 16 次的函数。然而,所有这些运行都是相互独立的。因此我决定使用 joblib 来加速它。 Joblib 的工作方式就像它应该的那样并加快了速度,但我正在努力解决一
我正在使用 joblib 并行化我的 python 3.5 代码。 如果我这样做: from modules import f from joblib import Parallel, delaye
我正在使用 Random Forest Regressor python 的 scikit-learn 模块来预测一些值。我使用 joblib.dump 来保存模型。有 24 个 joblib.dum
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我想问同样的问题 Python 3: does Pool keep the original order of data passed to map?对于作业库。例如: Parallel(n_jobs
我需要在使用 Joblib 并行的函数中生成随机数。但是,从内核生成的随机数是完全相同的。 目前我通过为不同的核心分配随机种子来解决这个问题。有什么简单的方法可以解决这个问题吗? 最佳答案 这是预料之
我是一名优秀的程序员,十分优秀!