ohos_onnxruntime:基于 ONNX Runtime 的跨平台机器学习加速项目

跨平台机器学习模型推理框架(支持ONNX格式模型加速部署)

分支3404Tags70
文件最后提交记录最后更新时间
新增onnxruntime napi & demo Signed-off-by: “wangle” <“wangle133@h-partners.com”> 1 个月前
补充xts用例 Signed-off-by: “wangle” <“wangle133@h-partners.com”> 3 天前
新增onnxruntime napi & demo Signed-off-by: “wangle” <“wangle133@h-partners.com”> 1 个月前
1. 添加prebuild.sh, 使napi依赖的c库编译生成 2. demo中的基准模型测试指定模型文件类型 3. readme文档优化 4. build-profile.json5添加编译必要参数 Signed-off-by: “wangle” <“wangle133@h-partners.com”> 7 天前
1. 添加prebuild.sh, 使napi依赖的c库编译生成 2. demo中的基准模型测试指定模型文件类型 3. readme文档优化 4. build-profile.json5添加编译必要参数 Signed-off-by: “wangle” <“wangle133@h-partners.com”> 7 天前
新增onnxruntime napi & demo Signed-off-by: “wangle” <“wangle133@h-partners.com”> 1 个月前
新增onnxruntime napi & demo Signed-off-by: “wangle” <“wangle133@h-partners.com”> 1 个月前
新增onnxruntime napi & demo Signed-off-by: “wangle” <“wangle133@h-partners.com”> 1 个月前
fix: 修改配置文件 Signed-off-by: zhangzhenwei <zhangzhenwei31@huawei-partners.com> 21 天前
fix: 修改配置文件 Signed-off-by: zhangzhenwei <zhangzhenwei31@huawei-partners.com> 21 天前
fix: 修改配置文件 Signed-off-by: zhangzhenwei <zhangzhenwei31@huawei-partners.com> 21 天前
1. 添加prebuild.sh, 使napi依赖的c库编译生成 2. demo中的基准模型测试指定模型文件类型 3. readme文档优化 4. build-profile.json5添加编译必要参数 Signed-off-by: “wangle” <“wangle133@h-partners.com”> 7 天前
1. 添加prebuild.sh, 使napi依赖的c库编译生成 2. demo中的基准模型测试指定模型文件类型 3. readme文档优化 4. build-profile.json5添加编译必要参数 Signed-off-by: “wangle” <“wangle133@h-partners.com”> 7 天前
1. 添加prebuild.sh, 使napi依赖的c库编译生成 2. demo中的基准模型测试指定模型文件类型 3. readme文档优化 4. build-profile.json5添加编译必要参数 Signed-off-by: “wangle” <“wangle133@h-partners.com”> 7 天前
新增onnxruntime napi & demo Signed-off-by: “wangle” <“wangle133@h-partners.com”> 1 个月前
新增onnxruntime napi & demo Signed-off-by: “wangle” <“wangle133@h-partners.com”> 1 个月前
新增onnxruntime napi & demo Signed-off-by: “wangle” <“wangle133@h-partners.com”> 1 个月前
1. 添加prebuild.sh, 使napi依赖的c库编译生成 2. demo中的基准模型测试指定模型文件类型 3. readme文档优化 4. build-profile.json5添加编译必要参数 Signed-off-by: “wangle” <“wangle133@h-partners.com”> 7 天前

onnxruntime-napi

简介

onnxruntime-napi 是 ONNX Runtime NAPI 接口库。本库基于 ONNX Runtime 原库进行适配,并沿用其现有用法和特性。 onnxruntime的主要功能代码都在native侧进行了实现,并提供给ArkTS侧使用。

下载安装

   ohpm install @ohos/onnxruntime

OpenHarmony ohpm环境配置等更多内容,请参考 如何安装OpenHarmony ohpm包

约束与限制

兼容性

在下述版本验证通过:

  • DevEco Studio 6.0.1 Release, SDK: API12

编译运行

本项目依赖onnxruntime库, 需要将编译产物的.a文件和头文件拷贝至cpp目录下的thirdparty目录.

img.png

手动编译tpc_c_cplusplus onnxruntime c库

参考onnxruntime本地编译脚本
编译完成后, 将tpc_c_cplusplus/lycium/usr目录下的文件夹拷贝至cpp目录下的thirdparty目录.如下图所示:

tpc_c_cplusplus编译产物.png

使用prebuild.sh脚本编译(需要linux环境)

  • 修改prebuild.sh脚本, 将SDK_DIR设置为SDK目录路径, 如: /home/OHOS_SDK/linux

prebuild脚本修改.png

  • 执行prebuild.sh脚本:
./prebuild.sh

