一、关键字

5.0.0;AI;模型推理;mindspore;NNRt device;NPU;

二、问题描述

设备型号:开发者手机-7885

系统版本号:OpenHarmony 5.0.0

代码版本号:OpenHarmony 5.0.0

问题现象:使用Mindspore.AI应用进行物体识别检测时,没有出现识别框。

应用下载路径:Mindspore.AI

三、原因分析

3.1 正常机制

出现识别框和识别信息

img

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_是麒麟芯片名的格式,不添加这个判断可能会导致未知的错误。目前经过我的测试,去掉判断后并未造成什么问题,但是我的方案合入需要他们进行更进一步的测试,或者他们自己会去解决这个问题。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