Наш компьютер GB10 сам выключался. В журнале была ошибка памяти, а на деле всё было в перегреве
Операции
Один из трёх наших компьютеров NVIDIA GB10 трижды отключался за четыре дня в сентябре: 10 сентября, 12 сентября (он оставался выключенным 17 часов) и 13 сентября, через двенадцать минут после включения. Каждый раз требовалось, чтобы человек нажал кнопку питания.
Как выглядит отключение из-за перегрева
Системный журнал просто останавливался посреди активности, без записи о завершении работы: при жёстком отключении питания у journald не остаётся времени на запись буфера. В июле после похожего отключения часы даже вернулись к старой дате. А аппаратный watchdog, который перезагружает зависшую машину, ничего не сделал, потому что машина не зависла: питание пропало.
Ложная зацепка
Последние строки ядра перед каждым отключением содержали ошибки нехватки памяти GPU (NV_ERR_NO_MEMORY), поэтому память выглядела виновной. Но это было не так. Эти строки были просто самым частым, что писало ядро: 440 580 таких строк за одну загрузку, которая длилась 19 дней до завершения. Когда строка появляется так часто, она будет последней перед любым событием. Прежде чем винить строку журнала, посчитайте, как часто она появляется, когда всё в порядке.
Верная зацепка
Поскольку журнал теряет последние минуты при отключении питания, мы добавили небольшой сэмплер, который каждую минуту записывает температуры, нагрузку и память в файл и сбрасывает его на диск. Он зафиксировал все пять отключений с июля. Каждое происходило при полной нагрузке GPU (96%), при температуре CPU от 85 до 97 °C.
Тайминг объяснил остальное. Примерно в начале сентября мы перенесли рендеринг видео на эту машину. Потребление GPU под полной нагрузкой выросло с примерно 24 Вт до 46 Вт, медианная температура GPU — с 68 до 86 °C, а количество минут в неделю с температурой CPU 95 °C и выше — с нуля до 4 283. Два других наших компьютера GB10, которые запускают языковую модель при той же нагрузке 96%, оставались в диапазоне 65–81 °C. Эта машина просто хуже охлаждалась.
Первое решение: ограничение частоты GPU
На GB10 утилита nvidia-smi не может задать лимит мощности, но может ограничить частоту GPU: nvidia-smi -lgc 0,2000. В июле это снизило температуру самой горячей зоны с 91 °C до 77–83 °C за считанные секунды. Важны две детали:
- Применяйте ограничение до запуска тяжёлых сервисов. Наш сервис ограничения сначала запускался примерно через 15 секунд после загрузки, когда сервер модели уже начал загружаться на полной мощности, — именно в этот момент машина и падала. Теперь он запускается до старта Docker.
- Проверьте под нагрузкой. При включённом ограничении тактовая частота GPU в простое составляет около 2 400 МГц. Под нагрузкой она держится на уровне 1 976 МГц.
Второе исправление: защитный механизм от перегрева с несколькими порогами
Ограничения оказалось недостаточно после подключения рендеринга, поэтому теперь защитный механизм считывает данные всех датчиков раз в секунду и действует поэтапно: снижение частоты GPU при 89 °C и повторное снижение при 92 °C; при 94 °C рендерер приостанавливается (SIGSTOP), а процессор замедляется; при 96 °C все задачи GPU приостанавливаются на время, необходимое для охлаждения. Пороги снижаются обратно только после того, как машина некоторое время остаётся прохладной. При 97 °C в течение 20 секунд аварийный тормоз полностью останавливает видеосервис.
За первые девять минут рендеринга самая горячая зона достигла пика в 94 °C при медиане 89 °C, тогда как раньше наблюдались плато на уровне 97 °C. Это имеет свою цену: в один из дней в середине сентября рендерер был приостановлен на 17% времени, а GPU большую часть дня работал на частоте 900 МГц или ниже. И это не панацея: машина снова выключилась сама, 11 октября, при 97–98 °C. С тех пор она работает без перерывов, 20 дней на момент написания этого текста.
Четыре ошибки, которые мы допустили по ходу работы
- Приостановка одной задачи не охладила машину. Тормоз сработал, когда рендерер уже был приостановлен, потому что модель генерации изображений всё ещё работала, а в ту же минуту запустились десятки таймеров. Теперь верхний порог приостанавливает все тяжёлые задачи GPU, а не только рендерер.
- Защитный механизм приостанавливает задачи по имени, а имена изменились. Дважды новый движок мог бы избежать приостановки: модель генерации изображений с новым именем процесса в сентябре и рендерер в октябре, который работает в контейнере, а не как дочерний процесс сервиса рендеринга. Теперь любое изменение движка включает проверку списка защитного механизма.
- Блокировка тормоза никогда не снималась. Он остановил видеосервис и оставил файл блокировки, чтобы ничего не перезапускалось. Никто не получал оповещений, и выпуск продукции остановился на три дня, прежде чем мы это заметили. Теперь блокировка снимается автоматически: через пять минут после последнего срабатывания тормоза, при отсутствии новых срабатываний, наличии не менее 30 ГБ свободной памяти и средней температуре за десять минут 93 °C или ниже. Ожидание охлаждения машины никогда не работало: средняя температура составляла 88 °C как с рендерингом, так и без него.
- Сигнал срабатывал при нормальной температуре машины. Порог оповещения составлял 88 °C, что было средним значением для этой машины. За один день она проводила 32% времени при температуре 90 °C и выше, 8% — при 93 °C и выше и 3% — при 95 °C и выше, никогда не достигая 97 °C. Мы перенесли сигнал на 97 °C, на плато, где машина действительно выходила из строя, и письма с оповещениями прекратились.
Главный вывод
Программное обеспечение поддерживало работу этой машины, но причина была физической: её охлаждение было в два-три раза хуже, чем у аналогичных машин. Если машина GB10 выключается сама под нагрузкой, сначала проверьте воздушный поток. Затем ограничьте частоту GPU перед запуском ваших сервисов, приостановите ресурсоемкие задачи до того, как машина достигнет предела, и настройте оповещения на основе фактических рабочих температур.
Factory Floor включает в себя защитный механизм от перегрева такого типа: он считывает показания самого горячего из датчиков GPU и тепловых зон, приостанавливает указанные вами ресурсоемкие задачи при заданной температуре (по умолчанию 92 °C) и возобновляет их только при температуре ниже порога (84 °C), а также содержит защитные механизмы для памяти и диска.