【发布时间】:2014-09-21 21:45:26
【问题描述】:
我正在使用 Joblib 在我的 python 脚本中缓存计算量大的函数的结果。函数的输入参数和返回值是 numpy 数组。缓存适用于我的 python 脚本的单次运行。现在我想并行生成我的 python 脚本的多个运行,以便在实验中扫描一些参数。 (函数的定义在所有运行中保持相同)。
有没有办法在并行运行的多个 python 脚本之间共享 joblib 缓存? 这将节省大量在不同运行中重复但在单次运行中不重复的函数评估。我在Joblib's documentation 中找不到这是否可行
【问题讨论】:
-
如果您已经在脚本的单次运行中进行了并行化,我认为尝试在多次运行中进行并行化也不会有什么好处。我想您可以通过重新使用以前运行的缓存来做得更好。我从未尝试过,但我猜你可以通过在连续运行中使用相同的
joblib.Memory对象来做到这一点。 -
@ali_m:单次运行是并行的,但我也需要并行运行多次,因为每次运行需要几天时间,而且我有很多内核(我在簇)。如果 joblib 的缓存是一个文件,那么看起来应该可以让多个进程共享它......我不知道如何。
-
单次运行时,您的核心利用率如何?如果您已经在一次运行中使用了所有内核,那么通过跨运行并行化您将无法做得更好 - 额外的工作线程只会竞争同一组内核,您可能会很好看到由于额外的线程开销和缓存冲突导致的性能下降。跨运行而不是在单个运行中并行化可能更有意义 - 这样您将花费成比例地减少生成和终止线程而不是进行计算的时间。
-
如果您
mem.cache重复自身的功能,那么这应该可以开箱即用。至少在一台具有多处理功能的机器上。在不共享磁盘空间的多台机器的集群上,这是完全不同的事情。如果他们确实共享磁盘空间并且您将缓存放在那里,我不明白为什么它不应该工作。 -
@eickenberg...谢谢!! :) 我想我正在使用 cachedir = mkdtemp() ,这就是它以前不起作用的原因。只要两个进程使用相同的目录来保存缓存,它就可以工作。
标签: python caching numpy joblib