10

Celery を使用して、4 枚の Tesla カードを搭載した GPU サーバーでジョブを実行したいと考えています。各カードが常に 1 つのジョブを実行するように、4 つのワーカーのプールで Celery ワーカーを実行します。

私の問題は、ワーカーにそれぞれ 1 つの 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 から始まり、ワーカーが再起動された場合、そのインデックスを保持します。

ただし、値に関するドキュメントは見つかりませんでしindexた:/

于 2013-06-18T21:22:35.917 に答える