1.芯片型号:J5
2.天工开物开发包OpenExplorer版本:J5_OE_1.1.40
3.问题定位:板端部署
4.问题具体描述:部署时,用chrono记录的推断时间和静态评估的推断时间差距较大,想问下是什么原因造成的。记录的时间是hbDNNInfer和hbDNNWaitTaskDONE。
1.芯片型号:J5
2.天工开物开发包OpenExplorer版本:J5_OE_1.1.40
3.问题定位:板端部署
4.问题具体描述:部署时,用chrono记录的推断时间和静态评估的推断时间差距较大,想问下是什么原因造成的。记录的时间是hbDNNInfer和hbDNNWaitTaskDONE。
感谢您使用地平线芯片算法工具链,最近我们在收集大家的满意度反馈,欢迎您填写问卷,详细情况可见:https://developer.horizon.ai/forumDetail/146177053698464782
您好。首先您记录的时间点是对的,并且上板性能实测和hb_perf的结果确实会有一定差异。您可以再用hrt_model_exec工具的perf功能多跑一些帧数(比如1000帧以上)看一下性能评测的结果。此外,第一帧通常由于要做一些资源分配和线程初始化的操作,慢一点是正常的。使用hrt_model_exec perf功能时,单核单线程用于评估latency,双核多线程用于评估FPS。
hb_perf的结果是53ms,hrt_model_exec perf的结果达到了236ms,这是正常的吗?
hb_perf只包括了对BPU算子的估计,没有带上CPU。hrt_model_exec perf会计算BPU+CPU所有算子一块的总耗时。如果您模型的CPU算子较多,是会出现板端实测差异和hb_perf很大的情况,关于性能优化,可以参考J5工具链用户手册的4.1.1.7.3. 模型性能优化章节。
hb_perf得到的图是这样的。我看了约束算子,softmax可以指定到bpu上,我是这样设置的,但是softmax还是在cpu上,是没设置对吗。transpose后面几个也不在bpu上。softmax和transpose的属性是这样的。
run_on_bpu: 之后跟的是算子的具体名称,比如图中的“Transpose_230”这样的名字。
是直接写{节点名称1;节点名称2}这样,还是{节点名称1:“节点类型1”;节点名称2:“节点类型2”}
run_on_bpu: ‘Transpose_229; Transpose_229’
单独一行这样写就行,没有大括号
替换成softmax算子的具体名称
算子全上bpu后延时差距确实是大幅度缩小。hb_perf给出的延迟上升到59ms,板上hrt_model_exc的延迟降到了82。这个差距还能降低吗。hb_perf是否是不计入量化和反量化节点的延迟?
量化和反量化是cpu算子,hb_perf不包含这两个算子的耗时。可以使用hb_model_modifier把量化反量化算子删除,在前后处理中实现。
所以,前后处理和模型中只要一个有量化和反量化就行是吧
是的,量化和反量化肯定是要做的,要么放在模型里做,要么放在前后处理做。我们也提供plugin的方式让DSP计算模型内部的量化反量化算子。可以查看工具链手册的DSP部分
连续跑多帧后报错,好像是内存不足?应该怎么解决
可能是代码里循环的设置有问题,比如没有释放旧的内存就又申请了新的内存。
看报错信息应该是没有释放旧的task,就又申请了新的task。每一帧都是一个单独的task。可以参考ddk/samples/ai_forword_view_sample/src/modules/inference_module.cc,查看InferenceModule::DoInference函数,了解循环起止点合适的位置。
DoInference本身就是一个完整的循环
只在inti的时候使用过hbSysAllocCachedMem和malloc。难道是每跑完一帧都需要用hbSysFreeMem释放掉input_tensors和output_tensors,然后再重新hbSysAllocCachedMem吗?