2013-06-18 12 views
8

Chcę używać Celery do uruchamiania zadań na serwerze GPU z czterema kartami Tesli. Prowadzę pracownika selekcji z grupą czterech pracowników, tak aby każda karta zawsze wykonywała jedno zadanie.Otrzymuj identyfikator pracownika w Celery

Mój problem polega na tym, jak instruować pracowników, aby każdy z nich zgodził się na jedno GPU. Obecnie mogę polegać na założeniu, że procesy robocze powinny mieć ciągłych identyfikatory procesu:

device_id = os.getpid() % self.ndevices 

Jednak to nie gwarantuje zawsze działa, to znaczy, gdy procesy robocze dostać ponownym uruchamianiu komputera w czasie. Idealnie chciałbym uzyskać identyfikator każdego pracownika bezpośrednio. Czy ktoś może mi powiedzieć, czy możliwe jest sprawdzenie pracownika w ramach zadania, czy może zaproponować inne rozwiązanie do dystrybucji zadań w układach GPU?

Odpowiedz

11

Jeśli używasz CELERYD_POOL = 'processes', basen pracownik jest obsługiwane przez billiard, co zdarza się, aby odsłonić jej indeks proces oparty o 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 jest oparty o 0, a jeśli pracownik dzieje być ponownie uruchomiony, zachowa swój indeks.

nie mogłem znaleźć żadnej dokumentacji dotyczącej wartości index jednak:/

+1

Chyba była niejasna z moim terminologii: I rzeczywiście mają jeden pracownik, który spawns cztery procesy. Czego oczekuję, to identyfikator procesu w Seler (0-3), a nie pid UNIX. Wydaje mi się, że posiadanie wielu pracowników firmy Seler z jednym procesem będzie skuteczne, ale będzie mniej wygodne. Nie ma znaczenia, gdzie mam dostęp do ID: można go sprawdzić na poziomie zadania lub być zmienną globalną dla każdego procesu. – oceanhug

+1

Zgadzam się, nie jestem zbyt zadowolony z mojego rozwiązania, albo ... To jest OK, jeśli masz wdrożenie produkcyjne z niektórymi pracownikami zarządzanymi przez supervisora, ale wymaga to dedykowanej konfiguracji i nie zużyje dostępnych zasobów automatycznie w oparciu o pojedyncze rozwiązanie. --concurrency = xxx' argument. Tam * znajduje się * "current_app.pool", ale nie mogę powiedzieć, co z nim zrobić ... –

+1

Edycja: znalazłem zupełnie nową odpowiedź \ o/ –

Powiązane problemy