脚本将自行下载tpc_c_cplusplus库, 编译生成onnxruntime库, 并拷贝至cpp目录下的thirdparty目录. 如下图所示:

prebuild脚本编译产物.png

使用示例

下面以SIGMOID基准测试为例, 展示了onnxruntime napi库推理的主要过程:

  • 初始化onnxruntime全局环境
  • 加载模型
  • 构建输入张量
  • 执行推理
  • 解析推理结果
  • 资源释放
import * as api from '@ohos/onnxruntime';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct Index {
  private context: Context = this.getUIContext().getHostContext()!;
  private filesDir: string = this.context.filesDir;
  private resourceDir: string = this.context.resourceDir;

  @State modelPath: string = this.resourceDir + '/sigmoid.ort';

  build() {
    Column() {
      Button("运行 ONNX Runtime 测试")
        .margin({ bottom: 10 })
        .onClick(() => {
          this.runOnnxRuntimeTest();
        })
    }
    .width('100%')
      .height('100%')
  }

  private runOnnxRuntimeTest(): void {
    try {
      // 1. 初始化环境并获取版本
      api.OnnxEnvironment.InitEnvironment();
      const version: string = api.OnnxEnvironment.GetVersion();
      console.info(`ONNX Runtime 版本: ${version}`);

      // 2. 创建推理会话
      const session: api.OnnxSession =
        api.OnnxEnvironment.CreateSessionFromModelFile(this.modelPath);
      const inputNames: string[] = session.GetInputNames();
      const outputNames: string[] = session.GetOutputNames();
      console.info(`输入节点: ${JSON.stringify(inputNames)}`);
      console.info(`输出节点: ${JSON.stringify(outputNames)}`);
    
      // 3. 准备输入数据
      const shape: number[] = [3, 4, 5];
      const totalElements: number = 60;
      const testdataBuffer: ArrayBuffer = new ArrayBuffer(totalElements * 4);
      const expectedBuffer: ArrayBuffer = new ArrayBuffer(totalElements * 4);
      const testdataView: Float32Array = new Float32Array(testdataBuffer);
      const expectedView: Float32Array = new Float32Array(expectedBuffer);
    
      let idx: number = 0;
      for (let i: number = 0; i < 3; i++) {
        for (let j: number = 0; j < 4; j++) {
          for (let k: number = 0; k < 5; k++) {
            const x: number = i + j + k;
            testdataView[idx] = x;
            expectedView[idx] = 1.0 / (1.0 + Math.exp(-x));
            idx++;
          }
        }
      }
    
      const inputTensor: api.OnnxTensor =
        new api.OnnxTensor(testdataBuffer, shape, api.OnnxArkTSType.FLOAT);
    
      const inputs: Record<string, api.OnnxValue> = {};
      inputs[inputNames[0]] = inputTensor;
    
      // 4. 执行推理
      const result: api.OnnxResult = session.Run(inputs);
      const value: api.OnnxValue = result.GetValueByName(outputNames[0]);
    
      // 5. 验证输出类型
      if (value.GetType() !== api.OnnxValueType.TENSOR) {
        console.error('输出类型错误,期望 TENSOR');
        return;
      }
    
      // 6. 精度验证
      const tensorValue: api.OnnxTensor = value as api.OnnxTensor;
      const buffer: ArrayBuffer = tensorValue.GetDataAsArrayBuffer();
      const bufferView: Float32Array = new Float32Array(buffer);
    
      if (bufferView.length !== expectedView.length) {
        console.error(`输出长度不匹配: 实际 ${bufferView.length}, 期望 ${expectedView.length}`);
        return;
      }
    
      let failCount: number = 0;
      const epsilon: number = 1e-6;
      for (let i: number = 0; i < bufferView.length; i++) {
        if (Math.abs(bufferView[i] - expectedView[i]) > epsilon) {
          failCount++;
        }
      }
    
      if (failCount === 0) {
        console.info('ONNX Runtime 测试通过,所有输出值均在误差范围内');
      } else {
        console.error(`精度验证失败: ${failCount} 个元素超出误差范围`);
      }
    
      // 7. 释放资源(推荐显式释放,避免内存占用过高)
      result.Close()
      inputTensor.Close()
      session.Close()
    } catch (err) {
      console.error(`ONNX Runtime 测试失败: ${err.message}`);
    }
  }
}

使用说明

onnxruntime一个完整的推理过程需要所有阶段参与, 但每个阶段可以有一些参数可以调整

初始化onnxruntime全局环境

在进行任何模型加载或推理操作之前,必须先初始化 ONNX Runtime 的全局环境。环境负责管理日志输出、全局线程池等共享资源。
注意: 全局环境仅需初始化一次.

