# CANNKit_Codelab_Optimization_cpp
**Repository Path**: harmonyos_codelabs/cannkit_codelab_optimization_cpp
## Basic Information
- **Project Name**: CANNKit_Codelab_Optimization_cpp
- **Description**: 本示例基于CANN Kit提供的维测调优能力,实现基于用户提供的AI模型和输入数据获取Profiling/Dump维测数据的示例,辅助开发者用于模型和单算子的性能调优与分析。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-29
- **Last Updated**: 2025-10-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 基于CANN Kit实现获取模型的Profiling/Dump维测数据
## 介绍
本示例展示了如何建立一个HarmonyOS应用程序去运行AI模型并获取Profiling/Dump数据进行性能分析,支持离线模型调优与输出数据可视化。
需要编译依赖CANN的动态库libhiai_foundation.so和AI领域公共动态库libneural_network_core.so。
## 效果预览
| **主界面** | **调优数据展示** | **调优数据展示** |
|:------------------------------:|:-----------------------------:|---------------------------------|
|
|
|
|
## 使用说明
1. 环境准备
安装[DevEco Studio](https://developer.huawei.com/consumer/cn/deveco-studio/)。
2. 模型转化
通过DDK工具完成[离线模型转换](https://developer.huawei.com/consumer/cn/doc/hiai-Guides/offline-model-conversion-0000001053807006)。
3. 文件传输
预先在本地创建与应用同名的目录(通过app.json5文件中的bundleName定义),并通过指定命令将离线模型和输入文件文件预置到手机的目录中(本示例以"
Download"为例)。
1)hdc file send com.huawei.canndemo/test.om /mnt/hmdfs/100/account/device_view/local/files/Docs/Download
2)hdc file send com.huawei.canndemo/input.bin /mnt/hmdfs/100/account/device_view/local/files/Docs/Download
4. 执行推理
1)在手机的主屏幕,依次获取模型的输入bin文件和模型文件,并选择维测选项。
2)点击“运行”,调优模式为“Profiling”,可通过“查看调优数据”进行数据展示;调优模式为“Dump”,可直接在手机目录获取数据。
5. 退出应用时,自动卸载模型。
## 工程目录
```
├──entry/src/main/cpp
│ ├──CMakeLists.txt // Native 层编译配置
│ ├──HIAIModelManager.cpp // 管理 HiAI 模型加载、初始化和推理的接口实现
│ └──HIAIModelManager.h // 管理 HiAI 模型加载、初始化和推理的接口封装
├──entry/src/main/ets
│ ├──constants
│ │ └──CommonConstants.ets // 公共常量
│ ├──entryability
│ │ └──EntryAbility.ets // 负责应用的启动、界面加载和生命周期管理
│ ├──model
│ │ └──PathModel.ets // 应用资源实体类
│ ├──pages
│ │ ├──Index.ets // 主界面
│ │ └──TabsManager.ets
│ ├──utils
│ │ ├──DataUtils.ets // 模型数据工具类
│ │ ├──DrawUtils.ets // 窗口管理
│ │ └──FileUtils.ets
│ ├──view
│ │ ├──DataShower.ets // 调优数据展示页面组件
│ │ ├──DetailDialog.ets // 弹出框数据展示组件
│ │ └──FilePicker.ets // 文件和调优选项配置页面组件
│ └──viewmodel
│ ├──DetailData.ets // 主窗口实体类
│ └──DialogData.ets // 副窗口实体类
└──entry/src/main/resources // 引用资源目录
```
## 具体实现
本示例展示的维测调优功能主要使用的API:
- OH_NN_ReturnCode HMS_HiAIOptions_SetOmOptions(OH_NNCompilation* compilation, HiAI_OmType type, const char* outputDir);
```
typedef enum {
/** Disables operating and maintenance. */
HIAI_OM_TYPE_OFF = 0, // 关闭 OM 选项。
/** Profiling type of operating and maintenance. */
HIAI_OM_TYPE_PROFILING = 1, // 启用性能分析。
/** Dump model level output. */
HIAI_OM_TYPE_DUMP = 2, // 启用模型数据导出。
} HiAI_OmType;
```
展示的功能还使用了在CANN和NNCore中定义的以下API:
```
OH_NN_ReturnCode OH_NNDevice_GetAllDevicesID(const size_t **allDevicesID, uint32_t *deviceCount);
void *OH_NNTensor_GetDataBuffer(const NN_Tensor *tensor);
OH_NNCompilation *OH_NNCompilation_ConstructWithOfflineModelBuffer(const void *modelBuffer, size_t modelSize);
OH_NN_ReturnCode OH_NNCompilation_SetDevice(OH_NNCompilation *compilation, size_t deviceID);
void OH_NNCompilation_Destroy(OH_NNCompilation **compilation);
NN_TensorDesc *OH_NNExecutor_CreateInputTensorDesc(const OH_NNExecutor *executor, size_t index);
OH_NN_ReturnCode OH_NNTensorDesc_SetShape(NN_TensorDesc *tensorDesc, const int32_t *shape, size_t shapeLength);
NN_TensorDesc *OH_NNExecutor_CreateOutputTensorDesc(const OH_NNExecutor *executor, size_t index);
OH_NN_ReturnCode OH_NNExecutor_RunSync(OH_NNExecutor *executor,
NN_Tensor *inputTensor[], size_t inputCount, NN_Tensor *outputTensor[],
size_t outputCount);
OH_NN_ReturnCode OH_NNTensor_GetSize(const NN_Tensor *tensor, size_t *size);
```
## 相关权限
不涉及。
## 依赖
不涉及。
## 约束与限制
1. 本示例仅支持标准系统上运行,支持设备:华为手机。
2. HarmonyOS系统:HarmonyOS 6.0.0 Release及以上。
3. DevEco Studio版本:DevEco Studio 6.0.0 Release及以上。
4. HarmonyOS SDK版本:HarmonyOS 6.0.0 Release SDK及以上。