我读过文档,但我不明白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知识充其量是正常的,而且很可能我缺少一些基本的东西。任何指向正确方向的指针都将不胜感激。
发布于 2018-08-20 16:04:41
也许如果我们看看会发生什么事情就会变得更清楚,如果我们只是简单地写
Parallel(n_jobs=8)(getHog(i) for i in allImages)在这方面,可以更自然地将其表述为:
Parallel创建n_jobs=8实例[getHog(i) for i in allImages]创建生成器Parallel实例有什么问题吗?当列表被传递到Parallel对象时,所有的getHog(i)调用都已经返回了--所以没有什么可以并行执行的了!所有的工作都是按顺序在主线程中完成的。
我们真正想要的是告诉Python我们想用什么参数调用哪些函数,而不实际调用它们--换句话说,我们希望延迟执行。
这是delayed方便地允许我们做的事情,语法清晰。如果我们想告诉Python我们希望稍后调用foo(2, g=3),我们只需编写delayed(foo)(2, g=3)。返回的是元组(foo, [2], {g: 3}),包含:
foo2g=3因此,通过编写Parallel(n_jobs=8)(delayed(getHog)(i) for i in allImages),而不是上面的序列,现在发生了以下情况:
Parallel的n_jobs=8实例。Parallel实例。Parallel实例创建8个线程,并将元组从列表分发给它们。tup[0](*tup[1], **tup[2]),将元组转换回我们实际要做的调用getHog(img2)。发布于 2019-10-24 09:22:37
我们需要一个循环来测试不同型号配置的列表。这是驱动网格搜索过程的主要函数,它将为每个模型配置调用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)
我们可以使用并行对象并行执行任务列表。
scores = executor(tasks)
发布于 2018-03-25 21:52:54
因此,您想要做的是堆积一组函数调用及其参数,这样您就可以高效地将它们传递给调度程序/执行器。延迟是一个装潢工,它接收一个函数及其arg,并将它们封装到一个可以放在列表中并根据需要弹出的对象中。Dask也有同样的功能,它在一定程度上用于将其输入到图形调度程序中。
https://stackoverflow.com/questions/42220458
复制相似问题