最简单的初始化方式是不带任何参数:

    import * as api from '@ohos/onnxruntime';
    
    // 使用默认配置初始化环境
    api.OnnxEnvironment.InitEnvironment();
    const version = api.OnnxEnvironment.GetVersion();
    console.info(`ONNX Runtime 版本: ${version}`);

如果需要更精细的控制,可以使用以下重载方法:

  • InitEnvironmentWithName(envName: string) – 指定环境名称,便于日志标识。
  • InitEnvironmentWithLogLevel(logLevel: OnnxLoggingLevel) – 设置全局日志级别。
  • InitEnvironmentWithNameAndLogLevel(envName: string, logLevel: OnnxLoggingLevel) – 同时指定名称与日志级别。
  • InitEnvironmentFull(envName: string, logLevel: OnnxLoggingLevel, threadOptions: OnnxThreadOptions) – 完整初始化,可配置全局线程行为

线程配置(OnnxThreadOptions)允许设置跨算子并行数、算子内部并行数以及自旋控制策略,典型用法:

    const threadOptions = new api.OnnxThreadOptions();
    threadOptions.SetGlobalInterOpNumThreads(4);
    threadOptions.SetGlobalIntraOpNumThreads(2);
    threadOptions.SetGlobalSpinControl(true);
    threadOptions.SetGlobalDenormalAsZero();
    
    api.OnnxEnvironment.InitEnvironmentFull("MyApp", api.OnnxLoggingLevel.WARNING, threadOptions);
    threadOptions.Close(); // 配置完成后可关闭配置对象

日志级别枚举 OnnxLoggingLevel 包含 VERBOSE、INFO、WARNING、ERROR、FATAL,建议开发期使用 VERBOSE,发布时调整为 ERROR。

加载模型

环境初始化后,即可通过环境对象创建推理会话。OnnxEnvironment 提供了三种模型加载方式:

  • 从文件加载 – 适用于模型以 .onnx 或 .ort 文件存储在设备上的场景。
  • 从内存缓冲区加载 – 适用于模型文件打包在应用 rawfile 中,或从网络下载到内存的场景。
  • 从数值数组加载 – 将模型字节转换为 number[] 后传入,内部自动转为 Int8Array。

每种方式都提供了基础版和带配置选项的版本(...WithOptions)。
基础加载示例:

    // 从文件加载
    const session = api.OnnxEnvironment.CreateSessionFromModelFile("/data/model.onnx");
    
    // 从内存缓冲区加载(假设 buffer 为 Int8Array)
    const session2 = api.OnnxEnvironment.CreateSessionFromBuffer(modelBuffer);

带会话选项加载:
OnnxSessionOptions 提供了丰富的配置项,用于控制模型优化、执行模式和线程数等。

    const options = new api.OnnxSessionOptions();
    options.SetOptimizationLevel(api.OnnxOptimizationLevel.ALL);      // 启用所有优化
    options.SetExecutionMode(api.OnnxExecutionMode.PARALLEL);         // 并行执行
    options.SetIntraOpNumThreads(2);                                  // 算子内线程数
    options.SetInterOpNumThreads(1);                                  // 算子间线程数
    options.SetMemoryPatternOptimizationEnabled(true);                // 内存模式优化
    options.EnableProfiling("profile_prefix");                        // 开启性能分析
    
    const session = api.OnnxEnvironment.CreateSessionFromModelFileWithOptions(
    "/data/model.onnx", options
    );
    options.Close();

OnnxOptimizationLevel 的可选值:

  • DISABLED – 不优化
  • BASIC – 基础优化(常量折叠等)
  • EXTENDED – 扩展优化(算子融合等)
  • LAYOUT – 布局优化
  • ALL – 启用所有可用优化(推荐生产环境使用)

其它常用设置:

  • SetCPUArenaAllocatorEnabled(true) – 启用 Arena 内存分配器,减少内存碎片。
  • SetDeterministicComputeEnabled(true) – 强制确定性计算。
  • AddCPUExecutionProvider(useArena) – 添加 CPU EP后端执行器;
  • AddExecutionProvider - 注册其它硬件后端, 暂未有其它支持的EP后端, 此为保留的扩展接口
  • SetSymbolicDimensionValue("batch_size", 1n) – 固定动态维度,例如 batch size。
  • RegisterCustomOpLibrary(path) – 加载自定义算子动态库。

加载完成后可通过 session.GetModelMetadata() 查看模型的版本、生产者、描述等元信息。

构建输入张量

在执行推理之前,需要将应用数据封装为 OnnxValue 的子类对象。最常用的类型是 稠密张量 OnnxTensor。

