跳到主要内容

常见问题和解决方案

NPU 推理运行时间过长

问题描述

在使用 NPU 进行模型推理时,程序运行的时间极长,甚至超过 5 分钟。

程序通常卡在模型推理之前,预处理之后。以 Res50 测试程序为例,程序会卡在如下位置超过 5 分钟:

$ ./resnet50_example
********** preprocess image **********
********** run model **********

此后程序将正常运行并输出结果。

原理

HHB 运行时 hhb_runtime 程序被设计为在 NPU 上第一次运行时进行 JIT 编译,将模型转换为更加高效的方式。这导致了第一次运行时的时间非常长。

然而,由于 HHB 运行时的设计缺陷,每次运行都会重新 JIT 编译模型,这使得每次运行的时间都很长。

hhb_runtime 程序的源代码位于 hhb_out/main.c。你可以在函数 void *create_graph(char *params_path) 中找到 JIT 逻辑。

解决方案

为了解决这个问题,你可以将 hhb_runtime 程序的输入改为已经优化后的模型 shl.hhb.bm。它会在使用 hhb.bm 作为参数运行 hhb_runtimehhb_jit 程序时在当前文件夹下生成。

以下命令分别展示了使用原始模型和 JIT 模型运行 hhb_runtime

$ hhb_out/hhb_runtime hhb_out/hhb.bm input_img.tensor # 使用原始模型运行
$ hhb_out/hhb_runtime shl.hhb.bm input_img.tensor # 使用 JIT 模型运行

对于 Resnet50 示例程序,可以将应用程序源码 main.cppmain 函数中的 system() 函数调用的参数改为上述代码块高亮命令。

提示

shl.hhb.bm 仅会在 NPU 推理时生成,CPU推理无此文件,且在 CPU 推理时,hhb_runtime 程序会直接使用 hhb.bm 模型文件,不需要 JIT 编译。