作者:Grace Sun,AMD工程师;来源:AMD开发者社区
用户在目标平台运行Vitis AI所编译的xmodel时,碰到比较常见的问题之一是fingerprint校验失败。报告的错误类似以下信息:
CHECK fingerprint fail! model_fingerprint 0x101000016010407 is un-matched with actual dpu_fingerprint 0x101000056010407. Please re-compile xmodel.
本文将会详细介绍关于DPU Fingerprint的相关内容,并提供此类校验失败问题的检查手段和解决方案。
Vitis AI 提供一系列不同的深度学习处理单元 (DPU),适用于各种 Xilinx FPGA 设备,包括 Xilinx Zynq UltraScale+ MPSoC、Kria KV260、Versal 卡以及 U50LV、U200 和 U55C 等 Alveo 卡。 这些多样化的产品在吞吐量、延迟可扩展性和功率方面提供了独特的灵活性和差异化。 每个 DPU 都有独特的架构和指令集架构 (ISA),编译模型时必须考虑到这一点。
DPU Fingerprint是用于识别 DPU 目标的 64 位数字签名。 它由1个字节表示DPU类型、1个字节表示ISA版本、6个字节表示具体配置组成(feature code)。 指纹对于每个 DPU 配置都是唯一的,运行时依靠它来识别当前平台上运行的 DPU 实例,并验证模型是否是针对同一 DPU 目标编译的。
Vitis AI 编译器会根据 DPU 目标自动生成这些对应于特定 DPU 架构的指令代码。
以下列出了Vitis AI v3.5在不同框架下的编译命令:
TensorFlow
$ vai_c_tensorflow -f /PATH/TO/quantize_eval_model.pb -a /PATH/TO/arch.json -o /OUTPUTPATH -n netname
TensorFlow 2.x
$vai_c_tensorflow2 -m /PATH/TO/quantized.h5 -a /PATH/TO/arch.json -o /OUTPUTPATH -n netname
PyTorch
$vai_c_xir -x /PATH/TO/quantized.xmodel -a /PATH/TO/arch.json -o /OUTPUTPATH -n netname
其中-a (--arch)选项指定的是JSON 格式的 VAI_C 编译器的 DPU 架构配置文件。对于 AMD Vitis AI 版本中预编译的 DPU xclbins,您可以在 AMD Vitis AI docker (/opt/vitis_ai/compiler/arch ) 中找到相应的 arch.json 文件,内容应类似于 {"target": "DPUCZDX8G_ISA0_B4096"}。 对于定制的 DPU IP,相应的 arch.json 文件由 DPU TRD与 DPU IP 一起生成,内容应类似于 {“fingerprint”:”0x0101000016010407”}。
“DPUCZDX8G_ISA0_B4096”是编译器中预定义的特定指纹的别名。
DPU 目标或指纹是 Vitis AI 框架中用于表征不同 DPU 目标的唯一标识符。 DPU 指纹的重要性在于它可以正确匹配软件和硬件组件,如果检测到不匹配,将导致您的 AI 应用程序运行失败。
Vitis AI 编译器使用此信息将量化的 TensorFlow 或 PyTorch 模型转换为可在 DPU 上运行的二进制文件。 因此,必须针对特定目标编译每个模型。
以之前提到的DPU 目标“DPUCZDX8G_ISA1_B4096”为例。 对于此目标,ISA 版本为“0x01”,功能代码为“0x000056010407”。 因此,它在 Vitis AI 3.5 中的指纹是“0x101000056010407”。
要注意的是,随着 DPU 的功能不断改进,DPU 指纹可能会在 Vitis AI 版本之间发生变化。 例如,在 Vitis AI 2.5 中,目标“DPUCZDX8G_ISA1_B4096”的指纹为“0X101000016010407”,但在 Vitis AI 3.0 中已更新为“0x101000056010407”,在Vitis AI 3.5中未做更新。
有关 最新版本DPU 目标及其各自指纹的完整列表,可以参考此链接:
https://github.com/Xilinx/Vitis-AI/tree/master/src/vai_runtime/target_factory/targets
在运行AI应用程序时DPU指纹校验失败的问题常见于自定义配置的DPU IP,通过DPU TRD重新编译后,未用更新后的arch.json重新编译模型。
以ZCU102/104 DPU TRD为例,对于 Vitis 流程中的自定义配置,您可以在此处找到 arch.json 文件:
$TRD_HOME/prj/Vitis/binary_container_1/link/vivado/vpl/prj/prj.gen/sources_1/bd/<bd name>/ip/<bd name>_DPUCZDX8G_1_0/arch.json
在 Vivado 流程中,它位于此处:$TRD_HOME/prj/Vivado/hw/srcs/<top>/ip/<top>_DPUCZDX8G_0/arch.json
这个文件可用于上述vai_c_编译命令的-a选项。
实际上板运行遇到指纹不匹配的情况下,若是DPU TRD工程缺失而无法定位到上述文件,也可以借助xdputil工具去获取当前xmodel和目标平台的DPU指纹信息。xdputil的源码由Vitis AI Libray提供:
https://github.com/Xilinx/Vitis-AI/tree/master/src/vai_library/usefultools
要获取已有deploy xmodel的DPU指纹信息,可以运行xdputil model命令:
xdputil xmodel <xmodel> -l
-l会列出subgraph的属性,指纹信息包含在DPU subgraph的信息内。以下是一个示例:
可以看到,对应编译时所用的DPU目标名为DPUCVDX8H_ISA1_F2W2_8PE,指纹为0x501000000140fee。
在加载了board image的目标开发板上,则可以用xdputil query命令获取当前平台的DPU指纹信息。
以下给出了VCK5000运行xdputil query的DPU信息部分打印示例:
可以看到,DPU目标名为DPUCVDX8H_ISA1_F2W4_4PE,指纹为0x5010000001e082f。
当应用程序所加载的xmodel所含DPU指纹信息与目标平台的DPU信息不匹配时,上述指纹信息可用于自建arch.json文件,包含类似以下内容:
{
"fingerprint":"0x5010000001e082f "
}
用新建的arch.json去重新编译量化模型,以达到DPU匹配的结果。
最后提一下,如果您想关闭指纹检查,可以设置环境变量“XLNX_ENABLE_FINGERPRINT_CHECK=0”。 这在某些开发场景中可能有用,例如经确认fingerprint虽然报错,但实际上xmodel和平台xclbin的指纹都是匹配的,可借助此环境变量继续测试。