我们的 GB10 机器总是自动关机。日志显示是内存问题,但其实是过热。
运维
我们三台 NVIDIA GB10 机器中的一台在九月的四天内黑屏了三次:9 月 10 日、9 月 12 日(关机持续了 17 小时)以及 9 月 13 日(重新开机后 12 分钟)。每次都需要有人按下电源按钮。
过热关机的样子
系统日志在运行中途戛然而止,其中没有关机记录:硬断电不会给 journald 留出写入缓冲区的时间。七月,在一次类似的关机后,时钟甚至回到了旧日期。而负责重启挂起机器的硬件看门狗也无动于衷,因为机器并没有挂起:电源断了。
错误的线索
每次死机前的最后几行内核日志都是 GPU 内存不足错误(NV_ERR_NO_MEMORY),因此内存看起来是罪魁祸首。其实不是。这些行只是内核写入的最常见内容:在一次持续运行 19 天后结束的启动中,就有 440,580 条这样的记录。当某行日志出现得如此频繁时,它往往就是任何事件前的最后一行。在归咎于某条日志之前,先统计一下它在一切正常时出现的频率。
正确的线索
由于断电会导致日志丢失最后几分钟,我们添加了一个小型采样器,每分钟将温度、负载和内存写入文件并刷新到磁盘。它捕捉到了七月以来的全部五次死机。每次死机都发生在 GPU 满载(96%)时,CPU 温度为 85 到 97 °C。
时间线解释了其余情况。九月初前后,我们将视频渲染任务移到了这台机器上。其 GPU 在满载下的功耗从约 24 W 升至 46 W,GPU 中位温度从 68 °C 升至 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 MHz。在负载下,它稳定在 1,976 MHz。
第二个修复:分步热防护机制
当渲染任务介入后,仅靠上限已不足够,因此防护机制现在每秒读取一次所有传感器,并分步执行:从 89 °C 开始降低 GPU 时钟频率,从 92 °C 开始再次降低;从 94 °C 开始暂停渲染器(SIGSTOP)并降低 CPU 速度;从 96 °C 开始暂停所有 GPU 任务,直到冷却所需的时间。只有在机器保持较冷状态一段时间后,它才会逐步恢复。如果在 97 °C 持续 20 秒,最后手段的制动机制将完全停止视频服务。
在渲染任务开始后的前九分钟内,最热区域峰值为 94 °C,中位数为 89 °C,而此前曾出现 97 °C 的平台期。这有代价:在九月中旬的一天,渲染器有 17% 的时间处于暂停状态,且 GPU 在一天的大部分时间里运行在 900 MHz 或更低频率。这也不是根治方案:机器在 10 月 11 日再次自行关机,温度为 97 至 98 °C。自那以后,它已连续运行,截至我们撰写本文时已运行 20 天。
我们沿途犯下的四个错误
- 暂停单个任务并未使机器冷却。制动机制在渲染器已暂停时触发,因为图像模型仍在绘制,且同一分钟内启动了十几个定时器。现在最高级别会暂停所有重型 GPU 任务,而不仅仅是渲染器。
- 防护机制按名称暂停任务,而名称发生了变化。两次新引擎差点逃脱暂停:九月一个具有新进程名称的图像模型,以及十月一个在容器中运行而非作为渲染服务子进程的渲染器。现在每次更换引擎时,都会检查防护机制的列表。
- 制动机制的保持状态从未解除。它停止了视频服务并留下一个保持文件,以防止任何重启。也没有任何警报通知任何人,输出停止持续了三天,直到我们注意到。现在保持状态会自动解除:在最后一次制动后五分钟,没有新的制动,至少 30 GB 内存空闲,且十分钟平均温度为 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)时恢复运行,同时配有内存和磁盘防护机制。