Parallel processing 如何指定芹菜工人可以接受的任务的批量大小?

Parallel processing 如何指定芹菜工人可以接受的任务的批量大小?,parallel-processing,celery,gpu,Parallel Processing,Celery,Gpu,我试图设计一个系统,在这个系统中,调用者将数据发送给在GPU机器上运行的芹菜工人,他们进行一些处理,并将结果返回给调用者。由于GPU可以并行处理一批数据(例如并行处理N个项目),因此芹菜任务接受N个数据项并同时处理所有N个项目是有意义的 在调用者端,我可以使用将数据项列表拆分为一些固定大小的子列表 job = tasks.predict.chunks(texts, BATCH_SIZE) result = job.apply_async() 但是,我的问题是,我希望在接收端(worker)

我试图设计一个系统,在这个系统中,调用者将数据发送给在GPU机器上运行的芹菜工人,他们进行一些处理,并将结果返回给调用者。由于GPU可以并行处理一批数据(例如并行处理N个项目),因此芹菜任务接受N个数据项并同时处理所有N个项目是有意义的

在调用者端,我可以使用将数据项列表拆分为一些固定大小的子列表

 job = tasks.predict.chunks(texts, BATCH_SIZE)
 result = job.apply_async()
但是,我的问题是,我希望在接收端(worker)而不是调用者上指定
批处理_大小
,因为每个worker在一个批处理中可以处理的数据项的数量可能有不同的限制(因为GPU内存大小可能因不同的worker而异)


做这件事最好的方法是什么?我希望芹菜工人能够在单个任务期间使用数据工作负载中的任意N个项目。

我认为每个工人在其配置中具有批处理大小可能是最好的。然后,您的任务可以轻松地从配置中获取此值。

目前最好的方法是通过不太友好的包。使用示例在不推荐使用的包中

对于模型预测,您当前应该在上下文类中包装一些内容,例如:

类上下文(任务):
定义初始化(自):
self.\u model=get\u model()
@app.task(base=Context)
def预测(img):
收益预测模型(img)
使用
芹菜批次
,您可以将模型重写为:

类上下文(批处理):
定义初始化(自):
超级(上下文,自我)。\uuuu init\uuuuu()
self.\u model=get\u batch\u model()
@app.task(base=Context,
每批冲洗一次=批量大小,
刷新间隔=最大空闲时间)
def预测(请求):
批次=[]
对于请求中的请求:
batch.append(request.args[0])
响应=预测\批量(预测。\模型,批量)
对于响应,zip中的请求(响应,请求):
app.backend.mark_as_done(request.id,response)
def预测_批次(型号,批次):
退货模式(批次)

批量大小可以在每个工作人员中单独定义,并且您的工作人员将在累积批量大小任务时或在最大空闲时间过去时进行处理。

这是一个很好的角度,但我的问题是-任务应该如何处理该批量大小值?如何从芹菜队列中请求N个项目的任务?这应该由您运行芹菜工作程序的方式来控制-它应该以您指定的方式配置并发级别。在我的例子中,我们运行芹菜作为systemd服务,shell脚本分析环境(CPU内核和内存的数量)并设置并发值。谢谢@DejanLekic,但我想我仍然没有得到它-如果我将并发设置为N,那就意味着有N个任务同时运行。。我如何将N个数据项收集到一个任务中?这样我就可以在一个GPU请求中将它们全部批处理到一起?我想到的一个解决方案是在芹菜工人内部有一个额外的内部队列,这样任务就可以将数据汇集到该单个队列中,然后,一个单独的后台任务/线程将在每个批中消耗适当数量的数据。但这感觉就像我在重新实现整个芹菜排队系统:)。。我希望有一种更明显/直接的方法来实现这一点。