获取输入信息
通过会话查询模型的输入名称、形状及数据类型,以便准备正确尺寸的缓冲区。

    const inputInfo = session.GetInputInfo(); // Record<string, NodeInfo>
    const firstInputName = Object.keys(inputInfo)[0];
    const nodeInfo = inputInfo[firstInputName];
    const tensorInfo = nodeInfo.GetInfo() as api.TensorInfo;
    const shape = tensorInfo.GetShape();          // 例如 [1, 3, 224, 224]
    const elementType = tensorInfo.arktsElementType; // 对应的 ArkTS 数据类型

创建张量:

  • 数值张量 – 传入 ArrayBuffer、形状和 OnnxArkTSType 枚举值。
    const buffer = new ArrayBuffer(60 * 4);          // 假设 60 个 float
    const dataView = new Float32Array(buffer);
    // 填充 dataView ...
    const tensor = new api.OnnxTensor(buffer, [3, 4, 5], api.OnnxArkTSType.FLOAT);

OnnxArkTSType 定义了 FLOAT、DOUBLE、INT8、UINT8、INT16、INT32、INT64、BOOL、STRING 等,与 ArkTS 的 TypedArray 类型对应。

  • 字符串张量 – 直接传入字符串数组与形状。
  const stringTensor = new api.OnnxTensor(["hello", "world"], [2]);

构建输入映射表,键为输入节点名称,值为张量对象:

    const inputs: Record<string, api.OnnxValue> = {};
    inputs[firstInputName] = tensor;

如果模型输入包含非张量类型(如 OnnxMap 或 OnnxSequence),也可以通过相应的构造函数创建,并将其放入映射表

执行推理

准备好输入后,调用会话的 Run 系列方法触发推理计算。

基础调用:

  const result: api.OnnxResult = session.Run(inputs);

返回的 OnnxResult 包含模型的所有输出。

高级调用:

  • RunWithOptions(inputs, runOptions) – 传入 OnnxRunOptions,可覆盖本次运行的日志级别、添加配置项、绑定 LoRA 适配器等。
  • RunWithSpecifiedOutputs(inputs, outputNames) – 仅计算指定的输出节点,减少不必要的计算。
  • RunWithPinnedOutputs(inputs, pinnedOutputs) – 复用预先分配的缓冲区,降低内存分配开销。
  • RunFull(...) – 所有参数可选,提供最大灵活度。

OnnxRunOptions 的使用示例:

    const runOpts = new api.OnnxRunOptions();
    runOpts.SetLogLevel(api.OnnxLoggingLevel.WARNING);
    runOpts.SetRunTag("inference_1");
    const result = session.RunWithOptions(inputs, runOpts);
    runOpts.Close();

指定输出示例(仅计算所需节点):

    const outputNames = ["output_0"];
    const result = session.RunWithSpecifiedOutputs(inputs, outputNames);

LoRA 适配器推理:

    const adapter = new api.OnnxLoraAdapter("/path/to/adapter.onnx_adapter");
    const runOpts = new api.OnnxRunOptions();
    runOpts.AddActiveLoraAdapter(adapter);
    const result = session.RunWithOptions(inputs, runOpts);
    // 释放资源
    result.Close();
    runOpts.Close();
    adapter.Close();

如果开启了性能分析(在 OnnxSessionOptions 中启用),推理结束后可以通过 session.EndProfiling() 获取分析文件路径。

解析推理结果

OnnxResult 提供了按索引或按名称访问输出值的能力。大多数情况下,输出的类型为 OnnxTensor。

获取输出值:

    const outputNames = session.GetOutputNames();
    const value: api.OnnxValue = result.GetValueByName(outputNames[0]);
    
    // 类型检查
    if (value.GetType() !== api.OnnxValueType.TENSOR) {
      console.error('非张量输出');
    }
    const outputTensor = value as api.OnnxTensor;

读取张量数据:

  • 数值数据:GetDataAsArrayBuffer() 返回原始数据缓冲区,用对应的 TypedArray 视图读取。
  • 字符串数据:GetDataAsStringArray() 返回字符串数组。
    const outBuffer = outputTensor.GetDataAsArrayBuffer();
    const outData = new Float32Array(outBuffer); // 假设输出为 FLOAT 类型
    console.info(`输出前 5 个值: ${outData.slice(0, 5)}`);

其它输出类型:

  • OnnxMap – 通过 GetStringKeys() / GetLongKeys() 和对应的值获取方法读取。
  • OnnxSequence – 通过 GetTensors() 或 GetMaps() 获取元素数组。

资源释放

推理结果、张量以及会话在使用完毕后应及时调用 Close() 释放 Native 资源。虽然 ArkTS 对象在离开作用域时可能触发自动回收,但建议始终显式释放,尤其是处理大量数据或循环推理时。

    result.Close();
    inputTensor.Close();
    session.Close();

