HarmonyOS 实战开发-MindSpore Lite引擎进行模型推理

场景介绍

MindSpore Lite 是一款 AI 引擎,它提供了面向不同硬件设备 AI 模型推理的功能,目前已经在图像分类、目标识别、人脸识别、文字识别等应用中广泛使用。

本文介绍使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。

基本概念

在进行开发前,请先了解以下概念。

张量 :它与数组和矩阵非常相似,是 MindSpore Lite 网络运算中的基本数据结构。

Float16 推理模式 : Float16 又称半精度,它使用 16 比特表示一个数。Float16 推理模式表示推理的时候用半精度进行推理。

接口说明

这里给出 MindSpore Lite 推理的通用开发流程中涉及的一些接口,具体请见下列表格。

Context 相关接口

Model 相关接口

Tensor 相关接口

开发步骤

使用 MindSpore Lite 进行模型推理的开发流程如下图所示。**图 1 **使用 MindSpore Lite 进行模型推理的开发流程

进入主要流程之前需要先引用相关的头文件,并编写函数生成随机的输入,具体如下:

复制代码
#include <stdlib.h>
#include <stdio.h>
#include "mindspore/model.h"

//生成随机的输入
int GenerateInputDataWithRandom(OH_AI_TensorHandleArray inputs) {
  for (size_t i = 0; i < inputs.handle_num; ++i) {
    float *input_data = (float *)OH_AI_TensorGetMutableData(inputs.handle_list[i]);
    if (input_data == NULL) {
      printf("MSTensorGetMutableData failed.\n");
      return OH_AI_STATUS_LITE_ERROR;
    }
    int64_t num = OH_AI_TensorGetElementNum(inputs.handle_list[i]);
    const int divisor = 10;
    for (size_t j = 0; j < num; j++) {
      input_data[j] = (float)(rand() % divisor) / divisor;  // 0--0.9f
    }
  }
  return OH_AI_STATUS_SUCCESS;
}

然后进入主要的开发步骤,具括包括模型的准备、读取、编译、推理和释放,具体开发过程及细节请见下文的开发步骤及示例。

  1. 模型准备。

需要的模型可以直接下载,也可以通过模型转换工具获得。

a. 下载模型的格式若为.ms,则可以直接使用。本文以 mobilenetv2.ms 为例。

b. 如果是第三方框架的模型,比如 TensorFlow、TensorFlow Lite、Caffe、ONNX 等,可以使用 模型转换工具转换为.ms 格式的模型文件。

  1. 创建上下文,设置线程数、设备类型等参数。

    // 创建并配置上下文,设置运行时的线程数量为2,绑核策略为大核优先
    OH_AI_ContextHandle context = OH_AI_ContextCreate();
    if (context == NULL) {
    printf("OH_AI_ContextCreate failed.\n");
    return OH_AI_STATUS_LITE_ERROR;
    }
    const int thread_num = 2;
    OH_AI_ContextSetThreadNum(context, thread_num);
    OH_AI_ContextSetThreadAffinityMode(context, 1);
    //设置运行设备为CPU,不使用Float16推理
    OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
    if (cpu_device_info == NULL) {
    printf("OH_AI_DeviceInfoCreate failed.\n");
    OH_AI_ContextDestroy(&context);
    return OH_AI_STATUS_LITE_ERROR;
    }
    OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, false);
    OH_AI_ContextAddDeviceInfo(context, cpu_device_info);

  2. 创建、加载与编译模型。

调用 OH_AI_ModelBuildFromFile 加载并编译模型。

本例中传入 OH_AI_ModelBuildFromFile 的 argv1参数是从控制台中输入的模型文件路径。

复制代码
// 创建模型
OH_AI_ModelHandle model = OH_AI_ModelCreate();
if (model == NULL) {
  printf("OH_AI_ModelCreate failed.\n");
  OH_AI_ContextDestroy(&context);
  return OH_AI_STATUS_LITE_ERROR;
}

// 加载与编译模型,模型的类型为OH_AI_MODELTYPE_MINDIR
int ret = OH_AI_ModelBuildFromFile(model, argv[1], OH_AI_MODELTYPE_MINDIR, context);
if (ret != OH_AI_STATUS_SUCCESS) {
  printf("OH_AI_ModelBuildFromFile failed, ret: %d.\n", ret);
  OH_AI_ModelDestroy(&model);
  return ret;
}
  1. 输入数据。

模型执行之前需要向输入的张量中填充数据。本例使用随机的数据对模型进行填充。

复制代码
// 获得输入张量
OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
if (inputs.handle_list == NULL) {
  printf("OH_AI_ModelGetInputs failed, ret: %d.\n", ret);
  OH_AI_ModelDestroy(&model);
  return ret;
}
// 使用随机数据填充张量
ret = GenerateInputDataWithRandom(inputs);
if (ret != OH_AI_STATUS_SUCCESS) {
  printf("GenerateInputDataWithRandom failed, ret: %d.\n", ret);
  OH_AI_ModelDestroy(&model);
  return ret;
}
  1. 执行推理。

使用 OH_AI_ModelPredict 接口进行模型推理。

复制代码
// 执行模型推理
OH_AI_TensorHandleArray outputs;
ret = OH_AI_ModelPredict(model, inputs, &outputs, NULL, NULL);
if (ret != OH_AI_STATUS_SUCCESS) {
  printf("OH_AI_ModelPredict failed, ret: %d.\n", ret);
  OH_AI_ModelDestroy(&model);
  return ret;
}
  1. 获取输出。

模型推理结束之后,可以通过输出张量得到推理结果。

