2013-06-18 3 views
8

4つのTeslaカードを使用してGPUサーバーでジョブを実行するにはセロリを使用します。私は、各カードが常に1つの仕事を実行するように、4人の労働者のプールでセロリの労働者を実行します。CeleryでワーカーIDを取得する

私の問題は、各自が1つのGPUを要求するように作業者に指示する方法です。

device_id = os.getpid() % self.ndevices 

しかし、私はこれは、常に動作することが保証されていないワーカープロセスが時間をかけて再起動します、すなわち:現在、私は、ワーカープロセスは、すべてが連続プロセスIDを持つべきであるという仮定に依存しています。理想的には、各労働者のIDを直接取得したいと思います。タスク内から作業者を検査することが可能か、GPUを介してジョブを配布する別のソリューションを提案できるかどうかを誰かに教えてください。

答えて

11

あなたがCELERYD_POOL = 'processes'を使用している場合は、ワーカープールはその0ベースのプロセスのインデックスを公開するために起こるいた、billiardによって処理されます。

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ベースで、労働者はに発生した場合再起動するとインデックスが保持されます。

でも、私はindex値に関するあらゆるドキュメントを見つけることができませんでした:/

+1

私は私の専門用語では不明だったと思う:私は実際には4つのプロセスを生成1つのワーカーを持っています。私が得ようとしているのは、UNIXのpidではなく、Celery内のプロセスID(0〜3)です。私は、1つのプロセスで複数のセロリ労働者を雇っているのではないかと思います。私がIDにアクセスできる場所は実際問題ではありません。タスクレベルで検査することも、プロセスごとにグローバル変数にすることもできます。 – oceanhug

+1

合意しましたが、私のソリューションには満足していません...スーパーバイドで管理されている一部の作業者がいる実稼働環境であれば問題ありませんが、専用の設定が必要で、 --concurrency = xxx'引数です。 * current_app.poolはありますが、私はそれをどうするか説明できません... –

+1

編集:全く新しい答えが見つかりました\ o/ –

関連する問題