通过以上五个步骤,即可完成一次完整的 ONNX 模型推理流程。每个阶段都提供了灵活的配置接口,可以根据性能、精度和功能需求进行定制。

接口说明

onnxruntime 库主要提供以下核心类供应用开发者使用,覆盖环境管理、会话创建、张量构建、推理执行与结果解析等全流程。

枚举类型

枚举名称 说明 可选值
OnnxLoggingLevel 日志级别 VERBOSE,INFO,WARNING,ERROR,FATAL
OnnxExecutionMode 图执行模式 SEQUENTIAL(顺序),PARALLEL(并行)
OnnxOptimizationLevel 图优化等级 DISABLED,BASIC,EXTENDED,LAYOUT,ALL
OnnxValueType ONNX 值类型分类 UNDEFINED,TENSOR,SEQUENCE,MAP,SPARSE_TENSOR
OnnxArkTSType ArkTS 原生数据类型 FLOAT,DOUBLE,INT8,UINT8,INT16,INT32,INT64,BOOL,STRING,FLOAT16,BFLOAT16,UNKNOWN
OnnxTensorType ONNX 张量元素类型 与 OnnxArkTSType 类似但包含更多数值类型,如 COMPLEX64 等
OnnxMapValueType Map 键值的数据类型 INVALID,STRING,LONG,FLOAT,DOUBLE
SparseTensorFormat 稀疏张量存储格式 UNDEFINED,COO,CSRC,BLOCK_SPARSE

OnnxRuntime(全局运行时信息)

接口 说明 参数 返回值
Version() 获取 ONNX Runtime 版本字符串 string,例如 "1.16.0"
IsCUDAAvailable() 是否支持 CUDA GPU 后端 boolean
IsROCMAvailable() 是否支持 ROCm AMD GPU 后端 boolean
IsDNNLAvailable() 是否支持 oneDNN 后端 boolean
IsOpenVINOAvailable() 是否支持 OpenVINO 后端 boolean
IsTensorRTAvailable() 是否支持 TensorRT 后端 boolean
IsQNNAvailable() 是否支持 QNN 高通后端 boolean

OnnxThreadOptions(全局线程池配置)

接口 说明 参数 返回值
构造函数 OnnxThreadOptions() 创建线程配置对象 OnnxThreadOptions
Close() 释放底层资源
SetGlobalInterOpNumThreads(numThreads) 设置跨算子并行线程数 numThreads: number,建议设为物理核心数
SetGlobalIntraOpNumThreads(numThreads) 设置算子内部并行线程数 numThreads: number
SetGlobalSpinControl(enable) 设置自旋等待策略 enable: boolean
SetGlobalDenormalAsZero() 将非规格化浮点数置零

OnnxEnvironment(环境管理)

注意:全局环境仅需初始化一次,之后可通过该对象创建会话。

接口 说明 参数 返回值
InitEnvironment() 默认初始化环境
InitEnvironmentWithName(envName) 使用自定义名称初始化 envName: string
InitEnvironmentWithLogLevel(logLevel) 使用指定日志级别初始化 logLevel: OnnxLoggingLevel
InitEnvironmentWithNameAndLogLevel(envName, logLevel) 同时指定名称与日志级别 envName: string,logLevel: OnnxLoggingLevel
InitEnvironmentFull(envName, logLevel, threadOptions) 完整参数初始化 envName: string,logLevel: OnnxLoggingLevel,threadOptions: OnnxThreadOptions
CreateSessionFromModelFile(modelPath) 从模型文件创建推理会话 modelPath: string,模型文件路径 OnnxSession
CreateSessionFromModelFileWithOptions(modelPath, sessionOptions) 从模型文件创建会话(带配置) modelPath: string,sessionOptions: OnnxSessionOptions OnnxSession
CreateSessionFromBuffer(modelBuffer) 从内存缓冲区创建会话 modelBuffer: Int8Array OnnxSession
CreateSessionFromBufferWithOptions(modelBuffer, sessionOptions) 从缓冲区创建会话(带配置) modelBuffer: Int8Array,sessionOptions: OnnxSessionOptions OnnxSession
CreateSessionFromArray(modelData) 从数值数组创建会话 modelData: number[] OnnxSession
CreateSessionFromArrayWithOptions(modelData, sessionOptions) 从数组创建会话(带配置) modelData: number[],sessionOptions: OnnxSessionOptions OnnxSession
SetTelemetryEnabled(enable) 启用/禁用遥测收集 enable: boolean
GetVersion() 获取 ONNX Runtime 版本 string
ToString() 获取环境配置字符串(调试) string

OnnxSessionOptions(会话配置)