复制代码
// 获取模型的输出张量,并打印
for (size_t i = 0; i < outputs.handle_num; ++i) {
  OH_AI_TensorHandle tensor = outputs.handle_list[i];
  int64_t element_num = OH_AI_TensorGetElementNum(tensor);
  printf("Tensor name: %s, tensor size is %zu ,elements num: %lld.\n", OH_AI_TensorGetName(tensor),
        OH_AI_TensorGetDataSize(tensor), element_num);
  const float *data = (const float *)OH_AI_TensorGetData(tensor);
  printf("output data is:\n");
  const int max_print_num = 50;
  for (int j = 0; j < element_num && j <= max_print_num; ++j) {
    printf("%f ", data[j]);
  }
  printf("\n");
}
  1. 释放模型。

不再使用 MindSpore Lite 推理框架时,需要释放已经创建的模型。

复制代码
// 释放模型
OH_AI_ModelDestroy(&model);

调测验证

  1. 编写 CMakeLists.txt。

    cmake_minimum_required(VERSION 3.14)
    project(Demo)

    add_executable(demo main.c)

    target_link_libraries(
    demo
    mindspore-lite.huawei
    pthread
    dl
    )

● 使用 ohos-sdk 交叉编译,需要对 CMake 设置 native 工具链路径,即:-DCMAKE_TOOLCHAIN_FILE="/xxx/native/build/cmake/ohos.toolchain.camke"。

● 工具链默认编译 64 位的程序,如果要编译 32 位,需要添加:-DOHOS_ARCH="armeabi-v7a"。

  1. 运行。

● 使用 hdc_std 连接设备,并将 demo 和 mobilenetv2.ms 推送到设备中的相同目录。

● 使用 hdc_std shell 进入设备,并进入 demo 所在的目录执行如下命令,即可得到结果。

复制代码
./demo mobilenetv2.ms

得到如下输出:

复制代码
# ./QuickStart ./mobilenetv2.ms                                            
Tensor name: Softmax-65, tensor size is 4004 ,elements num: 1001.
output data is:
0.000018 0.000012 0.000026 0.000194 0.000156 0.001501 0.000240 0.000825 0.000016 0.000006 0.000007 0.000004 0.000004 0.000004 0.000015 0.000099 0.000011 0.000013 0.000005 0.000023 0.000004 0.000008 0.000003 0.000003 0.000008 0.000014 0.000012 0.000006 0.000019 0.000006 0.000018 0.000024 0.000010 0.000002 0.000028 0.000372 0.000010 0.000017 0.000008 0.000004 0.000007 0.000010 0.000007 0.000012 0.000005 0.000015 0.000007 0.000040 0.000004 0.000085 0.000023 

鸿蒙全栈开发全新学习指南

也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线包含了大APP实战项目开发。

本路线共分为四个阶段:

第一阶段:鸿蒙初中级开发必备技能

第二阶段:鸿蒙南北双向高工技能基础:https://qr21.cn/Bm8gyp

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:https://qr21.cn/Bm8gyp

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念

2.构建第一个ArkTS应用

3.......

开发基础知识:https://qr21.cn/Bm8gyp

1.应用基础知识

2.配置文件

3.应用数据管理

4.应用安全管理

5.应用隐私保护

6.三方应用调用管控机制

7.资源分类与访问

8.学习ArkTS语言

9.......

基于ArkTS 开发

1.Ability开发

2.UI开发

3.公共事件与通知

4.窗口管理

5.媒体

6.安全

7.网络与链接

8.电话服务

9.数据管理

10.后台任务(Background Task)管理

11.设备管理

12.设备使用信息统计

13.DFX

14.国际化开发

15.折叠屏系列

16.......

鸿蒙开发面试真题(含参考答案):https://qr21.cn/Bm8gyp

鸿蒙入门教学视频:

美团APP实战开发教学:https://qr21.cn/Bm8gyp

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:https://qr21.cn/FV7h05
相关推荐
事圆则缓1 小时前
Flutter 开发鸿蒙实战:从 OpenHarmony 适配版到 HAP 构建与插件接入
flutter·华为·harmonyos
传奇开心果编程1 小时前
【ArkUI进阶练中学】第9课:分布式能力与多设备协同
学习·ui·华为·harmonyos
李游Leo1 小时前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 输入帧内参与位姿的版本一致性门禁【鸿蒙心迹】
c++·3d·harmonyos
tsqtsqtsq03091 小时前
Account Kit 华为账号服务介绍
华为·harmonyos
EatFan2 小时前
Flutter 鸿蒙适配实践 2026:从环境搭建、混合渲染到 OpenTelemetry 性能基建
flutter·华为·harmonyos·openharmony·opentelemetry·鸿蒙适配·impeller
m0_738185822 小时前
Flutter 鸿蒙化实战:flutter_secure_storage 适配 OpenHarmony,敏感数据安全存储
安全·flutter·华为·harmonyos·鸿蒙
李游Leo2 小时前
HarmonyOS 7 HiAppEvent + AppGallery Connect:审核复现链路的脱敏日志切片与证据校验【鸿蒙心迹】
华为·harmonyos
李游Leo2 小时前
HarmonyOS 7 + Core Vision Kit:文搜图索引代际切换与模型升级回滚【鸿蒙心迹】
华为·harmonyos
李游Leo2 小时前
HarmonyOS 7 + EasyGo-ArkUI VisibleArea:平行视界双窗曝光事件的去重与停留门禁【鸿蒙心迹】
华为·harmonyos
HwJack2014 小时前
【共创稿事节】HarmonyOS 7空间信息层级:焦点、景深与注意力引导
3d·华为·harmonyos·空间计算