Onze GB10-machine schakelde zichzelf uit. Het logboek gaf het geheugen de schuld; het was hitte.
Ops
Een van onze drie NVIDIA GB10-machines viel drie keer uit in vier dagen in september: op 10 september, op 12 september (hij bleef 17 uur uit) en op 13 september, twaalf minuten nadat hij weer was ingeschakeld. Elke keer was er iemand nodig om de aan/uit-knop in te drukken.
Zo ziet een hitte-uitschakeling eruit
Het systeemjournal stopte gewoon, midden in een activiteit, zonder een afsluiting erin: een harde stroomuitval geeft journald geen tijd om zijn buffer weg te schrijven. In juli kwam de klok na een vergelijkbare uitschakeling zelfs terug met een oude datum. En de hardware watchdog, die een hangende machine herstart, deed niets, omdat de machine niet hing: de stroom was weg.
De verkeerde aanwijzing
De laatste kernelregels voor elke uitval waren GPU-geheugengebrek-fouten (NV_ERR_NO_MEMORY), dus het geheugen leek de schuldige. Dat was niet zo. Die regels waren simpelweg het meest voorkomende dat de kernel schreef: 440.580 keer in een enkele opstart die 19 dagen had gedraaid voordat hij eindigde. Als een regel zo vaak voorkomt, zal hij de laatste regel zijn vóór alles. Voordat je een logregel de schuld geeft, tel je hoe vaak hij verschijnt als er niets misgaat.
De juiste aanwijzing
Omdat het journal de laatste minuten verliest bij een stroomuitval, hadden we een kleine sampler toegevoegd die elke minuut temperaturen, belasting en geheugen naar een bestand schrijft en naar schijf spoelt. Die ving alle vijf uitvals sinds juli. Elke uitval kwam bij volledige GPU-belasting (96%), met de CPU op 85 tot 97 °C.
De timing verklaarde de rest. Rond het begin van september hadden we videorendering op deze machine gezet. Het GPU-verbruik onder volledige belasting ging van ongeveer 24 W naar 46 W, de mediaan GPU-temperatuur van 68 naar 86 °C, en de minuten per week met de CPU op 95 °C of meer van geen naar 4.283. Onze twee andere GB10-machines, die het taalmodel op dezelfde 96% belasting draaien, bleven op 65 tot 81 °C. Deze koelde simpelweg slechter.
De eerste oplossing: een GPU-klokplafond
Op GB10 kan nvidia-smi geen vermogenslimiet instellen, maar wel het GPU-klokplafond: nvidia-smi -lgc 0,2000. In juli bracht dat de heetste zone binnen seconden van 91 °C naar 77 tot 83 °C. Twee details zijn belangrijk:
- Pas het toe voordat de zware services starten. Onze plafondservice draaide eerst ongeveer 15 seconden na opstart, toen de modelserver al op volledig vermogen begon te laden, wat het moment was waarop de machine was gecrashed. Nu draait hij voordat Docker start.
- Test het onder belasting. Met de limiet aan, leest de gerapporteerde GPU-klok nog steeds ongeveer 2.400 MHz wanneer de GPU inactief is. Onder belasting blijft deze op 1.976 MHz.
De tweede oplossing: een bewaker voor temperatuur in stappen
De limiet was niet voldoende zodra rendering begon, dus leest een bewaker nu elke seconde elke sensor en handelt in stappen: een lagere GPU-klok vanaf 89 °C en nog lager vanaf 92 °C; vanaf 94 °C wordt de renderer gepauzeerd (SIGSTOP) en de CPU vertraagd; vanaf 96 °C wordt elke GPU-taak gepauzeerd voor de seconden die nodig zijn om af te koelen. Het gaat alleen terug naar de vorige stap nadat de machine een tijdje koeler is gebleven. Bij 97 °C gedurende 20 seconden stopt een noodrem de videodienst volledig.
In de eerste negen minuten onder rendering piekte de heetste zone op 94 °C met een mediaan van 89 °C, tegen eerdere plateaus van 97 °C. Het heeft een prijs: op één dag in half september was de renderer 17% van de tijd gepauzeerd, en draaide de GPU de meeste tijd op 900 MHz of minder. En het is geen geneesmiddel: de machine schakelde zichzelf nog één keer uit, op 11 oktober, bij 97 tot 98 °C. Sindsdien draait het zonder onderbreking, 20 dagen op het moment van schrijven.
Vier fouten die we onderweg maakten
- Het pauzeren van één taak koelde de machine niet af. De rem ging af terwijl de renderer al gepauzeerd was, omdat een beeldmodel nog steeds renderde en een dozijn timers in dezelfde minuut startten. De hoogste stap pauzeert nu elke zware GPU-taak, niet alleen de renderer.
- De bewaker pauzeert taken op naam, en de namen veranderden. Twee keer zou een nieuwe engine de pauze zijn ontgaan: een beeldmodel met een nieuwe procesnaam in september, en in oktober een renderer die in een container draait in plaats van als kind van de renderservice. Elke wijziging van de engine omvat nu een controle van de lijst van de bewaker.
- De vergrendeling van de rem werd nooit opgeheven. Het stopte de videodienst en liet een vergrendelingsbestand achter zodat niets het opnieuw startte. Niemand werd ook gewaarschuwd, en de output stopte drie dagen voordat we het merkten. De vergrendeling heft zichzelf nu op: vijf minuten na de laatste rem, zonder nieuwe rem, minstens 30 GB vrij geheugen en een gemiddelde van 93 °C of minder over tien minuten. Wachten tot de machine afkoelde zou nooit werken: het gemiddelde was 88 °C met en zonder rendering.
- Het alarm ging af op de normale temperatuur van de machine. De alarmdrempel stond op 88 °C, wat het gemiddelde van deze machine was. Gedurende één dag lag de temperatuur 32% van de tijd op 90 °C of hoger, 8% op 93 °C of hoger en 3% op 95 °C of hoger, en werd 97 °C nooit bereikt. We hebben het alarm verplaatst naar 97 °C, het plateau waar de machine daadwerkelijk uitviel, en de alarmmails stopten.
De conclusie
Software hield deze machine in leven, maar de oorzaak was fysiek: de koeling was twee tot drie keer slechter dan die van zijn soortgenoten. Als een GB10-machine zichzelf onder belasting uitschakelt, controleer dan eerst de luchtdoorstroom. Begrens vervolgens de GPU-klok voordat je services starten, pauzeer de zware taken voordat de machine zijn limiet bereikt, en stel alarmen in op basis van de temperaturen waarop de machine daadwerkelijk draait.
Factory Floor bevat een dergelijke hittebewaker: deze leest de hoogste waarde van de GPU- en thermische zonesensoren, pauzeert de zware taken die je opgeeft bij een ingestelde temperatuur (standaard 92 °C) en hervat ze alleen onder een lagere temperatuur (84 °C), met geheugen- en schijfbewakers ernaast.