接口 说明 参数 返回值
构造函数 OnnxSessionOptions() 创建会话选项对象 OnnxSessionOptions
Close() 释放资源
IsClosed() 是否已关闭 boolean
SetExecutionMode(mode) 设置图执行模式 mode: OnnxExecutionMode
SetOptimizationLevel(level) 设置优化等级 level: OnnxOptimizationLevel
SetIntraOpNumThreads(numThreads) 设置算子内线程数 numThreads: number,-1 表示默认
SetInterOpNumThreads(numThreads) 设置跨算子线程数 numThreads: number
SetOptimizedModelFilePath(filePath) 设置优化后模型的保存路径 filePath: string
SetLoggerId(loggerId) 设置日志标识 loggerId: string
SetSessionLogLevel(logLevel) 设置会话日志级别 logLevel: OnnxLoggingLevel
SetSessionLogVerbosityLevel(verbosityLevel) 设置日志详细程度 verbosityLevel: number
EnableProfiling(filePrefix) 启用性能分析 filePrefix: string,输出文件前缀
DisableProfiling() 禁用性能分析
SetMemoryPatternOptimizationEnabled(enable) 启用内存模式优化 enable: boolean
SetCPUArenaAllocatorEnabled(useArena) 启用 Arena 内存分配器 useArena: boolean
SetDeterministicComputeEnabled(enable) 启用确定性计算 enable: boolean
DisablePerSessionThreads() 禁用每会话线程,使用全局线程池
RegisterCustomOpLibrary(libraryPath) 注册自定义算子库 libraryPath: string,.so 文件路径
RegisterCustomOpsUsingFunction(functionName) 通过函数名注册自定义算子 functionName: string
AddInitializer(tensorName, tensorValue) 添加/覆盖初始化器 tensorName: string,tensorValue: OnnxValue
AddExternalInitializers(initializers) 批量添加外部初始化器 initializers: Record<string, OnnxValue>
SetSymbolicDimensionValue(dimensionName, dimensionValue) 固定动态维度值 dimensionName: string,dimensionValue: bigint
AddConfigEntry(key, value) 添加自定义配置项 key: string,value: string
GetConfigEntries() 获取所有配置项 Record<string, string>
AddCPUExecutionProvider(useArena) 添加 CPU 执行提供程序 useArena: boolean
AddExecutionProvider(providerName, providerOptions) 添加硬件执行提供程序 providerName: string,providerOptions: Record<string, string>

OnnxRunOptions(运行配置)

接口 说明 参数 返回值
构造函数 OnnxRunOptions() 创建运行选项对象 OnnxRunOptions
Close() 释放资源
IsClosed() 是否已关闭 boolean
SetLogLevel(logLevel) 设置本次运行日志级别 logLevel: OnnxLoggingLevel
SetLogVerbosityLevel(verbosityLevel) 设置日志详细程度 verbosityLevel: number
GetLogLevel() 获取日志级别 OnnxLoggingLevel
GetLogVerbosityLevel() 获取日志详细程度 number
SetRunTag(tag) 设置运行标签 tag: string
GetRunTag() 获取运行标签 string
AddConfigEntry(key, value) 添加运行专属配置 key: string,value: string
GetConfigEntry(key) 获取配置值 key: string string
AddActiveLoraAdapter(adapter) 添加激活的 LoRA 适配器 adapter: OnnxLoraAdapter

OnnxLoraAdapter(LoRA 适配器)

接口 说明 参数 返回值
构造函数 OnnxLoraAdapter(loraFilePath) 从文件路径创建适配器 loraFilePath: string OnnxLoraAdapter
构造函数 OnnxLoraAdapter(loraData) 从 Int8Array 创建适配器 loraData: Int8Array OnnxLoraAdapter
构造函数 OnnxLoraAdapter(loraData) 从 number[] 创建适配器 loraData: number[] OnnxLoraAdapter
Close() 释放适配器资源

OnnxSession(推理会话)

