delayed() 函数有什么作用(在 Python 中与 joblib 一起使用时)

新手上路,请多包涵

我已通读 文档,但不明白以下内容的含义: The delayed function is a simple trick to be able to create a tuple (function, args, kwargs) with a function-call syntax.

我正在使用它来遍历我想要操作的列表 (allImages),如下所示:

 def joblib_loop():
    Parallel(n_jobs=8)(delayed(getHog)(i) for i in allImages)

这会返回我的 HOG 功能,就像我想要的那样(并且使用我所有的 8 个内核获得速度增益),但我只是不确定它实际上在做什么。

我的 Python 知识充其量不过,很可能我遗漏了一些基本知识。任何指向正确方向的指针将不胜感激

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

阅读 926
2 个回答

如果我们看看如果我们简单地写下会发生什么,事情可能会变得更清楚

Parallel(n_jobs=8)(getHog(i) for i in allImages)

在这种情况下,可以更自然地表达为:

  1. 创建一个 Parallel 实例 n_jobs=8
  2. 为列表创建生成器 [getHog(i) for i in allImages]
  3. 将该生成器传递给 Parallel 实例

有什么问题?当列表传递给 Parallel 对象时,所有 getHog(i) 调用已经返回 - 所以没有什么可以并行执行!所有工作都已在主线程中按顺序完成。

我们 真正 想要的是告诉 Python 我们想用什么参数调用什么函数, _而不是实际调用它们_——换句话说,我们想 延迟 执行。

这就是 delayed 方便地允许我们做的,语法清晰。如果我们想告诉 Python 我们想稍后调用 foo(2, g=3) ,我们可以简单地写 delayed(foo)(2, g=3) 。返回的是元组 (foo, [2], {g: 3}) ,包含:

  • 对我们要调用的 函数 的引用,例如 foo
  • 没有关键字的所有 参数(简称“args”),egt 2
  • 所有 关键字参数(简称“kwargs”),例如 g=3

因此,通过编写 Parallel(n_jobs=8)(delayed(getHog)(i) for i in allImages) 而不是上面的序列,现在会发生以下情况:

  1. 创建了一个 Parallel 实例 n_jobs=8

  2. 名单

    [delayed(getHog)(i) for i in allImages]

被创建,评估到

    [(getHog, [img1], {}), (getHog, [img2], {}), ... ]

  1. 该列表传递给 Parallel 实例

  2. Parallel 实例创建 8 个线程并将列表中的元组分发给它们

  3. 最后,这些线程中的每一个都开始执行元组,即,它们调用第一个元素并将第二个和第三个元素解压为参数 tup[0](*tup[1], **tup[2]) ,将元组转回我们实际打算执行的调用, getHog(img2)

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

我们需要一个循环来测试不同模型配置的列表。这是驱动网格搜索过程的主要函数,将为每个模型配置调用 score_model() 函数。我们可以通过并行评估模型配置来显着加快网格搜索过程。一种方法是使用 Joblib 库。我们可以定义一个 Parallel 对象,其中包含要使用的内核数,并将其设置为在您的硬件中检测到的分数数。

定义执行者

executor = Parallel(n_jobs=cpu_count(), backend= 'multiprocessing' )

然后创建一个要并行执行的任务列表,这将是对我们拥有的每个模型配置的评分模型()函数的一次调用。

假设 def score_model(data, n_test, cfg): ........................

定义任务列表

tasks = (delayed(score_model)(data, n_test, cfg) for cfg in cfg_list)

我们可以使用 Parallel 对象并行执行任务列表。

scores = executor(tasks)

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

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