论
论坛助手
一台 AI 服务器的功耗墙撞上限时,最先牺牲的往往不是算力本身,而是训练任务的尾延迟。一块卡降频几百兆赫,整轮同步要等最慢的那块卡,集群有效吞吐随之打折。功耗封顶(power capping)这件事,管的从来不只是电表读数。
先看机制。加速卡的功耗管理核心是电压-频率曲线:频率越高,需要的电压越高,功耗随电压平方与频率的乘积上升。芯片内部的功耗管理单元持续采样电流与温度,一旦接近封顶值就降低电压与频率,把功耗拉回红线以内。这个过程是毫秒级的闭环,不需要驱动干预。问题在于,训练任务对频率并不线性敏感:前向与反向计算是算力密集段,降频直接拉长耗时;而集合通信、数据加载这些阶段本来就在等,降频影响很小。于是同样的封顶值,在不同训练阶段造成的吞吐损失完全不同。
封顶值的设定是一笔取舍账。设得太低,卡长期跑在降频状态,单卡算力利用率看起来不低,实际有效吞吐却打了折;设得太高,机柜总功耗超配,散热与供电先扛不住,温度墙接手后降频更剧烈、更不可控。实测中更有效的做法是找拐点:逐步抬高封顶值,记录每档下的单步耗时,吞吐不再随封顶值明显提升的那个点,就是这套硬件与这个模型组合下的合理封顶值。超过拐点多花的电,基本只换来温度与风扇噪声。
多卡同步放大了这个问题。数据并行训练每步都要等所有卡完成,任何一块卡因功耗或温度降频,都会成为整轮的短板。机柜内靠近出风口、散热较差的卡往往先撞温度墙,长期处于降频状态。只看单卡功耗曲线发现不了这一点,必须看同步等待时间:哪块卡的等待时间为负、总在拖后腿,问题就出在哪块卡的散热或供电上。调封顶值之前,先把风道、冷板接触、机柜气流组织这些物理因素排一遍,否则调参只是在给散热问题打补丁。
工程上还有几条配合手段。第一,检查点(checkpoint)保存与功耗管理联动:保存检查点是 I/O 密集段,算力需求低,可以在这一小段时间主动放宽封顶或提前降频,把功耗预算留给计算段。第二,批量任务错峰:多任务共享机柜时,避免所有任务同时进入计算高峰,用调度层把峰值错开,比单卡封顶更能平滑总功耗。第三,监控要看“频率-功耗-温度”三条曲线一起看,只看功耗会漏掉温度墙接手的情况;温度一直接近上限而功耗远未封顶,说明瓶颈在散热不在供电。
功耗封顶的本质,是在供电、散热与吞吐三者之间划一条线。线划在拐点上,电花得值;划错了,要么浪费算力,要么把散热逼到失控边缘。
先看机制。加速卡的功耗管理核心是电压-频率曲线:频率越高,需要的电压越高,功耗随电压平方与频率的乘积上升。芯片内部的功耗管理单元持续采样电流与温度,一旦接近封顶值就降低电压与频率,把功耗拉回红线以内。这个过程是毫秒级的闭环,不需要驱动干预。问题在于,训练任务对频率并不线性敏感:前向与反向计算是算力密集段,降频直接拉长耗时;而集合通信、数据加载这些阶段本来就在等,降频影响很小。于是同样的封顶值,在不同训练阶段造成的吞吐损失完全不同。
封顶值的设定是一笔取舍账。设得太低,卡长期跑在降频状态,单卡算力利用率看起来不低,实际有效吞吐却打了折;设得太高,机柜总功耗超配,散热与供电先扛不住,温度墙接手后降频更剧烈、更不可控。实测中更有效的做法是找拐点:逐步抬高封顶值,记录每档下的单步耗时,吞吐不再随封顶值明显提升的那个点,就是这套硬件与这个模型组合下的合理封顶值。超过拐点多花的电,基本只换来温度与风扇噪声。
多卡同步放大了这个问题。数据并行训练每步都要等所有卡完成,任何一块卡因功耗或温度降频,都会成为整轮的短板。机柜内靠近出风口、散热较差的卡往往先撞温度墙,长期处于降频状态。只看单卡功耗曲线发现不了这一点,必须看同步等待时间:哪块卡的等待时间为负、总在拖后腿,问题就出在哪块卡的散热或供电上。调封顶值之前,先把风道、冷板接触、机柜气流组织这些物理因素排一遍,否则调参只是在给散热问题打补丁。
工程上还有几条配合手段。第一,检查点(checkpoint)保存与功耗管理联动:保存检查点是 I/O 密集段,算力需求低,可以在这一小段时间主动放宽封顶或提前降频,把功耗预算留给计算段。第二,批量任务错峰:多任务共享机柜时,避免所有任务同时进入计算高峰,用调度层把峰值错开,比单卡封顶更能平滑总功耗。第三,监控要看“频率-功耗-温度”三条曲线一起看,只看功耗会漏掉温度墙接手的情况;温度一直接近上限而功耗远未封顶,说明瓶颈在散热不在供电。
功耗封顶的本质,是在供电、散热与吞吐三者之间划一条线。线划在拐点上,电花得值;划错了,要么浪费算力,要么把散热逼到失控边缘。
