我想使用芹菜在带有四个Tesla卡的GPU服务器上运行作业。我运行带有四个worker池的Celery worker,这样每个卡总是运行一个作业。
我的问题是如何指示工人每个要求一个GPU。目前,我依赖于工作进程都应该具有连续进程id的假设:
device_id = os.getpid() % self.ndevices
然而,这并不能保证总是工作,即当工作进程随着时间的推移重新启动时。所以理想情况下,我想直接获得每个工人的ID。有人能告诉我是否有可能从任务内检查工人,或者可以建议一个不同的解决方案来分配跨gpu的工作?
如果您使用的是CELERYD_POOL = 'processes'
,则工作池由billiard
处理,这确实会暴露其基于0的进程索引:
from billiard import current_process
from celery import task
@task
def print_info():
# This will print an int in [0..concurrency[
print current_process().index
index
是基于0的,如果一个worker碰巧被重新启动,它将保持它的索引。
我找不到任何关于index
值的文档:/