接口 说明 参数 返回值
GetInputCount() 获取模型输入数量 number
GetOutputCount() 获取模型输出数量 number
GetInputNames() 获取所有输入名称数组 string[]
GetOutputNames() 获取所有输出名称数组 string[]
GetInputInfo() 获取输入节点详细信息 Record<string, NodeInfo>
GetOutputInfo() 获取输出节点详细信息 Record<string, NodeInfo>
Run(inputMap) 执行推理,返回所有输出 inputMap: Record<string, OnnxValue> OnnxResult
RunWithOptions(inputMap, runOptions) 带运行选项的推理 inputMap: Record<string, OnnxValue>,runOptions: OnnxRunOptions OnnxResult
RunWithSpecifiedOutputs(inputMap, outputNames) 仅计算指定输出 inputMap: Record<string, OnnxValue>,outputNames: string[] OnnxResult
RunWithSpecifiedOutputsAndOptions(inputMap, outputNames, runOptions) 指定输出并带运行选项 inputMap,outputNames: string[],runOptions: OnnxRunOptions OnnxResult
RunWithPinnedOutputs(inputMap, pinnedOutputs) 输出复用缓冲区 inputMap,pinnedOutputs: Record<string, OnnxValue> OnnxResult
RunWithSpecifiedOutputsAndPinnedOutputs(...) 指定输出 + 输出复用 inputMap,outputNames: string[],pinnedOutputs: Record<string, OnnxValue> OnnxResult
RunFull(inputMap, outputNames, pinnedOutputs, runOptions) 全参数推理接口 全部可选,具体见声明 OnnxResult
GetModelMetadata() 获取模型元数据 OnnxModelMetadata
GetProfilingStartTimeNs() 性能分析起始时间戳(纳秒) bigint
EndProfiling() 结束性能分析并返回结果文件路径 string
Close() 释放会话资源
IsClosed() 检查会话是否已关闭 boolean

OnnxResult(推理结果)

接口 说明 参数 返回值
Close() 释放结果资源
IsClosed() 是否已关闭 boolean
GetOutputCount() 输出值的数量 number
GetValueByIndex(index) 按索引获取输出值 index: number OnnxValue
GetValueByName(name) 按名称获取输出值 name: string OnnxValue
IsResultOwner(index) 指定索引的输出是否由结果对象拥有 index: number boolean

OnnxModelMetadata(模型元数据)

接口 说明 参数 返回值
GetProducerName() 模型生产者名称 string
GetGraphName() 计算图名称 string
GetGraphDescription() 计算图描述 string
GetDomain() 模型域 string
GetDescription() 模型文档描述 string
GetVersion() 模型版本号 bigint
GetCustomMetadataMap() 自定义元数据映射 Record<string, string>
GetCustomMetadata(key) 获取特定自定义元数据 key: string string
ToString() 字符串表示 string
HashCode() 元数据哈希值 number

NodeInfo / TensorInfo / MapInfo / SequenceInfo(节点信息与类型信息)

接口 说明 参数 返回值
NodeInfo GetName() 获取节点名称 string
GetInfo() 获取值类型信息 ValueInfo(通常为 TensorInfo / MapInfo / SequenceInfo)
ToString() 字符串表示 string
TensorInfo 构造函数 创建张量信息 多种重载:shape: number[],elementType/onnxTensorType 等 TensorInfo
GetShape() 获取张量形状 number[]
GetDimensionNames() 获取维度名称 string[]
GetElementCount() 获取元素总数 number
IsScalar() 是否为标量 boolean
CreateDataCarrier() 创建承载此类型数据的 ArrayBuffer ArrayBuffer
onnxTensorType(只读) ONNX 张量类型 OnnxTensorType
arktsElementType(只读) 对应的 ArkTS 数据类型 OnnxArkTSType
MapInfo 构造函数 创建映射信息 size, keyType, valueType 等 MapInfo
elementCount(只读) 元素数量 number
keyType(只读) 键类型 OnnxArkTSType
valueType(只读) 值类型 OnnxArkTSType
SequenceInfo 构造函数 创建序列信息 length, elementType 等 SequenceInfo
length(只读) 序列长度 number
isMapSequence(只读) 是否为 Map 序列 boolean
elementType(只读) 元素类型 OnnxArkTSType
mapInfo(只读) 映射信息(若为 Map 序列) MapInfo

OnnxValue 及其子类(稠密张量、稀疏张量、序列、映射)

OnnxValue(基类)

接口 说明 参数 返回值
GetType() 获取值类型分类 OnnxValueType
Close() 释放值资源
IsClosed() 是否已关闭 boolean

OnnxTensor(稠密张量)

接口 说明 参数 返回值
构造函数 从 ArrayBuffer 创建 dataBuffer: ArrayBuffer,shape: number[],elementType: OnnxArkTSType OnnxTensor
构造函数 从字符串数组创建 stringValues: string[],shape: number[] OnnxTensor
GetType() 固定返回 TENSOR OnnxValueType.TENSOR
Close() 释放值资源
IsClosed() 是否已关闭 bool
GetInfo() 获取张量信息 TensorInfo
ToString() 字符串表示 string
GetDataAsArrayBuffer() 获取底层数据缓冲区 ArrayBuffer
GetDataAsStringArray() 获取字符串数据(仅 STRING 类型) string[]

OnnxMap(映射类型)

