使用nvidia-smi的最佳策略是什么?



我使用Tesla K20c,并在运行应用程序时使用nvidia-smi测量功率。我的问题是电力消耗没有达到稳定状态,而是不断上升。例如,如果我的应用程序运行100次迭代,功率达到106W(在4秒内),1000次迭代达到117 W(在41秒内),10000次迭代达到122W(在415秒内),以此类推,每次都略有增加。我写这封信是为了推荐我应该记录的功率值。在我的实验设置中,我有超过400个实验,每个实验进行10000次迭代是不可行的,至少现在是这样。这个应用是矩阵乘法,它可以在一次迭代中完成,只需要几毫秒。增加迭代次数不会给结果带来任何价值,但它会增加运行时间,从而允许进行电源监视。

您看到功耗随着时间的推移而增加的原因是GPU在持续负载下正在升温。电子元件在升高的温度下消耗更多的功率,主要是由于欧姆电阻的增加。此外,特斯拉K20c是一款主动冷却的GPU:当GPU升温时,卡上的风扇旋转得更快,因此需要更多的电源。

我在K20c上做了一个和你的非常相似的实验,持续了大约10分钟。我发现,在5到6分钟后,功耗趋于稳定,并且在此之后只有+/-2 W的噪声级振荡。这可能是由于风扇的温度控制反馈回路中的滞后,或者由于每个内核结束时GPU的不完全利用造成的短期波动。风扇转速差异导致的功耗差异约为5w。GPU需要相当长的时间才能达到稳定状态的原因是整个组件的热容量,它有相当大的质量,包括固体金属背板。

您的测量似乎是针对在运行400个不同的代码变体时确定相对功耗。实现稳态功耗似乎并不重要,只是每个变体测试的条件尽可能平等。请记住,GPU的功率传感器不是为提供高精度测量而设计的,因此为了进行比较,您可能希望假设噪声水平为5%。为了进行准确的比较,您甚至可能需要从多个相同类型的GPU中平均测量,因为制造公差可能导致多个"相同"GPU之间的功耗变化。

因此,我建议使用以下协议:运行每个变体30秒,在接近该间隔结束时测量功耗。然后让GPU空闲30秒,让它在运行下一个内核之前冷却下来。这应该为每个变体提供大致相等的起始条件。如果您发现温度升高的时间较长,则可能需要稍微延长建议的空闲时间。nvidia-smi报告的温度数据可以在这里指导你。有了这个过程,您应该能够在一夜之间完成400个变体的测试。