HB_BPU_runModel报错

运行基于DnnPredictMethod的方法,PrepareInputData可以正常完成,不过会在到达DnnPostProcessMethod::ParseDnn之前报错,

[1970-01-01 08:37:04 ERROR 547742544032 bpu_mem_pool.h:67] no more data can be alloc

[1970-01-01 08:37:04 ERROR 547742544032 bpu_engine.cc:185] alloc model run task failed

(DnnPredictMethod.cpp:433): HB_BPU_runModel failed: bpu model runtask alloc failed

查看了一下,这个错看起来是说bpu的内存不够了。我的模型并不大,转换后的bin只有64MB,不过处理的是roi,在报错的这次运行中,有11个roi被送入了PrepareInputData。我看DnnPredictMethod::DoProcess的源码,它是使用的异步模式,会对每个roi调用一次HB_BPU_runModel,立即返回,而这个返回值并不为0。由于是异步模式,所以我有理由认为,这个返回值和模型运行无关,也就是说并不是模型运行过程造成的内存不足,而只是输入数据就引发了内存不足的错误。但是按理说,之前的DnnPredictMethod::PrepareInputData已经将输入数据的BPU_TENSOR_S分配好了,只要DnnPredictMethod::PrepareInputData没报错,HB_BPU_runModel并不需要分配什么内存了。由于HB_BPU_runModel没有源码,我也不知道它内部干了什么。那么这个错误的具体原因是什么?有什么解决办法吗?

这个是因为调用异步接口没有释放task,导致内存池消耗太大。

可以把每个异步接口的task返回,判断模型是否运行结束,结束后释放task:-
HB_BPU_waitModelDone(&task_handle); //判断模型运行结束

HB_BPU_releaseTask(&task_handle); // 释放task

目前默认最多支持32个异步task,也可以通过接口来设置task最大上限:-
HB_BPU_setGlobalConfig(BPU_GLOBAL_CONFIG_MAX_TASK_NUM, 64); //设置最大上限为64个