我读过joblib/parallel.html" rel="noreferrer">documentation,但我不明白什么是指:
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知识充其量还不错,很可能我遗漏了一些基本的东西。任何指向正确方向的指针都将非常感谢
我们需要一个循环来测试不同模型配置的列表。这是驱动网格搜索过程的主要函数,将为每个模型配置调用score_model()函数。通过并行评估模型配置,我们可以显著加快网格搜索过程。一种方法是使用Joblib库。我们可以用要使用的核心数定义一个并行对象,并将其设置为在硬件中检测到的分数。
定义执行者
executor = Parallel(n_jobs=cpu_count(), backend= 'multiprocessing' )
然后创建一个要并行执行的任务列表,这将是对每个模型配置的score model()函数的一次调用。
假设
def score_model(data, n_test, cfg): ........................
定义任务列表
tasks = (delayed(score_model)(data, n_test, cfg) for cfg in cfg_list)
我们可以使用Parallel对象并行执行任务列表。
scores = executor(tasks)
因此,您希望能够将一组函数调用及其参数堆积起来,以便能够有效地将它们传递给调度器/执行器。Delayed是一个decorator,它接受一个函数及其参数,并将它们包装成一个对象,该对象可以放入一个列表中,并根据需要弹出。Dask有相同的东西,它部分地使用它的图形调度程序。
如果我们看看如果我们只是简单地写下
Python的工作方式,
getHog(i) for i in allImages
创建一个列表,其中每个元素都已经被求值。这意味着当列表被传递到您的Parallel
对象时,所有的getHog
调用都已经返回,并且没有任何东西可以让Parallel
并行执行!所有的工作都已经在我们现在的线程中按顺序完成了。因此,我们必须通过保留要调用的函数和要调用函数的参数来延迟执行。
这就是
delayed
以清晰的语法方便地为我们做的事情。如果我们想“保留”稍后的调用foo(2, g=3)
,我们可以简单地调用delayed(foo)(2, g=3)
,然后返回元组(foo, [2], {g: 3})
,准备由其他人执行。所以在你的例子中,简而言之,会发生以下情况。
您创建了
的列表delayed(getHog)(i)
每一个
delayed(getHog)(i)
都返回元组(function, args, kwargs)
(正如您在文档中所读的),在本例中就是元组(getHog, [i], {})
先前构造的
Parallel
对象为列表中的每个元素创建一个新线程,并将元组分发给它们el[0](*el[1], **el[2])
或function(*args, **kwargs)
解包,在本例中,这将导致调用getHog(i)
。相关问题 更多 >
编程相关推荐