Nuestra máquina GB10 se apagaba sola. El registro culpaba a la memoria; era el calor
Operaciones
Una de nuestras tres máquinas NVIDIA GB10 se apagó tres veces en cuatro días en septiembre: el 10 de septiembre, el 12 de septiembre (permaneció apagada durante 17 horas) y el 13 de septiembre, doce minutos después de encenderla de nuevo. Cada vez necesitaba que una persona pulsara el botón de encendido.
Cómo es un apagado por calor
El registro del sistema simplemente se detuvo, a mitad de una actividad, sin ningún apagado registrado: un corte de energía no da tiempo a journald para escribir su búfer. En julio, tras un apagado similar, el reloj incluso volvió con una fecha antigua. Y el watchdog de hardware, que reinicia una máquina bloqueada, no hizo nada, porque la máquina no se había bloqueado: se había ido la corriente.
La pista equivocada
Las últimas líneas del kernel antes de cada caída eran errores de memoria GPU agotada (NV_ERR_NO_MEMORY), por lo que la memoria parecía la culpable. No lo era. Esas líneas eran simplemente lo más común que escribía el kernel: 440.580 de ellas en un solo arranque que había funcionado durante 19 días antes de terminar. Cuando una línea aparece tan a menudo, será la última línea antes de cualquier cosa. Antes de culpar a una línea del registro, cuenta con qué frecuencia aparece cuando no falla nada.
La pista correcta
Como el registro pierde sus últimos minutos en un corte de energía, habíamos añadido un pequeño muestreador que escribe temperaturas, carga y memoria en un archivo cada minuto y lo vuelca al disco. Capturó las cinco caídas desde julio. Todas se produjeron con la GPU al 96% de carga, con la CPU entre 85 y 97 °C.
El momento explicaba el resto. Alrededor del inicio de septiembre habíamos movido el renderizado de vídeo a esta máquina. Su potencia de GPU bajo carga completa pasó de unos 24 W a 46 W, su temperatura mediana de GPU de 68 a 86 °C, y los minutos por semana con la CPU a 95 °C o más pasaron de ninguno a 4.283. Nuestras otras dos máquinas GB10, que ejecutan el modelo de lenguaje a la misma carga del 96%, se mantuvieron entre 65 y 81 °C. Esta simplemente se enfriaba peor.
La primera solución: un límite de reloj de GPU
En GB10, nvidia-smi no puede establecer un límite de potencia, pero puede limitar el reloj de la GPU: nvidia-smi -lgc 0,2000. En julio, esto redujo la zona más caliente de 91 °C a 77-83 °C en segundos. Dos detalles importan:
- Aplicarlo antes de que arranquen los servicios pesados. Nuestro servicio de límite se ejecutaba primero unos 15 segundos después del arranque, cuando el servidor del modelo ya había comenzado a cargarse a plena potencia, que es el momento en que la máquina se había bloqueado. Ahora se ejecuta antes de que arranque Docker.
- Compruébalo bajo carga. Con el límite activado, la frecuencia de reloj de la GPU sigue marcando unos 2.400 MHz cuando la GPU está en reposo. Bajo carga se mantiene en 1.976 MHz.
La segunda corrección: una salvaguarda térmica por pasos
El límite no fue suficiente cuando se incorporó el renderizado, así que ahora una salvaguarda lee cada sensor una vez por segundo y actúa por pasos: una frecuencia de reloj de la GPU más baja desde 89 °C y otra más baja desde 92 °C; desde 94 °C se pausa el renderizador (SIGSTOP) y se ralentiza la CPU; desde 96 °C se pausan todos los trabajos de GPU durante los segundos necesarios para enfriar. Solo vuelve a subir gradualmente después de que la máquina haya permanecido más fría durante un tiempo. A 97 °C durante 20 segundos, un freno de último recurso detiene por completo el servicio de vídeo.
En sus primeros nueve minutos bajo renderizado, la zona más caliente alcanzó un pico de 94 °C con una mediana de 89 °C, frente a las mesetas de 97 °C anteriores. Tiene un precio: un día de mediados de septiembre el renderizador estuvo pausado el 17% del tiempo y la GPU funcionó a 900 MHz o menos durante la mayor parte del día. Y no es una cura: la máquina se apagó sola una vez más, el 11 de octubre, a 97-98 °C. Desde entonces ha funcionado sin interrupciones, 20 días mientras escribimos esto.
Cuatro errores que cometimos por el camino
- Pausar un trabajo no enfrió la máquina. El freno se activó con el renderizador ya pausado, porque un modelo de imagen seguía generando y una docena de timers se iniciaron en el mismo minuto. El paso superior ahora pausa todos los trabajos pesados de GPU, no solo el renderizador.
- La salvaguarda pausa trabajos por nombre, y los nombres cambiaron. Dos veces un nuevo motor habría escapado de la pausa: un modelo de imagen con un nuevo nombre de proceso en septiembre, y en octubre un renderizador que se ejecuta en un contenedor en lugar de como proceso hijo del servicio de renderizado. Cada cambio de motor ahora incluye una revisión de la lista de la salvaguarda.
- La retención del freno nunca se levantó. Detuvo el servicio de vídeo y dejó un archivo de retención para que nada lo reiniciara. Tampoco nadie recibió una alerta, y la salida se detuvo durante tres días antes de que nos diéramos cuenta. Ahora la retención se levanta sola: cinco minutos después del último freno, sin nuevos frenos, con al menos 30 GB de memoria libre y un promedio de diez minutos de 93 °C o menos. Esperar a que la máquina se enfriara nunca iba a funcionar: promediaba 88 °C con y sin renderizado.
- La alarma sonó a la temperatura normal de la máquina. El umbral de alerta era de 88 °C, que era la media de esta máquina. Durante un día, pasó el 32% del tiempo a 90 °C o más, el 8% a 93 °C o más y el 3% a 95 °C o más, y nunca alcanzó los 97 °C. Movimos la alarma a 97 °C, la meseta donde realmente se apagó, y los correos de alarma dejaron de llegar.
La conclusión
El software mantuvo esta máquina viva, pero la causa era física: su refrigeración era de dos a tres veces peor que la de sus hermanas. Si una máquina GB10 se apaga sola bajo carga, revisa primero el flujo de aire. Luego limita la frecuencia de la GPU antes de que arranquen tus servicios, pausa los trabajos pesados antes de que la máquina alcance su límite y configura las alarmas según las temperaturas a las que realmente funciona.
Factory Floor incluye una salvaguarda térmica de este tipo: lee la más alta de las temperaturas de los sensores de la GPU y de las zonas térmicas, pausa los trabajos pesados que indiques a una temperatura establecida (92 °C por defecto) y los reanuda solo por debajo de una inferior (84 °C), junto con salvaguardas de memoria y disco.