La nostra macchina GB10 continuava a spegnersi da sola. Il log incolpava la memoria; era il calore
Ops
Una delle nostre tre macchine NVIDIA GB10 si è spenta tre volte in quattro giorni a settembre: il 10 settembre, il 12 settembre (è rimasta spenta per 17 ore) e il 13 settembre, dodici minuti dopo essere stata riavviata. Ogni volta serviva una persona che premesse il pulsante di accensione.
Come appare uno spegnimento per surriscaldamento
Il journal di sistema si è semplicemente fermato, a metà attività, senza registrare lo spegnimento: uno spegnimento hardware non dà a journald il tempo di scrivere il suo buffer. A luglio, dopo un simile spegnimento, l'orologio è persino tornato con una data vecchia. E il watchdog hardware, che riavvia una macchina bloccata, non ha fatto nulla, perché la macchina non era bloccata: l'alimentazione era venuta meno.
L'indizio sbagliato
Le ultime righe del kernel prima di ogni arresto erano errori di memoria GPU esaurita (NV_ERR_NO_MEMORY), quindi la memoria sembrava la colpevole. Non lo era. Quelle righe erano semplicemente la cosa più comune che il kernel scriveva: 440.580 di esse in un singolo avvio durato 19 giorni prima di terminare. Quando una riga appare così spesso, sarà l'ultima riga prima di qualsiasi cosa. Prima di incolpare una riga di log, conta quante volte appare quando non succede nulla.
L'indizio giusto
Poiché il journal perde gli ultimi minuti in uno spegnimento, avevamo aggiunto un piccolo campionatore che scrive temperature, carico e memoria in un file ogni minuto e lo scarica su disco. Ha catturato tutti i cinque arresti da luglio. Ogni singolo si è verificato a pieno carico GPU (96%), con la CPU tra 85 e 97 °C.
La tempistica ha spiegato il resto. Intorno all'inizio di settembre avevamo spostato il rendering video su questa macchina. La potenza GPU a pieno carico è passata da circa 24 W a 46 W, la temperatura mediana della GPU da 68 a 86 °C, e i minuti settimanali con la CPU a 95 °C o più da zero a 4.283. Le nostre altre due macchine GB10, che eseguono il modello linguistico allo stesso carico del 96%, sono rimaste tra 65 e 81 °C. Questa semplicemente si raffreddava peggio.
La prima soluzione: un limite di clock GPU
Su GB10, nvidia-smi non può impostare un limite di potenza, ma può limitare il clock GPU: nvidia-smi -lgc 0,2000. A luglio questo ha portato la zona più calda da 91 °C a 77-83 °C in pochi secondi. Due dettagli contano:
- Applicalo prima che i servizi pesanti partano. Il nostro servizio di limitazione partiva circa 15 secondi dopo l'avvio, quando il server del modello aveva già iniziato a caricare a piena potenza, che è il momento in cui la macchina era andata in crash. Ora viene eseguito prima che Docker parta.
- Verificalo sotto carico. Con il limite attivo, la frequenza GPU riportata è ancora di circa 2.400 MHz quando la GPU è inattiva. Sotto carico si mantiene a 1.976 MHz.
La seconda correzione: una guardia termica a gradini
Il limite non è bastato una volta introdotto il rendering, quindi ora una guardia legge ogni sensore una volta al secondo e agisce a gradini: una frequenza GPU più bassa da 89 °C e una ancora più bassa da 92 °C; da 94 °C il renderer viene messo in pausa (SIGSTOP) e la CPU rallentata; da 96 °C ogni job GPU viene messo in pausa per i secondi necessari a raffreddare. Torna indietro solo dopo che la macchina è rimasta più fresca per un po'. A 97 °C per 20 secondi, un freno di ultima istanza arresta del tutto il servizio video.
Nei suoi primi nove minuti sotto rendering, la zona più calda ha raggiunto un picco di 94 °C con una mediana di 89 °C, contro i plateau di 97 °C precedenti. Ha un prezzo: in un giorno di metà settembre il renderer è stato messo in pausa per il 17% del tempo e la GPU ha funzionato a 900 MHz o meno per la maggior parte della giornata. E non è una cura: la macchina si è spenta di nuovo una volta, l'11 ottobre, a 97-98 °C. Da allora funziona senza interruzioni, 20 giorni mentre scriviamo.
Quattro errori commessi lungo il percorso
- Mettere in pausa un job non raffreddava la macchina. Il freno è scattato con il renderer già in pausa, perché un modello di immagini stava ancora generando e una dozzina di timer erano partiti nello stesso minuto. Il gradino superiore ora mette in pausa ogni job GPU pesante, non solo il renderer.
- La guardia mette in pausa i job per nome, e i nomi sono cambiati. Due volte un nuovo motore sarebbe sfuggito alla pausa: un modello di immagini con un nuovo nome di processo a settembre, e a ottobre un renderer che gira in un container invece che come processo figlio del servizio di rendering. Ogni cambio di motore ora include una verifica della lista della guardia.
- Il blocco del freno non si è mai sollevato. Ha fermato il servizio video e ha lasciato un file di blocco così che nulla lo riavviasse. Inoltre nessuno è stato avvisato e l'output si è fermato per tre giorni prima che ce ne accorgessimo. Ora il blocco si solleva da sé: cinque minuti dopo l'ultimo freno, senza nuovi freni, almeno 30 GB di memoria libera e una media di 10 minuti di 93 °C o meno. Aspettare che la macchina si raffreddasse non avrebbe mai funzionato: aveva una media di 88 °C sia con che senza rendering.
- L'allarme è scattato alla temperatura normale della macchina. La soglia di allerta era 88 °C, che era la media di questa macchina. In un giorno, ha trascorso il 32% del tempo a 90 °C o più, l'8% a 93 °C o più e il 3% a 95 °C o più, senza mai raggiungere i 97 °C. Abbiamo spostato l'allarme a 97 °C, il plateau in cui è effettivamente morta, e le email di allarme si sono fermate.
Il punto chiave
Il software ha mantenuto viva questa macchina, ma la causa era fisica: il suo raffreddamento era da due a tre volte peggiore rispetto alle sue simili. Se una macchina GB10 si spegne da sola sotto carico, controlla prima il flusso d'aria. Poi limita la frequenza della GPU prima che i tuoi servizi partano, metti in pausa i job pesanti prima che la macchina raggiunga il suo limite e imposta gli allarmi sulle temperature a cui funziona effettivamente.
Factory Floor include una guardia di questo tipo: legge la temperatura più alta tra i sensori GPU e della zona termica, mette in pausa i job pesanti che specifichi a una temperatura impostata (92 °C per impostazione predefinita) e li riprende solo sotto una temperatura inferiore (84 °C), con guardie per memoria e disco accanto.