问题标签 [joblib]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 使用joblib仅缓存类的某些方法的正确方法
我正在编写一个类,它有一些计算量大的方法和一些用户想要迭代调整并且独立于计算的参数。
实际用途是用于可视化,但这里有一个卡通示例:
x
基本思想是用户可能希望创建具有相同但不同name
参数的此类的许多实例。我想允许用户提供一个joblib.Memory
对象来缓存计算部分,这样他们就可以“报告”许多不同的名称,而无需每次都重新计算平方数组。
(这有点奇怪,我知道。用户需要为每个名称使用不同的类实例的原因是他们实际上将与看起来像这样的接口函数进行交互。
但让我们暂时忽略它)。
在joblib 文档之后,我正在square
使用该行缓存该函数self.square = mem.cache(self.square)
。问题是,因为self
对于不同的实例会有所不同,所以即使参数相同,每次都会重新计算数组。
我猜想处理这个问题的正确方法是将线路更改为
但是,这种方法有什么缺点吗?有没有更好的方法来完成缓存?
python - 跟踪joblib.Parallel执行的进度
有没有一种简单的方法来跟踪joblib.Parallel执行的整体进度?
我有一个由数千个作业组成的长时间运行的执行,我想在数据库中进行跟踪和记录。但是,要做到这一点,每当 Parallel 完成任务时,我需要它执行回调,报告剩余的作业数。
我之前使用 Python 的 stdlib multiprocessing.Pool 完成了类似的任务,方法是启动一个线程来记录 Pool 的作业列表中待处理作业的数量。
查看代码,Parallel 继承了 Pool,所以我想我可以使用相同的技巧,但它似乎没有使用这些列表,而且我无法弄清楚如何“读取”它的内部任何其他方式的状态。
python - 多个进程共享一个 Joblib 缓存
我正在使用 Joblib 在我的 python 脚本中缓存计算量大的函数的结果。函数的输入参数和返回值是 numpy 数组。缓存适用于我的 python 脚本的单次运行。现在我想并行生成我的 python 脚本的多个运行,以便在实验中扫描一些参数。(函数的定义在所有运行中保持相同)。
有没有办法在并行运行的多个 python 脚本之间共享 joblib 缓存?这将节省大量在不同运行中重复但不会在单次运行中重复的函数评估。我在Joblib 的文档中找不到这是否可行
python - 使用 joblib 的 Python 并行计算
我在尝试让我的并行处理在可以从命令行调用的函数中工作时遇到问题。该函数从网站下载数据,进行一些处理并将数据保存到磁盘,因此多处理似乎是一个明显的解决方案。但是,当我尝试运行该函数时,它会创建空闲的 python 进程并冻结,不确定我做错了什么。目前我正在使用 python 2.7 (64bit) 和 64bit windows 7 和 joblib 来执行任务。
这是重现问题的简化代码:
现在,当我从 ipython 控制台键入 go(True) 时,创建了 3 个新的 python 进程,它们不使用任何 % cpu 和大约相同数量的内存 (16 mb),但不创建文件,只是坐下来直到我杀死它们。
当我运行 go(False) 时,该函数只需几毫秒即可运行并按预期运行,但按顺序而不是并行运行。我在这里做错了什么?注意:重要的是可以从命令行调用整个过程,而不是运行脚本本身,因为代码将在模块中使用。
python - 在 Python 中记忆整个块
假设我有一些创建多个变量的代码:
我想记住上面的整个块,而不必明确说明块中创建/更改的每个变量或手动腌制它们。我怎样才能在 Python 中做到这一点?
理想情况下,我希望能够用一些东西(if/else
或with
语句)包装它,并有一个标志,如果我愿意,可以强制刷新。
从概念上讲,它会像:
有什么方法可以做到这一点,而不必显式腌制代码中定义或更改的每个变量?(即在第一次运行结束时我们保存,然后我们只是重用这些值)
python - Bringing a classifier to production
I've saved my classifier pipeline using joblib:
Now i'm trying to use it in a production env:
The error i'm getting is: ValueError: Vocabulary wasn't fitted or is empty! I guess i should load the Vocabulary from te joblid but i can't get it to work
python - 数据帧的选择性重新记忆
假设我使用 Joblib 设置memoization如下(使用此处提供的解决方案):
假设我定义了几个查询,query_1
并且query_2
它们都需要很长时间才能运行。
我理解,代码原样:
使用任一查询的第二次调用将使用记忆输出,即:
/li>我可以
memory.clear()
用来删除整个缓存目录
但是,如果我只想对其中一个查询(例如)重新进行记忆,而不强制删除另一个查询,该怎么办?query_2
python - Joblib - 如何并行修改内存中的变量
我有一个关于joblib的问题。我正在使用 networkX 图,并希望并行化边的修改,因为迭代边列表确实是一个令人尴尬的并行问题。在这样做时,我想到了运行代码的简化版本。
我有一个变量x
。它是一个列表列表,类似于边缘列表,尽管我知道 networkX 返回边缘列表的元组列表,并且主要具有基于字典的实现。请暂时忍受这个简单的例子。
我有两个函数可以将字典的'a'
值修改为前两个值的加法或前两个值的减法。它们是这样定义的:
如果我执行常规 for 循环,则x
可以正确修改变量:
结果:
但是,当我尝试使用 joblib 执行此操作时,我无法获得所需的结果:
期望的结果是:
当我检查 x 时,它没有改变:
我不确定这里发生了什么。我可以理解 joblib 文档中提供的示例——它专门展示了使用单个简单函数计算数字数组。但是,这并不涉及修改内存中的现有对象,这是我想我正在尝试做的。有针对这个的解决方法吗?我将如何修改此代码以并行修改内存中的单个对象?
python - python多处理和joblib参数传递
当涉及到全局 numpy 数组时,我对 Python 多处理有一些困惑。
考虑下面的玩具示例,传递的参数是一个整数,指示要求和的行。我的问题是:
每个处理器/工作人员都有 x 的副本吗?
例如,如果我通过实际行
pool.apply_async(sum, (x[i],))
并相应地更改函数 sum(),性能会如何变化。我的理解是传递的参数是 numpy 数组的视图,因此它不应该影响非并行程序中的任何内容。但是多处理程序呢?如果我用 joblib 包重写程序,
results = joblib.Parallel(n_jobs=-1, max_nbytes=1e6)(joblib.delayed(sum)(i) for i in xrange(len(x)))
每个处理器/工作人员都有自己的 x 副本吗?如果是这样,因为 x 是只读的,那么在工作人员之间共享的最简单方法是什么?
编码:
谢谢你