10

我想使用 Celery 在具有四张 Tesla 卡的 GPU 服务器上运行作业。我运行 Celery 工人与四个工人的池,这样每张卡总是运行一个工作。

我的问题是如何指导工人每人要求一个 GPU。目前我依赖的假设是工作进程都应该有连续的进程 ID:

device_id = os.getpid() % self.ndevices

但是,这并不能保证始终有效,即当工作进程随着时间的推移重新启动时。所以理想情况下,我想直接获取每个工人的 ID。有人可以告诉我是否可以从任务中检查工作人员,或者可以提出不同的解决方案来跨 GPU 分配作业?

4

1 回答 1

13

如果您正在使用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

是从index0 开始的,如果一个 worker 恰好被重新启动,它将保留它的索引。

我找不到任何有关该index值的文档:/

于 2013-06-18T21:22:35.917 回答