跟踪 joblib.Parallel 执行的进度

新手上路,请多包涵

有没有一种简单的方法来跟踪 joblib.Parallel 执行的整体进度?

我有一个由数千个作业组成的长时间运行的执行,我想在数据库中跟踪和记录这些作业。但是,要做到这一点,每当 Parallel 完成任务时,我需要它执行回调,报告剩余的作业数量。

我之前使用 Python 的 stdlib multiprocessing.Pool 完成了类似的任务,方法是启动一个线程来记录 Pool 作业列表中待处理作业的数量。

查看代码,Parallel 继承了 Pool,所以我想我可以使用相同的技巧,但它似乎并没有使用这些列表,而且我一直无法弄清楚如何“读取”它的内部状态任何其他方式。

原文由 Cerin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

为什么不能简单地使用 tqdm ?以下对我有用

from joblib import Parallel, delayed
from datetime import datetime
from tqdm import tqdm

def myfun(x):
    return x**2

results = Parallel(n_jobs=8)(delayed(myfun)(i) for i in tqdm(range(1000))
100%|██████████| 1000/1000 [00:00<00:00, 10563.37it/s]

原文由 Jon 发布,翻译遵循 CC BY-SA 3.0 许可协议

dano 和 Connor 的答案的又一步是将整个事情包装为上下文管理器:

 import contextlib
import joblib
from tqdm import tqdm

@contextlib.contextmanager
def tqdm_joblib(tqdm_object):
    """Context manager to patch joblib to report into tqdm progress bar given as argument"""
    class TqdmBatchCompletionCallback(joblib.parallel.BatchCompletionCallBack):
        def __call__(self, *args, **kwargs):
            tqdm_object.update(n=self.batch_size)
            return super().__call__(*args, **kwargs)

    old_batch_callback = joblib.parallel.BatchCompletionCallBack
    joblib.parallel.BatchCompletionCallBack = TqdmBatchCompletionCallback
    try:
        yield tqdm_object
    finally:
        joblib.parallel.BatchCompletionCallBack = old_batch_callback
        tqdm_object.close()

然后你可以像这样使用它并且一旦你完成就不要留下猴子修补代码:

 from math import sqrt
from joblib import Parallel, delayed

with tqdm_joblib(tqdm(desc="My calculation", total=10)) as progress_bar:
    Parallel(n_jobs=16)(delayed(sqrt)(i**2) for i in range(10))

我认为这很棒,它看起来类似于 tqdm pandas 集成。

原文由 featuredpeow 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