029、NPU的时钟与功耗管理:动态电压频率调整(DVFS)一次深夜的功耗崩溃凌晨两点,实验室的示波器还在跳。我盯着NPU的电流波形,心里骂了句脏话——明明跑的是同一个模型,白天测试时功耗还稳在3.5W,到了晚上批量推理时直接飙到6.2W,芯片温度从65℃冲到95℃,然后系统自动降频,推理延迟从8ms变成35ms。客户那边等着验收,这锅谁来背?后来查了三天,问题出在DVFS策略上。NPU的负载不是均匀的,卷积层和全连接层的计算密度差了一个数量级,但我们的DVFS策略是按“平均负载”调的。卷积层跑得慢但功耗低,全连接层跑得快但功耗高,平均下来电压频率都取了个中间值——结果卷积层电压给高了浪费功耗,全连接层电压给低了导致时序违规,芯片内部悄悄做了多次重算,功耗反而飙升。从那以后,我养成了一个习惯:写NPU驱动时,第一件事不是调算法,而是先把DVFS的粒度搞清楚。DVFS不是简单的“降频省电”很多人以为DVFS就是“负载高了升频,负载低了降频”,跟手机CPU那套一样。但NPU的DVFS比CPU复杂得多,原因有三:第一,NPU的计算密度极度不均匀。CPU的负载变化是毫秒级的,NPU的负载变化是微秒级的——一个卷积层可能持续几百微秒的高负载,紧接着一个池化层几乎空载。如果DVFS的响应时间跟不上这个节奏,要么浪费功耗,要么性能崩盘。第二,NPU的电压-频率关系不是线性的。我实测过某款28nm工艺的NPU,频率从500MHz升到600MH
029、NPU的时钟与功耗管理:动态电压频率调整(DVFS)
029、NPU的时钟与功耗管理:动态电压频率调整(DVFS)一次深夜的功耗崩溃凌晨两点,实验室的示波器还在跳。我盯着NPU的电流波形,心里骂了句脏话——明明跑的是同一个模型,白天测试时功耗还稳在3.5W,到了晚上批量推理时直接飙到6.2W,芯片温度从65℃冲到95℃,然后系统自动降频,推理延迟从8ms变成35ms。客户那边等着验收,这锅谁来背?后来查了三天,问题出在DVFS策略上。NPU的负载不是均匀的,卷积层和全连接层的计算密度差了一个数量级,但我们的DVFS策略是按“平均负载”调的。卷积层跑得慢但功耗低,全连接层跑得快但功耗高,平均下来电压频率都取了个中间值——结果卷积层电压给高了浪费功耗,全连接层电压给低了导致时序违规,芯片内部悄悄做了多次重算,功耗反而飙升。从那以后,我养成了一个习惯:写NPU驱动时,第一件事不是调算法,而是先把DVFS的粒度搞清楚。DVFS不是简单的“降频省电”很多人以为DVFS就是“负载高了升频,负载低了降频”,跟手机CPU那套一样。但NPU的DVFS比CPU复杂得多,原因有三:第一,NPU的计算密度极度不均匀。CPU的负载变化是毫秒级的,NPU的负载变化是微秒级的——一个卷积层可能持续几百微秒的高负载,紧接着一个池化层几乎空载。如果DVFS的响应时间跟不上这个节奏,要么浪费功耗,要么性能崩盘。第二,NPU的电压-频率关系不是线性的。我实测过某款28nm工艺的NPU,频率从500MHz升到600MH