如何使用MemryX MX3进行独立功率测量
在第1至第3部分中,我们建立了一种针对边缘AI加速器的独立功耗测量方法。在第4和第5部分中,我们将该方法应用于Axelera Metis和DeepX M1。
系列:边缘AI性能评测
•第一部分:Hailo-8,参考方法论
•第二部分:使用ElmorLabs进行电源插入
•第三部分:使用 INA228 测量边缘 AI 功耗
•第四部分:测量Axelera Metis的能效
•第五部分:测量 DeepX M1 的功耗效率
•第六部分:测量MemryX MX3的功耗效率(本文)
现在我们对MemryX MX3 M.2加速模块应用相同的方法。
安装 MemryX SDK
MemryX 提供了关于安装其驱动程序、运行时环境和工具的详细说明:
•MemryX 开发者中心
•开始使用
•安装运行时环境
•安装工具
安装完成后,我创建了一个名为“venv-mx”的Python虚拟环境,并使用mx_bench工具确认了MemryX MX3模块的存在:
重现MemryX基准测试
在测量功耗之前,我想先复现MemryX发布的基准测试。与之前的几篇文章一致,我选择了ResNet50,因为它是分类模型中后处理阶段最轻的结构。
•MemryX Model Zoo
•ResNet-50(MXA优化版)
•14 TFLOPS(600 MHz):1778 FPS
•20 TFLOPS(850 MHz):2317 FPS
他们发布了两个不同的基准测试。第一个基准测试对应默认配置(600 MHz 时钟)。第二个基准测试是在超频模式下进行的(850 MHz 时钟)。
我们的首要目标是达到每秒1778帧的基准水平。
我会尝试在超频模式下进行相同操作,但不确定我的主机是否支持此功能。
为了测量ResNet50模型的FPS指标,我从MemryX模型动物园下载了以下文件:
•ResNet-50(MXA优化版)
14 TFLOPS的吞吐量结果
MemryX 提供了一个基准测试工具 mx_bench,该工具接收一个编译后的 .dfp 模型和帧数,然后报告平均帧率(FPS)和系统延迟:
同一模块连续两次运行,吞吐量均精确为1796.36 FPS,延迟仅略有差异(3.24 ms vs. 3.31 ms)。
我不仅达到了MemryX发布的14 TFLOPS(600MHz)基准测试中的1778 FPS,还以约1%的差距超过了这一数值,达到了1796 FPS。
20 TFLOPS的吞吐量结果
为了访问MemryX MX3的20 TFLOPS性能,我需要将频率提升至850MHz。
可以通过 mx_set_powermode 命令实现:
进入MX3 Power Tweak Utility的图形界面后,选择:
•1 - 设置电源模式(4芯片模块)
•9 - 850 MHz
•OK
•3- 退出
所有高于600 MHz的频率都标为红色,这或许是对即将发生情况的预示,但我还是继续推进到了850 MHz。
我注意到频率变化只有在重启后才会生效。
这是一幅令人着迷的精彩画面。
在冷启动测试中,我实现了约0.8%的提升,超过了公布的2317 FPS基准值,达到2335 FPS。
然而,随着MX3模块温度升高,我们很快达到了100°C,从而触发了热节流。
最终,由于高温和热节流,我们的性能下降至1887 FPS,随后降至1425 FPS。
这些正是我未来探索中希望更深入研究的热力学动力学。
由于本系列最初仅关注供应商发布的基准测试结果,而这些测试似乎是在理想冷启动场景下进行的,因此我将在功耗评估中保留三次运行中的第一次。
使用 mb-powermon.py 测量 MemryX MX3 的功耗
我们将采用在第3部分中建立的方法,使用基于INA228的定制电源测量工具。
因此,我们将使用本系列中一直使用的同一个 mb-powermon.py 工具:
•AlbertaBeef/mb-powermon
在 MemryX 虚拟环境中,安装以下 Python 包:“pyftdi”、“adafruit-blinka” 和 “adafruit-circuitpython-ina228”:
请确保您有权访问所列的 FTDI USB 设备(此处适用与第3至5部分相同的 fix-ft232h-permissions.sh 脚本)。
测量 MemryX MX3 在 14 TFLOPS 下的性能
在将MX3配置为14 TFLOPS(600 MHz时钟)并重启后,按以下方式启动mb-powermon工具:
如果我们重新在另一个控制台中运行推断:
在此运行期间,您将看到类似以下内容(视频以10倍速播放):
如果我们将 output.csv 文件转换为用户友好的.html 格式,就可以绘制各运行的功率和温度曲线:
INA228在三次运行中报告了多种数值。与其它厂商的电源大多保持稳定的情况不同,MX3的电源读数持续上升。第一次运行时达到约11.0 W,第二次约为11.4 W,第三次约为12.1 W。这种上升很可能是因为每次运行期间芯片上的温度读数分别升至约65°C、70°C,随后达到约90°C。
由于本系列文章仅关注冷启动情况,旨在重现供应商的最佳场景,因此我将采用约11.0 W的初始结果作为对比参考。
使用MemryX MX3内置遥测功能测量其功率
在收到初步结果后,MemryX向我寄送了他们MX3模块的样品,该模块内置遥测功能。这使我能够以类似Hailo-8模块的方式验证自己的独立电源测量方法。
这些结果最突出的一点是,INA228的测量值略高于MemryX自身的测量值。
这是预期的行为。每个分流电阻都会在其自身两端产生一个小电压,导致下游负载的供电电压略有降低。由于功率 P = V · I,负载消耗的功率也相应减少,因此下游的感应电阻读数也会相应降低。INA228 位于 MemryX 内部分流电阻的上游,这会导致读数偏高。
在20 TFLOPS下测量MemryX MX3的功耗
在将MX3配置为20 TFLOPS(850 MHz时钟)并重启后,按以下方式启动mb-powermon工具:
请注意,我们为本次运行指定了两个额外的参数:
•–ina228-最大电流 10
•将最大电流增加至10A
•否则,当电流超过默认的最大值5A时,我们将获得NULL读数。
•–power-max 25.0
•为更好地观看本次高功率会话
如果我们重新在另一个控制台中运行推断:
在此运行期间,您将看到类似以下内容(视频以10倍速播放):
如果我们将 output.csv 文件转换为用户友好的.html 格式,就可以绘制各运行的功率和温度曲线:
INA228在首次运行期间平均报告约20.2 W,芯片上的温度读数迅速上升至约90°C。
在一次短暂的冷启动测试中,MX3在20.2瓦功耗下达到了2335帧每秒,功耗效率为116 FPS/W。
如果我们观察第二和第三次运行,就会发现MX3的保护性热节流功能开始发挥作用。每次芯片温度达到100°C时,功耗都会下降。尽管如此,在第三次运行结束时,我们仍观察到芯片温度达到了107°C。
热学考虑
在14 TFLOPS的结果中,可以明显看出,在相同的吞吐量下,我们观察到不同的功耗值(约11.0W、约11.4W、约12.1W)。
这是由于温度所致。MemryX MX3 硅晶片温度越高,为维持相同工作负载所需的功耗就越大。
MemryX 提供四个温度读数,分别对应四个 MX3 芯片:
•T0 => 最热
•T1
•T2
•T3
由于第一个芯片是模块的入口,它在推理流水线中承担了主机端I/O负载,因此T0的温度高于其他三个。
热限流
MemryX 在其开发者中心的故障排除页面中记录了热节流机制:
•M.2散热不足
M.2上的每个MX3芯片必须保持在100°C以下;否则,它将开始因过热而降低频率50%。
每个芯片的节气门状态(以及其温度)可通过“/sys/memx0/temperature”进行监控:
(相同的信息也可通过 MemryX 运行时 API 程序化获取。)
如果我们分析三次运行,每轮20 TFLOPS的会话:
我们可以看到,在运行2中,仅有一个芯片(TS0)达到100°C,因此被限制在50%的功率。
在运行3中,我们可以看到四个芯片依次达到100°C。第一个芯片(TS0)位于运行开始阶段;第二个和第三个芯片(TS1、TS2)出现在运行中间阶段;第四个芯片(TS3)则在运行末期附近。在峰值温度时,四个芯片的温度分别为:TS0=106°C、TS1=103°C、TS2=106°C、TS3=100°C,并且在会话开始仅5分钟后就触发了热节流保护。
要实现持续20 TFLOPS的吞吐量,必须采用主动冷却方案,以确保四个芯片的温度均保持在约95°C以下。否则,在20 TFLOPS基准测试的每次运行中,只有首次运行能反映出时钟频率提升的效果;之后的每次运行平均都会出现越来越多的瓶颈时间被限制的情况。
空闲功耗
对于对功耗敏感的应用,了解MemryX MX3模块在开机但未运行推理时的功耗情况非常有用。
在我的支持ASPM的AMD Ryzen AI MAX+ 395电脑上,MemryX MX3模块协商将ASPM设为关闭。
我测得了两个不同的怠速功率水平:
•1.28 W - ASPM 关闭 - 启动后,AI 推理前
•1.92 W - ASPM 关闭 - 空闲状态,AI 推理后
由于我对空闲功耗的兴趣发生在AI推理会话之间,因此我将忽略推理前的空闲功耗测量。
对于不持续进行推理的常驻应用而言,这种空闲功耗本身就是一项基准:
早期MX3模块的已知问题
由于我之前已经拥有的MX3模块,我在使用MemryX模块时遇到了电脑无法启动的问题。
在我的 AMD Ryzen AI MAX+ 395 电脑上,为了进行此项调查,我不得不将“重新调整 BAR”配置更改为“禁用”。
MX3 显示一个固定的 256MB 32 位非预取 BAR,这意味着它必须位于小于 4GB 的 MMIO 窗口内,且不能被重新定位到该区域之上。当启用可重置 BAR 时,固件会为其他设备(尤其是 Radeon iGPU)分配较大的可重置窗口;而在没有“超过 4G 解码”选项的平台上,这会导致占用小于 4GB 的空间过度,从而无法为 MX3 的固定 BAR 提供连续的内存空间,导致启动时卡死。禁用可重置 BAR 可强制采用保守的 BAR 定位方式,使 MX3 正确地映射到 0x80000000 地址。
在我的 AMD Ryzen AI MAX+ 395 处理器上,集成的 Radeon iGPU 和 XDNA NPU 在禁用 Re-Size BAR 的情况下仍能完全正常工作。唯一缺失的是针对 iGPU 的 ReBAR/SAM 优化,这在受益于该优化的工作负载中会略微降低理论吞吐量。
此问题在较新的MX3模块中不存在,因为它们分配了两个较小的BAR,而不是一个较大的BAR。
结论
在本文中,我们已成功将功率测量方法应用于MemryX MX3 M.2模块。
在MemryX的MXA优化ResNet50模型中,配置为14 TFLOPS(600 MHz)的MX3在约11.0 W功耗下可实现1796 FPS,即每瓦约163 FPS。
这非常令人印象深刻,MX3的性能达到1796 FPS,位居第二。然而,由于功耗较高,在ResNet50方面的能效表现则排在最后。
尽管MX3在20 TFLOPS模式下以2335 FPS的性能位居榜首,但由于热限制,无法保持这一领先地位。
注意:MX3(M.2)20 TFLOPS的基准测试不可持续,因为它会迅速达到100°C,并发生热限流。该模式需要更高效的散热解决方案,例如Thermalright HR10 PRO。
需要注意的是,Axelera Metis 模块采用 LPDDR,而 Hailo-8 和 MemryX MX3 模块则不采用。此外,MemryX 模块有 2 条通道,而其他模块则为 4 条。
MemryX 的一项新功能是,我们不再需要将多个模型合并为一个 DFP 来实现多推理管道。这无疑是我未来探索中希望评估的一项功能。
MemryX 流的易用性在这里无法被过分强调。作为行业应用范例,值得注意的是,目前 Edge Impulse 支持的唯一 M.2 AI 加速器是 MemryX MX3。
本文编译自hackster.io





