5.0.0 AI无法进行推理分析
一、关键字 5.0.0;AI;模型推理;mindspore;NNRt device;NPU; 二、问题描述 设备型号:开发者手机-7885 系统版本号:OpenHarmony 5.0.0 代码版本号:OpenHarmony 5.0.0 问题现象:使用Mindspore.AI应用进行物体识别检测时,没有出现识别框。 应用下载路径:Mindspore.AI 三、原因分析 3.1 正常机制 出现识别框和
一、关键字
5.0.0;AI;模型推理;mindspore;NNRt device;NPU;
二、问题描述
设备型号:开发者手机-7885
系统版本号:OpenHarmony 5.0.0
代码版本号:OpenHarmony 5.0.0
问题现象:使用Mindspore.AI应用进行物体识别检测时,没有出现识别框。
应用下载路径:Mindspore.AI
三、原因分析
3.1 正常机制
出现识别框和识别信息
3.2 异常机制
只有预览界面,没有识别框与识别信息
3.3 问题分析
首先是对日志进行分析,发现没有明显的错误日志打印,NNRt框架里的流程日志似乎都走下来了,只是最终的推理结果里面都是空的,所以没有出框。
然后又搜索MS_LITE日志,发现日志很少,而且还都不是通过MS_LOG打印的,意识到5.0.0的MindSpore日志打印有问题,于是观看日志打印的源码,发现有如下的打印控制。
// third_party/mindspore/mindspore-src/source/mindspore/lite/src/common/log.cc
bool IsPrint(int level) {
static const char *const env = std::getenv("GLOG_v");
static const int ms_level = StrToInt(env);
if (level < 0) {
level = 2;
}
return level >= ms_level;
}
const char *EnumStrForMsLogLevel(LiteLogLevel level) {
if (level == LiteLogLevel::DEBUG) {
return "DEBUG";
} else if (level == LiteLogLevel::INFO) {
return "INFO";
} else if (level == LiteLogLevel::WARNING) {
return "WARNING";
} else if (level == LiteLogLevel::ERROR) {
return "ERROR";
} else {
return "NO_LEVEL";
}
}
默认日志等级为2,也就是只会打印WARNING和ERROR级别的日志。于是我使用命令hdc shell "export GLOG_v=0"
期望打印所有的日志,但是发现仍然只有最初的一些日志打印,最终也没能解决这个问题。
由于这里的日志打印有问题,我只好将其他地方的hilog日志给移植过来,在一些关键的地方手动添加日志,从model建立开始追踪流程,最终发现在下面的流程中失败了。
OH_AI_DeviceInfoHandle OH_AI_CreateNNRTDeviceInfoByType(OH_AI_NNRTDeviceType type) {
size_t num = 0;
NNRTDeviceDesc *desc = OH_AI_GetAllNNRTDeviceDescs(&num);
if (desc == nullptr) {
MS_LOG(ERROR) << "Get all device desc failed";
return nullptr;
}
OH_AI_DeviceInfoHandle handle = nullptr;
for (size_t i = 0; i < num; i++) {
if (desc[i].device_type == type && strncmp(desc[i].device_name, "NPU_", kNpuNamePrefixLen) == 0) {
handle = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_NNRT);
OH_AI_DeviceInfoSetDeviceId(handle, desc[i].device_id);
break;
}
}
OH_AI_DestroyAllNNRTDeviceDescs(&desc);
return handle;
}
在获取NPU设备时,对NPU设备名是否以NPU_
开头进行了一个判断,而开发者手机-7885的NPU设备名是7885_NPU
,因此创建NNRT DEVICE失败了。
将这个判断去掉之后果然可以正常识别了。
由于这个判断是通过打patch方式添加的,因此要更改patch文件,pr:取消Mindspore对NPU芯片名字的限定
四、总结
AI推理时对NPU芯片名进行限定显然是不合理的,而且这个改动是5.0.0新增的。为了了解这样改动的原因,我咨询了Mindspore的SE,他的解释是5.0.0新增了对麒麟芯片的适配,NPU_
是麒麟芯片名的格式,不添加这个判断可能会导致未知的错误。目前经过我的测试,去掉判断后并未造成什么问题,但是我的方案合入需要他们进行更进一步的测试,或者他们自己会去解决这个问题。
更多推荐
所有评论(0)