接口 说明 参数 返回值
GetType() 返回 MAP OnnxValueType.MAP
GetElementCount() 元素数量 number
GetInfo() 映射信息 MapInfo
GetKeyTypeCategory() 键的类型分类 OnnxMapValueType
GetValueTypeCategory() 值的类型分类 OnnxValueType
GetStringKeys() 获取字符串键数组 string[]
GetLongKeys() 获取长整型键数组 bigint[]
GetStringValues() 获取字符串值数组 string[]
GetLongValues() 获取长整型值数组 bigint[]
GetFloatValues() 获取浮点值数组 number[]
GetDoubleValues() 获取双精度值数组 number[]

OnnxSequence(序列类型)

接口 说明 参数 返回值
GetType() 返回 SEQUENCE OnnxValueType.SEQUENCE
GetMaps() 获取 Map 元素数组(元素为 Map 时) OnnxMap[]
GetTensors() 获取 Tensor 元素数组(元素为 Tensor 时) OnnxTensor[]
GetInfo() 序列信息 SequenceInfo

稀疏张量相关(SparseTensor 抽象类及 COO/CSRC/BlockSparseTensor)

接口 说明 参数 返回值
SparseTensor(抽象) GetSparseFormat() 获取格式 SparseTensorFormat
GetNonZeroElementCount() 非零元素数量 number
GetDenseShape() 稠密形状 number[]
GetIndicesType() 索引数据类型 OnnxArkTSType
GetIndicesShape() 索引形状 number[]
GetIndicesBuffer() 索引数据缓冲区 ArrayBuffer
GetValuesType() 值数据类型 OnnxArkTSType
GetValuesShape() 值形状 number[]
GetValuesBuffer() 值数据缓冲区 ArrayBuffer
COOTensor 构造函数 创建 COO 稀疏张量 indices: BigInt64Array,indicesShape: number[],values: ArrayBuffer,denseShape: number[],elementType: OnnxArkTSType,numNonZeroElements: number COOTensor
CSRCTensor 构造函数 创建 CSR/CSC 稀疏张量 outerIndices: BigInt64Array,innerIndices: BigInt64Array,values: ArrayBuffer,denseShape: number[],elementType: OnnxArkTSType,numNonZeroElements: number CSRCTensor
GetInnerIndicesShape() 内部索引形状 number[]
GetInnerIndicesBuffer() 内部索引缓冲区 ArrayBuffer
BlockSparseTensor 构造函数 创建分块稀疏张量 blockIndices: Int32Array,indicesShape: number[],values: ArrayBuffer,valuesShape: number[],denseShape: number[],elementType: OnnxArkTSType,numNonZeroElements: number BlockSparseTensor
OnnxSparseTensor 构造函数 OnnxSparseTensor(sparseTensor) 包装稀疏张量为OnnxValue COO / CSRC / BlockSparseTensor 实例 OnnxSparseTensor
GetType() 获取值类型分类(固定返回 SPARSE_TENSOR) OnnxValueType.SPARSE_TENSOR
Close() 释放底层资源
IsClosed() 是否已关闭 boolean
GetInfo() 获取对应稠密张量的类型信息 TensorInfo
ToString() 获取对象的字符串表示(调试用) string
GetSparseFormat() 获取稀疏存储格式 SparseTensorFormat
GetIndicesBuffer() 获取外层索引数据缓冲区(COO 坐标、CSRC 行指针、Block 块索引) ArrayBuffer
GetInnerIndicesBuffer() 获取内层索引数据缓冲区(仅 CSRC 格式有效,列/行索引) ArrayBuffer
GetValuesBuffer() 获取非零元素值数据缓冲区 ArrayBuffer
GetIndicesShape() 获取外层索引数组的形状 number[]
GetInnerIndicesShape() 获取内层索引数组的形状(仅 CSRC 有效) number[]
GetValuesShape() 获取非零元素值数组的形状 number[]

以上涵盖了 onnxruntime 库对外开放的主要类和方法。更多类型细节可参考 Index.d.ts 源码。

项目结构

|---- ohos_onnxruntime
|     |---- entry  # 示例代码文件夹
|     |---- library  # onnxruntime 库文件夹
|     |     |---- src
|     |     |     └── main  
|     |     |         |---- cpp  # C++ Native 代码
|     |     |                |---- napi        # onnxruntime napi 代码
|     |     |                |---- thirdparty  # onnxruntime 编译产物存放目录
|     |     |                |---- types
|     |     |                |       |---- libonnxruntime_napi/Index.d.ts  # 接口定义
|     |     |                └──   CMakeLists.txt
|     |     |---- Index.ets  # 对外接口
|     |---- README.md  # 英文说明
|     |---- README_zh.md  # 中文说明

贡献代码

使用过程中发现任何问题都可以提 Issue ,当然,也非常欢迎发 PR 共建。

开源协议

本项目基于 MIT License ,请自由地享受和参与开源。