HarmonyOS 鸿蒙Next中调用HIAI推理模型,显示模型不兼容和Process执行失败。

HarmonyOS 鸿蒙Next中调用HIAI推理模型,显示模型不兼容和Process执行失败。

环境:

  • hwhiai-ddk-5.0.1.0-next
  • DDK_tools_5.0.1.0-next
  • ohos ndk version : 5.0.0.12 和 6.0.0.37
  • 手机型号:nove 14,系统:Hormony Next 5.0

通过 param get | gerp "hiai" 查询到:

const.hiai.vendor.hiaiversion = 101.530.010.010
const.hiai.hiaiapiversion = 3.0
startup.service.ctl.hiaiserver = 2
startup.service.ctl.hiaiserver.pid = 888

测试模型reset18, 尝试了两种来源:

  • model_zoo
  • 通过omg自行转换onnx到om模型

目前的问题是:

  1. CheckModelCompatibility 返回模型不兼容
  2. 如果忽略不兼容信息,继续执行,则能正常读取模型输入输出信息,但是在 Process 返回 AI_FAILED 状态

下面是测试代码(多余的 status 检查已经去掉,仅保留了报错的):

int main() {
    printf("Hello, HIAI Model Manager!\n");
    hiai::AIStatus status = hiai::AI_SUCCESS;
    std::shared_ptr<hiai::AiModelMngerClient> modelManagerClient = std::make_shared<hiai::AiModelMngerClient>();
    status = modelManagerClient->Init(nullptr);
    
    hiai::AiModelBuilder modelBuilder(modelManagerClient);
    hiai::MemBuffer* modelBuffer = modelBuilder.InputMemBufferCreate("/data/local/tmp/resnet18.om");

    std::shared_ptr<hiai::AiModelDescription> modelDesc = std::make_shared<hiai::AiModelDescription>(
        "resnet18", hiai::AiModelDescription_Frequency_HIGH, hiai::HIAI_FRAMEWORK_NONE,
        hiai::HIAI_MODELTYPE_OFFLINE, hiai::AiModelDescription_DeviceType_NPU);

    status = modelDesc->SetModelBuffer(modelBuffer->GetMemBufferData(), modelBuffer->GetMemBufferSize());
    bool isModelCompatible = false;
    status = modelManagerClient->CheckModelCompatibility(*modelDesc, isModelCompatible);
    // 总是在这里报兼容性失败
    if (!isModelCompatible) {
        std::cerr << "Model is not compatible.T_T" << std::endl;
        // 忽略错误
        // modelBuilder.MemBufferDestroy(modelBuffer);
        // return -1;
    }
    
    std::vector<std::shared_ptr<hiai::AiModelDescription>> modelDescs;
    modelDescs.push_back(modelDesc);
    status = modelManagerClient->Load(modelDescs);

    std::vector<hiai::TensorDimension> inputDims, outputDims;
    std::vector<std::shared_ptr<hiai::AiTensor>> inputTensors, outputTensors;
    status = modelManagerClient->GetModelIOTensorDim(
        modelDesc->GetName(), inputDims, outputDims);
    
    // 正常读取模型输入输出信息
    for (const auto& dim : inputDims) {
        std::cout << "Input Tensor Dimension: "
                  << "Number: " << dim.GetNumber()
                  << ", Channel: " << dim.GetChannel()
                  << ", Height: " << dim.GetHeight()
                  << ", Width: " << dim.GetWidth() << std::endl;
        std::shared_ptr<hiai::AiTensor> inputTensor = std::make_shared<hiai::AiTensor>();
        hiai::AIStatus initStatus = inputTensor->Init(&dim);
        random_setAiTensor(inputTensor);
        inputTensors.push_back(inputTensor);
        printf("iptr: %p, size: %u\n", inputTensor->GetBuffer(), inputTensor->GetSize());
    }
    // 正常读取模型输入输出信息
    for (const auto& dim : outputDims) {
        std::cout << "Output Tensor Dimension: "
                  << "Number: " << dim.GetNumber()
                  << ", Channel: " << dim.GetChannel()
                  << ", Height: " << dim.GetHeight()
                  << ", Width: " << dim.GetWidth() << std::endl;
        std::shared_ptr<hiai::AiTensor> outputTensor = std::make_shared<hiai::AiTensor>();
        hiai::AIStatus initStatus = outputTensor->Init(&dim);
        outputTensors.push_back(outputTensor);
        printf("optr: %p, size: %u\n", outputTensor->GetBuffer(), outputTensor->GetSize());
    }
    hiai::AiContext context;
    context.AddPara("resnet18", modelDesc->GetName());
    int istamp = 0;
    status = modelManagerClient->Process(context, inputTensors, outputTensors, 1000, istamp);
    // 推理错误
    if (status != hiai::AI_SUCCESS) {
        std::cerr << "Failed to process model: " << status << std::endl;
        modelBuilder.MemBufferDestroy(modelBuffer);
        return -1;
    }
    return 0;
}

更多关于HarmonyOS 鸿蒙Next中调用HIAI推理模型,显示模型不兼容和Process执行失败。的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

鸿蒙Next中HIAI模型不兼容和执行失败可能由以下原因导致:

  1. 模型格式问题:确认模型为鸿蒙支持的.om格式,且使用配套版本的工具链转换生成。

  2. NNIE版本不匹配:检查模型转换时的NNIE工具版本需与鸿蒙Next的HIAI引擎版本严格对应。

  3. 硬件限制:当前设备NPU型号可能不支持模型算子或层类型。

  4. 内存不足:大模型推理时出现Process失败需检查内存分配是否充足。

解决方法:重新使用匹配的NNIE工具导出模型,验证设备NPU规格是否满足模型要求。

更多关于HarmonyOS 鸿蒙Next中调用HIAI推理模型,显示模型不兼容和Process执行失败。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


从你描述的问题来看,模型兼容性和推理失败可能是由以下几个原因导致的:

  1. 模型版本不匹配:
  • 你使用的DDK版本是5.0.1.0-next,但设备上的HIAI版本显示为101.530.010.010
  • 建议使用与设备HIAI版本匹配的DDK工具链重新转换模型
  1. 模型转换问题:
  • 自行转换的OM模型可能缺少必要的编译参数
  • 尝试在omg转换时添加:–output_type=FP32 --insert_op_conf=aipp_resnet18.config
  1. 设备兼容性:
  • Nova 14使用的是中端NPU,可能对复杂模型支持有限
  • 可以尝试简化模型或使用量化后的版本
  1. 运行时环境:
  • 检查是否已正确配置NPU驱动权限
  • 确保/data/local/tmp目录有读写权限

建议先验证基础功能:

  1. 使用HIAI提供的sample模型测试环境是否正常
  2. 检查日志:/data/log/hiaiserver/hiaiserver.log
  3. 尝试更简单的模型(如mobilenet)验证流程

如果问题依旧,可能需要获取设备特定的DDK版本进行模型转换。

回到顶部