作者:Grace Sun,AMD工程师;来源:AMD Xilinx开发者社区
用户在目标平台运行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),编译模型时必须考虑到这一点。
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”}。
指纹是用于识别 DPU 目标的 64 位数字签名。 它由1个字节表示DPU类型、1个字节表示ISA版本、6个字节表示具体配置组成(feature code)。 指纹对于每个 DPU 配置都是唯一的,运行时依靠它来识别当前平台上运行的 DPU 实例,并验证模型是否是针对同一 DPU 目标编译的。 “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_fa...
在运行AI应用程序时DPU指纹校验失败的问题常见于自定义配置的DPU IP,通过DPU TRD重新编译后,未用更新后的arch.json重新编译模型。
对于 Vitis 流程中的自定义配置,您可以在此处找到 arch.json 文件:
$TRD_HOME/prj/Vitis/binary_container_1/link/vivado/vpl/prj/prj.gen/sources_1/bd/
在 Vivado 流程中,它位于此处:$TRD_HOME/prj/Vivado/hw/srcs/
此文件可用于上述vai_c_编译命令的-a选项。
如果您无法定位到上述文件,也可以在加载了board image的目标板上,用xdputil query命令获取当前的DPU指纹信息。xdputil的源码由Vitis AI Libray提供:
https://github.com/Xilinx/Vitis-AI/tree/master/src/vai_library/usefultools
以下给出了VCK5000开发板运行xdputil query的DPU信息部分打印示例:
![](https://cdn.eetrend.com/files/2023-11/wen_zhang_/100576175-325516-dpuxinxi.jpg)
可以看到,DPU目标名为DPUCVDX8H_ISA1_F2W4_4PE,指纹为0x5010000001e082f。
这部分信息可用于自建arch.json文件,包含类似以下内容:
{
"fingerprint":"0x5010000001e082f "
}
用新建的arch.json去重新编译模型,达到DPU匹配的结果。
最后提一下,如果您想关闭指纹检查,可以设置环境变量“XLNX_ENABLE_FINGERPRINT_CHECK=0”。 这在某些开发场景中可能有用。