Nossa máquina GB10 continuava desligando sozinha. O log acusava a memória; era o calor
Operações
Uma de nossas três máquinas NVIDIA GB10 ficou inativa três vezes em quatro dias em setembro: em 10 de setembro, em 12 de setembro (ficou desligada por 17 horas) e em 13 de setembro, doze minutos depois de ser ligada novamente. Cada vez, era necessário que alguém pressionasse o botão de energia.
Como é um desligamento por calor
O journal do sistema simplesmente parou, no meio da atividade, sem registrar um desligamento: um corte abrupto de energia não dá tempo ao journald de gravar seu buffer. Em julho, após um desligamento semelhante, o relógio até voltou com uma data antiga. E o watchdog de hardware, que reinicia uma máquina travada, não fez nada, porque a máquina não havia travado: a energia havia acabado.
A pista errada
As últimas linhas do kernel antes de cada falha eram erros de falta de memória na GPU (NV_ERR_NO_MEMORY), então a memória parecia a culpada. Não era. Essas linhas eram simplesmente a coisa mais comum que o kernel escrevia: 440.580 delas em uma única inicialização que rodou por 19 dias antes de terminar. Quando uma linha aparece com essa frequência, ela será a última linha antes de qualquer coisa. Antes de culpar uma linha de log, conte com que frequência ela aparece quando nada dá errado.
A pista certa
Como o journal perde seus últimos minutos em um corte de energia, adicionamos um pequeno amostrador que grava temperaturas, carga e memória em um arquivo a cada minuto e o descarrega no disco. Ele capturou todas as cinco falhas desde julho. Todas ocorreram com a GPU em carga total (96%), com a CPU entre 85 e 97 °C.
A cronologia explicou o resto. Por volta do início de setembro, havíamos movido a renderização de vídeo para esta máquina. Sua potência da GPU sob carga total passou de cerca de 24 W para 46 W, sua temperatura mediana da GPU de 68 para 86 °C, e os minutos por semana com a CPU em 95 °C ou mais passaram de nenhum para 4.283. Nossas outras duas máquinas GB10, que executam o modelo de linguagem na mesma carga de 96%, permaneceram entre 65 e 81 °C. Esta simplesmente esfriava pior.
A primeira correção: um limite de clock da GPU
Na GB10, o nvidia-smi não consegue definir um limite de potência, mas pode limitar o clock da GPU: nvidia-smi -lgc 0,2000. Em julho, isso reduziu a zona mais quente de 91 °C para 77 a 83 °C em segundos. Dois detalhes importam:
- Aplique-o antes que os serviços pesados iniciem. Nosso serviço de limite primeiro rodava cerca de 15 segundos após a inicialização, quando o servidor de modelos já havia começado a carregar em potência total, que era o momento que havia derrubado a máquina. Agora ele roda antes que o Docker inicie.
- Verifique sob carga. Com o limite ativado, o clock da GPU reportado ainda lê cerca de 2.400 MHz quando a GPU está ociosa. Sob carga, ele se mantém em 1.976 MHz.
A segunda correção: um guarda de temperatura em etapas
O limite não foi suficiente quando a renderização entrou em ação, então um guarda agora lê todos os sensores uma vez por segundo e age em etapas: um clock da GPU mais baixo a partir de 89 °C e outro mais baixo ainda a partir de 92 °C; a partir de 94 °C, o renderizador é pausado (SIGSTOP) e a CPU desacelerada; a partir de 96 °C, todos os trabalhos da GPU são pausados pelo tempo necessário para esfriar. Ele retorna apenas depois que a máquina permanece mais fria por um tempo. A 97 °C por 20 segundos, um freio de último recurso para o serviço de vídeo completamente.
Nos seus primeiros nove minutos sob renderização, a zona mais quente atingiu o pico de 94 °C com uma mediana de 89 °C, contra platôs de 97 °C antes. Isso tem um preço: em um dia de meados de setembro, o renderizador ficou pausado por 17% do tempo, e a GPU rodou a 900 MHz ou menos durante a maior parte do dia. E não é uma cura: a máquina se desligou mais uma vez, em 11 de outubro, entre 97 e 98 °C. Ela roda sem interrupções desde então, 20 dias enquanto escrevemos isto.
Quatro erros que cometemos no caminho
- Pausar um trabalho não esfriou a máquina. O freio disparou com o renderizador já pausado, porque um modelo de imagem ainda estava desenhando e uma dúzia de timers iniciaram no mesmo minuto. A etapa superior agora pausa todos os trabalhos pesados da GPU, não apenas o renderizador.
- O guarda pausa trabalhos pelo nome, e os nomes mudaram. Duas vezes um novo motor teria escapado da pausa: um modelo de imagem com um novo nome de processo em setembro, e em outubro um renderizador que roda em um contêiner em vez de como um filho do serviço de renderização. Cada mudança de motor agora inclui uma olhada na lista do guarda.
- A retenção do freio nunca foi liberada. Ele parou o serviço de vídeo e deixou um arquivo de retenção para que nada o reiniciasse. Nada alertou ninguém também, e a saída parou por três dias antes de notarmos. A retenção agora se libera sozinha: cinco minutos após o último freio, sem novo freio, pelo menos 30 GB de memória livre e uma média de dez minutos de 93 °C ou menos. Esperar a máquina esfriar nunca ia funcionar: ela tinha uma média de 88 °C com e sem renderização.
- O alarme disparou na temperatura normal da máquina. O limite de alerta era de 88 °C, que era a média desta máquina. Em um dia, ela passou 32% do tempo a 90 °C ou mais, 8% a 93 °C ou mais e 3% a 95 °C ou mais, e nunca chegou a 97 °C. Movemos o alarme para 97 °C, o platô onde ela realmente parou, e os e-mails de alarme pararam.
A conclusão
O software manteve esta máquina viva, mas a causa era física: seu resfriamento era de duas a três vezes pior que o das suas irmãs. Se uma máquina GB10 desliga sozinha sob carga, verifique o fluxo de ar primeiro. Depois, limite o clock da GPU antes que seus serviços iniciem, pause as tarefas pesadas antes que a máquina atinja seu limite e configure alarmes com base nas temperaturas que ela realmente atinge.
Factory Floor inclui um guarda de calor deste tipo: ele lê a maior temperatura entre os sensores da GPU e da zona térmica, pausa as tarefas pesadas que você definir em uma temperatura específica (92 °C por padrão) e as retoma apenas abaixo de uma temperatura menor (84 °C), com guardas de memória e disco ao lado.