RKNN模型部署API说明
1. 基本数据结构定义
本章在、RKNN Runtime C API在使用主要数据構造说明。的结构体、模型信息、入输出张量、性能信息、内存管理、推理执行、自定义信息等扱为在使用。
1.1 rknn_sdk_version
结构体rknn_sdk_version表示RKNN SDK的版本信息,结构体的定义如下:
| 成员变量 | 数据类型 | 含义 |
|---|---|---|
| api_version | char[] | SDK的版本信息。 |
| drv_version | char[] | SDK所基于的驱动版本信息。 |
1.2 rknn_input_output_num
结构体rknn_input_output_num输入张量输出张量的数表、该変数下表在示。
| 成员变量 | 数据类型 | 含义 |
|---|---|---|
| n_input | uint32_t | 输入tensor数。 |
| n_output | uint32_t | 输入tensor数。 |
1.3 rknn_input_range
结构体rknn_input_range、输入在対支持形状的列表表示。该结构体在、输入、支持形状的数、数据格式、名称、和形状列表包含。具体的结构体定义、下表在示。
| 成员变量 | 数据类型 | 含义 |
|---|---|---|
| index | uint32_t | 输入形状在支持位置表示。 |
| shape_number | uint32_t | RKNN模型支持输入形状的数示。 |
| fmt | rknn_tensor_format | 形状在支持数据格式。 |
| name | char[] | 输入名称示。 |
| dyn_range | uint32_t[][] | 输入列表表、多个的数组含2维度数组在、優先順位在従格納。 |
| n_dims | uint32_t | 各形状数组的有效维度数表示。 |
1.4 rknn_tensor_attr
张量的属性表重要结构体。index、n_dims、dims、name、n_elems、size、fmt、type、qnt_type、scale、zero_point、stride等含。
| 成员变量 | 数据类型 | 含义 |
|---|---|---|
| index | uint32_t | 输入或输出张量。 |
| n_dims | uint32_t | 张量的维度数 |
| dims | uint32_t[] | 张量形状 |
| name | char[] | 张量名称 |
| n_elems | uint32_t | 张量数据要素的数 |
| size | uint32_t | 张量数据的内存 |
| fmt | rknn_tensor_format | 张量维度的以下的如下。 RKNN_TENSOR_NCHW、RKNN_TENSOR_NHWC、 RKNN_TENSOR_NC1HWC2、 RKNN_TENSOR_UNDEFINED |
| type | rknn_tensor_type | 张量数据类型在、RKNN_TENSOR_FLOAT32、RKNN_TENSOR_FLOAT16、RKNN_TENSOR_INT8、RKNN_TENSOR_UINT8、RKNN_TENSOR_INT16、RKNN_TENSOR_UINT16、RKNN_TENSOR_INT32、RKNN_TENSOR_INT64、和RKNN_TENSOR_BOOL包含。 |
| qnt_type | rknn_tensor_qnt_type | 张量量化的種類以下的如下。 RKNN_TENSOR_QNT_NONE:量化 RKNN_TENSOR_QNT_DFP:动态定点量化 RKNN_TENSOR_QNT_AFFINE_ASYMMETRIC:非对称量化 |
| fl | int8_t | RKNN_TENSOR_QNT_DFP量化的参数。 |
| scale | float | RKNN_TENSOR_QNT_AFFINE_ASYMMETRIC 量化的参数。 |
| w_stride | uint32_t | 画像数据的1行格納実際的数、该行的有效数据数在、硬件次的行到素早在在无效数加数(単位)在等。 |
| size_with_stride | uint32_t | 保存画像数据実際在占記憶容量(无效的記憶容量含)。 |
| pass_through | uint8_t | 0未変換数据、1変換済数据表示。変換在归一化量化包含。 |
| h_stride | uint32_t | 该设置、多个输入在的有效在、用户定义。目的、NPU各数据的開始正読取。该、元的模型的输入高在、次的列在无效数加値在等。该値0在设置、元的模型的输入高同数在。 |
1.5 rknn_perf_detail
结构体rknn_perf_detail表示模型的性能详细,结构体的定义次的表的如下。
| 成员变量 | 数据类型 | 含义 |
|---|---|---|
| perf_data | char* | 的详细在、网络的各層的执行時間含、印刷確認可以。 |
| data_len | uint64_t | 的详细格納字符串数组的長。 |
1.6 rknn_perf_run
结构体rknn_perf_run、模型的全体的表示。结构体的定义下表在示。
(RV1106/RV1106B/RV1103/RV1103B/RK2118当前支持)
| 成员变量 | 数据类型 | 含义 |
|---|---|---|
| run_duration | int64_t | 网络的総稼働時間(時的入输出除)秒単位在測定。 |
1.7 rknn_mem_size
rknn_mem_size结构体、模型初始化時的内存割当表示。结构体的定义下表在示。
| 成员变量 | 数据类型 | 含义 |
|---|---|---|
| total_weight_size | uint32_t | 模型的重占内存量。 |
| total_internal_size | uint32_t | 模型内的中間张量的内存 |
| total_dma_allocated_size | uint64_t | 模型在割当所有的DMA内存的合計。 |
| total_sram_size | uint32_t | RK3588在的有效在、NPU用在予約SRAM。 |
| free_sram_size | uint32_t | RK3588在的適用、当前利用可能空SRAM表示。 |
| reserved[12] | uint32_t | 予備領域 |
1.8 rknn_tensor_mem
结构体rknn_tensor_mem表示tensor的内存信息。结构体的定义次的表的如下:
| 成员变量 | 数据类型 | 含义 |
|---|---|---|
| virt_addr | void* | 张量的仮想 |
| phys_addr | uint64_t | 张量的物理。 |
| fd | int32_t | 该张量的文件。 |
| offset | int32_t | 文件仮想从的 |
| size | int32_t | 该张量占内存。 |
| flags | int32_t | rknn_tensor_mem 的在、次的。RKNN_TENSOR_MEMORY_FALGS_ALLOC_INSIDE: rknn_tensor_mem 结构体执行時在作成表示。RKNN_TENSOR_MEMORY_FLAGS_FROM_FD: rknn_tensor_mem 结构体文件 (fd) 从构建表示。RKNN_TENSOR_MEMORY_FLAGS_FROM_PHYS: rknn_tensor_mem 结构体物理从构建表示。用户的在注意払必要。 |
| priv_data | void* | 内存内的数据 |
1.9 rknn_input
结构体 rknn_input 、模型的1的输入数据表、rknn_inputs_set 函数到渡参数作为使用。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| index | uint32_t | 该输入的位置。 |
| buf | void* | 输入数据到。 |
| size | uint32_t | 输入数据占有内存。 |
| pass_through | uint8_t | 1在设置、buf在格納输入数据模型的输入节点到直接设置、前処理行。 |
| type | rknn_tensor_type | 输入数据的型。 |
| fmt | rknn_tensor_format | 输入数据的格式。 |
1.10 rknn_output
结构体 rknn_output 、模型的1的输出数据表、rknn_outputs_get 函数到渡参数作为使用。函数执行後、该结构体对象在値设置。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| want_float | uint8_t | 输出数据float型到変換输出必要表示。该用户设置。 |
| is_prealloc | uint8_t | 输出数据格納事前割当表示。该用户设置。 |
| index | uint32_t | 该输出的位置。该用户设置。 |
| buf | void* | 输出数据到。该接口从返。 |
| size | uint32_t | 输出数据占有内存。该接口从返。 |
1.11 rknn_init_extend
结构体 rknn_init_extend 、模型初始化時的拡張信息表示。结构体的定义如下(RV1106/RV1106B/RV1103/RV1103B/RK2118 当前未支持)。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| ctx | rknn_context | 初始化済的 rknn_context 对象。 |
| real_model_offset | int32_t | 実際的RKNN模型文件内在存在。文件路径参数作为使用場合、或零拷贝的模型内存初始化時的有效。 |
| real_model_size | int32_t | 実際的RKNN模型的文件内。文件路径参数作为使用場合、或零拷贝的模型内存初始化時的有效。 |
| model_buffer_fd | int32_t | RKNN_FLAG_MODEL_BUFFER_ZERO_COPY 在初始化後、NPU割当模型内存表fd。 |
| model_buffer_flags | int32_t | RKNN_FLAG_MODEL_BUFFER_ZERO_COPY 在初始化後、NPU割当模型内存表内存。 |
| reserved | uint8_t[] | 予約数据領域。 |
1.12 rknn_run_extend
结构体 rknn_run_extend 、模型推理時的拡張信息表示。当前使用未支持。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| frame_id | uint64_t | 当前的推理番号表示。 |
| non_block | int32_t | 0、1表示。在 rknn_run 调用直接返。 |
| timeout_ms | int32_t | 推理上限。単位秒。 |
| fence_fd | int32_t | 推理执行用。当前未支持。 |
1.13 rknn_output_extend
结构体 rknn_output_extend 、输出获取時的拡張信息表示。当前使用未支持。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| frame_id | int32_t | 输出結果的番号。 |
1.14 rknn_custom_string
结构体 rknn_custom_string 、RKNN模型変換時在用户设置自定义字符串表示。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| string | char[] | 用户定义字符串。 |
2. 基础API说明
2.1 rknn_init
rknn_init 初始化函数、rknn_context 对象的作成、RKNN模型加载、和 flag rknn_init_extend 结构体在基特定的初始化動作执行。
| 项目 | 内容 |
|---|---|
| API | rknn_init |
| 機能 | rknn初始化。 |
| 参数 | rknn_context *context:rknn_context。 void *model:RKNN模型的数据、或RKNN模型的路径。size0比大場合、model数据表示。size0的場合、modelRKNN模型路径表示。 uint32_t size:model数据的場合模型表、model路径的場合0在设置。 uint32_t flag:初始化。的初始化動作在0设置。 rknn_init_extend:特定的初始化時的拡張信息。使用場合NULL渡。模型weight内存共有場合、別的模型的rknn_context渡需要。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_context ctx;int ret = rknn_init(&ctx, model_data, model_data_size, 0, NULL);各初始化的说明如下。
RKNN_FLAG_COLLECT_PERF_MASK:运行时時在网络各层的時間查询为在使用。
RKNN_FLAG_MEM_ALLOC_OUTSIDE:模型的输入、输出、weight、中間张量的内存所有用户割当表示。主用途、
1.全体的内存用户一元的在管理
2.内存再利用。特在RV1103/RV1106/RV1103B/RV1106B/RK2118的在内存非常在限場合在有效。
模型A模型B設計上在执行場合、2的模型的中間张量内存再利用可以。
示例:
rknn_context ctx_a, ctx_b;
rknn_init(&ctx_a, model_path_a, 0, RKNN_FLAG_MEM_ALLOC_OUTSIDE, NULL);rknn_query(ctx_a, RKNN_QUERY_MEM_SIZE, &mem_size_a, sizeof(mem_size_a));
rknn_init(&ctx_b, model_path_b, 0, RKNN_FLAG_MEM_ALLOC_OUTSIDE, NULL);rknn_query(ctx_b, RKNN_QUERY_MEM_SIZE, &mem_size_b, sizeof(mem_size_b));
max_internal_size = MAX(mem_size_a.total_internal_size, mem_size_b.total_internal_size);internal_mem_max = rknn_create_mem(ctx_a, max_internal_size);
internal_mem_a = rknn_create_mem_from_fd(ctx_a, internal_mem_max->fd, internal_mem_max->virt_addr, mem_size_a.total_internal_size, 0);rknn_set_internal_mem(ctx_a, internal_mem_a);
internal_mem_b = rknn_create_mem_from_fd(ctx_b, internal_mem_max->fd, internal_mem_max->virt_addr, mem_size_b.total_internal_size, 0);rknn_set_internal_mem(ctx_b, internal_mem_b);RKNN_FLAG_SHARE_WEIGHT_MEM:別模型的weight共有为在使用。主在可変長输入疑似的在扱为在使用(RKNPU运行时1.5.0以降在、该機能动态shape機能在置換)。
例、一部的音声模型在输入長可変、NPU可変長输入支持为、異解像度的RKNN模型多个生成需要。1的RKNN模型的完全重保持、他的模型重保持。重保持RKNN模型初始化際在该使用、当前的在完全RKNN模型的重共有可以。解像度AB的2的模型必要場合、手順以下的如下。
-
RKNN-Toolkit2使用、解像度A的模型生成。
-
RKNN-Toolkit2使用、解像度B的重保持模型生成。
rknn.config()在、主在模型B的小为在、remove_weight``True在设置需要。 -
模型A上在通常初始化。
-
RKNN_FLAG_SHARE_WEIGHT_MEM使用、模型B初始化。 5. 残通常使用。基板側的参照以下的如下。
示例:
rknn_context ctx_a, ctx_b;rknn_init(&ctx_a, model_path_a, 0, 0, NULL);
rknn_init_extend extend;extend.ctx = ctx_a;rknn_init(&ctx_b, model_path_b, 0, RKNN_FLAG_SHARE_WEIGHT_MEM, &extend);RKNN_FLAG_COLLECT_MODEL_INFO_ONLY:空的初始化、rknn_query在模型weight内存総量和中間张量総量的查询。推理在。
RKNN_FLAG_INTERNAL_ALLOC_OUTSIDE:模型中間张量用户割当示、多个模型間的中間张量内存用户管理再利用場合在使用。
RKNN_FLAG_EXECUTE_FALLBACK_PRIOR_DEVICE_GPU:NPU支持所有的层在、優先的在GPU在执行表示。GPU上在的执行保証、実際的执行运行时该算子支持状況在依存。
RKNN_FLAG_ENABLE_SRAM:中間张量内存可能限SRAM上在割当。
RKNN_FLAG_SHARE_SRAM:当前的別的的SRAM空間共有表示。当前的初始化時在 RKNN_FLAG_ENABLE_SRAM 同時在有效在需要。
RKNN_FLAG_DISABLE_PROC_HIGH_PRIORITY:当前的在的優先度使用。该设置場合、的nice値 -19 在。
RKNN_FLAG_DISABLE_FLUSH_INPUT_MEM_CACHE:该设置、runtime内部在输入张量缓存自動。用户 rknn_run 调用前在输入张量的缓存済在保証需要。输入数据CPU从場合、runtime内部的缓存時間削減为在使用。
RKNN_FLAG_DISABLE_FLUSH_OUTPUT_MEM_CACHE:该设置、runtime输出张量缓存自動。该場合、用户 output_mem->virt_addr 直接在。缓存整合性的問題発生。output_mem->virt_addr 使用場合、rknn_mem_sync(ctx, mem, RKNN_MEMORY_SYNC_FROM_DEVICE) 在缓存更新需要。该通常、NPU的输出数据CPU、GPURGA場合在、缓存更新時間削減为在使用。
RKNN_FLAG_MODEL_BUFFER_ZERO_COPY:rknn_init在渡模型buffer rknn_create_mem 或 rknn_create_mem2 在割当内存在、runtime内部在模型buffer再表示。在比执行時内存使用量削減可以。、破棄前在模型内存有效在、和破棄後在该内存释放用户保証需要。
RKNN_MEM_FLAG_ALLOC_NO_CONTEXT: rknn_create_mem2在内存割当際在该设置、ctx参数在0或NULL指定可以。在比、的初始化状態在NPU驱动割当内存获取可以。返内存结构体 rknn_destroy_mem 在释放必要、释放時的参数在任意的使用可以。
示例:
rknn_tensor_mem* model_mem = rknn_create_mem2(ctx, model_size,RKNN_MEM_FLAG_ALLOC_NO_CONTEXT);memcpy(model_mem->virt_addr, model_data, model_size);rknn_init_extend init_ext; memset(&init_ext, 0, sizeof(rknn_init_extend)); init_ext.real_model_offset = 0; init_ext.real_model_size = model_size; init_ext.model_buffer_fd = model_mem->fd; init_ext.model_buffer_flags = model_mem->flags; int ret = rknn_init(&ctx, model_mem->virt_addr, model_size, RKNN_FLAG_MODEL_BUFFER_ZERO_COPY,&init_ext);
// do rknn inference...
rknn_destroy_mem(ctx, model_mem);rknn_destroy(ctx);2.2 rknn_set_core_mask
rknn_set_core_mask 函数、動作NPU指定。该函数RK3576/RK3588平台的支持、单一NPU的平台在设置返。
| 项目 | 内容 |
|---|---|
| API | rknn_set_core_mask |
| 機能 | 执行NPU设置。 |
| 参数 | rknn_context context:rknn_context对象。 rknn_core_mask core_mask:NPU的列挙型。设置方法以下的如下。 RKNN_NPU_CORE_AUTO:模型自動、当前空NPU上在自動执行。 RKNN_NPU_CORE_0:NPU0上在执行。 RKNN_NPU_CORE_1:NPU1上在执行。 RKNN_NPU_CORE_2:NPU2上在执行。 RKNN_NPU_CORE_0_1:NPU0和NPU1上在同時在動作。 RKNN_NPU_CORE_0_1_2:NPU0、NPU1、NPU2上在同時在動作。 RKNN_NPU_CORE_ALL:所有的NPU上在動作。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_context ctx;rknn_core_mask core_mask = RKNN_NPU_CORE_0;int ret = rknn_set_core_mask(ctx, core_mask);RKNN_NPU_CORE_0_1 和 RKNN_NPU_CORE_0_1_2 在、当前 Conv、DepthwiseConvolution、Add、Concat、Relu、Clip、Relu6、ThresholdedRelu、PRelu、LeakyRelu 等的OP在比良高速化得。该他的OP单一Core0到fallback执行。一部的OP(Pool系、ConvTranspose等)後続版本在支持予定。
2.3 rknn_set_batch_core_num
rknn_set_batch_core_num 函数、RKNN模型(RKNN-Toolkit2変換時在 rknn_batch_size 1比大设置导出模型)的NPU数指定。该函数RK3588/RK3576平台的支持。
| 项目 | 内容 |
|---|---|
| API | rknn_set_batch_core_num |
| 機能 | RKNN模型执行NPU数设置。 |
| 参数 | rknn_context context:rknn_context对象。 int core_num:执行数指定。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_context ctx;int ret = rknn_set_batch_core_num(ctx, 2);2.4 rknn_dup_context
rknn_dup_context 同一模型指新 context 生成、同一模型在执行際的weight再利用在使用可以。RV1106/RV1103/RV1106B/RV1103B/RK2118平台当前未支持。
| 项目 | 内容 |
|---|---|
| API | rknn_dup_context |
| 機能 | 同一模型的2的ctx生成、模型的weight信息再利用。 |
| 参数 | rknn_context *context_in:rknn_context。初始化済的rknn_context对象。 rknn_context *context_out:rknn_context。新rknn_context对象生成。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_context ctx_in;rknn_context ctx_out;int ret = rknn_dup_context(&ctx_in, &ctx_out);2.5 rknn_destroy
rknn_destroy 函数、渡 rknn_context 和関連释放。
| 项目 | 内容 |
|---|---|
| API | rknn_destroy |
| 機能 | rknn_context对象和関連破棄。 |
| 参数 | rknn_context context:破棄rknn_context对象。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_context ctx;int ret = rknn_destroy(ctx);2.6 rknn_query
rknn_query 函数、模型的输入/输出信息、各层的执行時間、模型推理的総時間、SDK版本、内存使用量信息、用户定义字符串等的信息查询获取可以。
| 项目 | 内容 |
|---|---|
| API | rknn_query |
| 機能 | 模型和SDK関連信息查询。 |
| 参数 | rknn_context context:rknn_context对象。 rknn_query_cmd:查询。 void* info:返回结果格納结构体変数。 uint32_t size:info在支持结构体変数。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
SDK在当前支持下表在表示。
| 返回结果结构体 | 機能 | |
|---|---|---|
| RKNN_QUERY_IN_OUT_NUM | rknn_input_output_num | 输入张量和输出张量的個数查询。 |
| RKNN_QUERY_INPUT_ATTR | rknn_tensor_attr | 输入张量属性查询。 |
| RKNN_QUERY_OUTPUT_ATTR | rknn_tensor_attr | 输出张量属性查询。 |
| RKNN_QUERY_PERF_DETAIL | rknn_perf_detail | 网络各层的执行時間查询。rknn_init调用時在 RKNN_FLAG_COLLECT_PERF_MASK 设置場合在有效。 |
| RKNN_QUERY_PERF_RUN | rknn_perf_run | 推理模型的処理時間(输入/输出设置含)查询。単位秒。 |
| RKNN_QUERY_SDK_VERSION | rknn_sdk_version | SDK版本查询。 |
| RKNN_QUERY_MEM_SIZE | rknn_mem_size | weight和网络中間张量在割当内存查询。 |
| RKNN_QUERY_CUSTOM_STRING | rknn_custom_string | RKNN模型内的用户定义字符串信息查询。 |
| RKNN_QUERY_NATIVE_INPUT_ATTR | rknn_tensor_attr | 零拷贝API使用時在、NPU直接読取模型输入属性在原生输入张量属性查询。 |
| RKNN_QUERY_NATIVE_OUTPUT_ATTR | rknn_tensor_attr | 零拷贝API使用時在、NPU直接输出模型输出属性在原生输出张量属性查询。 |
| RKNN_QUERY_NATIVE_NC1HWC2_INPUT_ATTR | rknn_tensor_attr | 零拷贝API使用時在原生输入张量属性查询。結果 RKNN_QUERY_NATIVE_INPUT_ATTR 一致。 |
| RKNN_QUERY_NATIVE_NC1HWC2_OUTPUT_ATTR | rknn_tensor_attr | 零拷贝API使用時在原生输出张量属性查询。結果 RKNN_QUERY_NATIVE_OUTPUT_ATTR 一致。 |
| RKNN_QUERY_NATIVE_NHWC_INPUT_ATTR | rknn_tensor_attr | 零拷贝API使用時在原生输入张量属性查询。結果 RKNN_QUERY_NATIVE_INPUT_ATTR 一致。 |
| RKNN_QUERY_NATIVE_NHWC_OUTPUT_ATTR | rknn_tensor_attr | 零拷贝API使用時在原生输出NHWC张量属性查询。 |
| RKNN_QUERY_DEVICE_MEM_INFO | rknn_tensor_mem | 模型buffer的内存属性查询。 |
| RKNN_QUERY_INPUT_DYNAMIC_RANGE | rknn_input_range | 动态形状在支持RKNN模型使用時在、模型支持输入形状数、列表、形状在支持数据和名称等查询。 |
| RKNN_QUERY_CURRENT_INPUT_ATTR | rknn_tensor_attr | 动态形状在支持RKNN模型使用時在、当前的推理在使用输入属性查询。 |
| RKNN_QUERY_CURRENT_OUTPUT_ATTR | rknn_tensor_attr | 动态形状在支持RKNN模型使用時在、当前的推理在使用输出属性查询。 |
| RKNN_QUERY_CURRENT_NATIVE_INPUT_ATTR | rknn_tensor_attr | 动态形状在支持RKNN模型使用時在、当前的推理在使用NPU原生输入属性查询。 |
| RKNN_QUERY_CURRENT_NATIVE_OUTPUT_ATTR | rknn_tensor_attr | 动态形状在支持RKNN模型使用時在、当前的推理在使用NPU原生输出属性查询。 |
各的使用方法
1. 查询SDK版本
RKNN_QUERY_SDK_VERSION 渡在、RKNN SDK的版本信息查询可以。先在 rknn_sdk_version 结构体对象作成需要。
示例:
rknn_sdk_version version;ret = rknn_query(ctx, RKNN_QUERY_SDK_VERSION, &version, sizeof(rknn_sdk_version));printf("sdk api version: %s\n", version.api_version);printf("driver version: %s\n", version.drv_version);2. 输入张量和输出张量的個数的查询
rknn_init 接口调用完了後、RKNN_QUERY_IN_OUT_NUM 渡在、模型的输入张量和输出张量的個数查询可以。先在 rknn_input_output_num 结构体对象作成需要。
示例:
rknn_input_output_num io_num;ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));printf("model input num: %d, output num: %d\n", io_num.n_input, io_num.n_output);3. 输入张量属性的查询(汎用API用)
rknn_init 接口调用完了後、RKNN_QUERY_INPUT_ATTR 渡在模型输入张量属性查询可以。先在 rknn_tensor_attr 结构体对象作成需要。注意:RV1106/RV1103/RV1106B/RV1103B/RK2118在查询张量、元输入的原生张量。
示例:
rknn_tensor_attr input_attrs[io_num.n_input];memset(input_attrs, 0, sizeof(input_attrs));for (int i = 0; i < io_num.n_input; i++) { input_attrs[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]), sizeof(rknn_tensor_attr));}4. 输出张量属性的查询(汎用API用)
rknn_init 接口调用完了後、RKNN_QUERY_OUTPUT_ATTR 渡在模型输出张量属性查询可以。先在 rknn_tensor_attr 结构体对象作成需要。
示例:
rknn_tensor_attr output_attrs[io_num.n_output];memset(output_attrs, 0, sizeof(output_attrs));for (int i = 0; i < io_num.n_output; i++) { output_attrs[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]), sizeof(rknn_tensor_attr));}5. 模型推理的各层処理時間的查询
rknn_run 接口调用完了後、rknn_query 在 RKNN_QUERY_PERF_DETAIL 渡在、网络推理時的各层処理時間查询可以。単位秒。该使用前提作为、rknn_init 的 flag 参数在 RKNN_FLAG_COLLECT_PERF_MASK 含需要。
示例:
rknn_context ctx;int ret = rknn_init(&ctx, model_data, model_data_size, RKNN_FLAG_COLLECT_PERF_MASK, NULL);...ret = rknn_run(ctx, NULL);...rknn_perf_detail perf_detail;ret = rknn_query(ctx, RKNN_QUERY_PERF_DETAIL, &perf_detail, sizeof(perf_detail));6. 模型推理的総処理時間的查询
rknn_run 接口调用完了後、rknn_query 在 RKNN_QUERY_PERF_RUN 渡在、模型推理(输入/输出设置含)的処理時間查询可以。単位秒。
示例:
rknn_context ctx;int ret = rknn_init(&ctx, model_data, model_data_size, 0, NULL);...ret = rknn_run(ctx, NULL);...rknn_perf_run perf_run;ret = rknn_query(ctx, RKNN_QUERY_PERF_RUN, &perf_run, sizeof(perf_run));7. 模型的内存使用状況的查询
rknn_init 接口调用完了後、用户网络内存自分在割当必要場合、rknn_query 在 RKNN_QUERY_MEM_SIZE 渡在、模型的weight、网络中間张量的内存(输入输出含)、推理模型使用所有的DMA内存、和SRAM内存(SRAM有效在、或该機能場合0)的使用状況查询可以。该使用前提作为、rknn_init 的 flag 参数在 RKNN_FLAG_MEM_ALLOC_OUTSIDE 含需要。
示例:
rknn_context ctx;int ret = rknn_init(&ctx, model_data, model_data_size, RKNN_FLAG_MEM_ALLOC_OUTSIDE, NULL);rknn_mem_size mem_size;ret = rknn_query(ctx, RKNN_QUERY_MEM_SIZE, &mem_size, sizeof(mem_size));8. 模型内用户定义字符串的查询
rknn_init 接口调用完了後、RKNN模型生成時在追加用户定义字符串查询場合、rknn_query 在 RKNN_QUERY_CUSTOM_STRING 渡在该字符串获取可以。例、RKNN模型変換時在用户「RGB」自定义字符串输入、RKNN模型输入BGR格式的3通道画像在RGB格式的3通道画像在識別可以。运行时時在、查询「RGB」信息在基数据RGB画像到変換可以。
示例:
rknn_context ctx;int ret = rknn_init(&ctx, model_data, model_data_size, 0, NULL);rknn_custom_string custom_string;ret = rknn_query(ctx, RKNN_QUERY_CUSTOM_STRING, &custom_string, sizeof(custom_string));9. 原生输入张量属性的查询(零拷贝API用)
rknn_init接口调用完了後、RKNN_QUERY_NATIVE_INPUT_ATTR(RKNN_QUERY_NATIVE_NC1HWC2_INPUT_ATTR同)渡在、模型的原生输入张量的属性查询可以。在、rknn_tensor_attr结构体对象作成需要。
示例:
rknn_tensor_attr input_attrs[io_num.n_input];memset(input_attrs, 0, sizeof(input_attrs));for (int i = 0; i < io_num.n_input; i++) { input_attrs[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_NATIVE_INPUT_ATTR, &(input_attrs[i]), sizeof(rknn_tensor_attr));}10. 原生输出张量属性的查询(零拷贝API用)
rknn_init接口调用完了後、RKNN_QUERY_NATIVE_OUTPUT_ATTR(RKNN_QUERY_NATIVE_NC1HWC2_OUTPUT_ATTR同)渡在、模型的原生输出张量的属性查询可以。在、rknn_tensor_attr结构体对象作成需要。
示例:
rknn_tensor_attr output_attrs[io_num.n_output];memset(output_attrs, 0, sizeof(output_attrs));for (int i = 0; i < io_num.n_output; i++) { output_attrs[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_NATIVE_OUTPUT_ATTR, &(output_attrs[i]), sizeof(rknn_tensor_attr));}11. NHWC格式原生输入张量属性的查询(零拷贝API用)
rknn_init接口调用完了後、RKNN_QUERY_NATIVE_NHWC_INPUT_ATTR渡、模型的NHWC格式的输入张量的属性查询可以。在、rknn_tensor_attr结构体对象作成需要。
示例:
rknn_context ctx;int ret = rknn_init(&ctx, model_data, model_data_size, RKNN_FLAG_COLLECT_PERF_MASK, NULL);...ret = rknn_run(ctx, NULL);...rknn_perf_detail perf_detail;ret = rknn_query(ctx, RKNN_QUERY_PERF_DETAIL, &perf_detail, sizeof(perf_detail));12. NHWC格式原生输出张量属性的查询(零拷贝API用)
rknn_init接口调用完了後、RKNN_QUERY_NATIVE_NHWC_OUTPUT_ATTR渡、模型的NHWC格式输出张量的属性查询可以。在、rknn_tensor_attr结构体对象作成需要。
示例:
rknn_tensor_attr output_attrs[io_num.n_output];memset(output_attrs, 0, sizeof(output_attrs));for (int i = 0; i < io_num.n_output; i++) { output_attrs[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_NATIVE_NHWC_OUTPUT_ATTR, &(output_attrs[i]), sizeof(rknn_tensor_attr));}13. 模型buffer的内存属性的查询
(注: 该 RV1106/RV1103/RV1106B/RV1103B/RK2118 在的支持)
rknn_init 调用完了後、RKNN_QUERY_DEVICE_MEM_INFO 渡、运行时内在割当模型 的属性 (fd、物理、该他的属性含) 查询可以。 示例:
rknn_tensor_mem mem_info;memset(&mem_info, 0, sizeof(mem_info));ret = rknn_query(ctx, RKNN_QUERY_DEVICE_MEM_INFO, &mem_info, sizeof(mem_info));14. RKNN模型支持动态输入形状信息的查询
(注:该接口RV1106/RV1103/RV1106B/RV1103B/RK2118在支持)
rknn_init接口调用完了後、RKNN_QUERY_INPUT_DYNAMIC_RANGE执行在、模型支持输入形状信息(输入形状的数、输入形状的列表、支持输入形状的名称等)查询可以。在、rknn_input_range结构体对象作成需要。
示例:
rknn_input_range dyn_range[io_num.n_input];memset(dyn_range, 0, io_num.n_input * sizeof(rknn_input_range));for (uint32_t i = 0; i < io_num.n_input; i++) { dyn_range[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_INPUT_DYNAMIC_RANGE, &dyn_range[i], sizeof(rknn_input_range));}15. RKNN模型当前使用输入动态形状的查询
rknn_set_input_shapes 接口调用完了、RKNN_QUERY_CURRENT_INPUT_ATTR 渡、模型在当前使用输入属性信息查询可以。最初在 rknn_tensor_attr 结构体作成需要 (注: 该 RV1106/RV1103/RV1106B/RV1103B/RK2118 在支持)。
示例:
rknn_tensor_attr cur_input_attrs[io_num.n_input];memset(cur_input_attrs, 0, io_num.n_input * sizeof(rknn_tensor_attr));for (uint32_t i = 0; i < io_num.n_input; i++) { cur_input_attrs[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_CURRENT_INPUT_ATTR, &(cur_input_attrs[i]), sizeof(rknn_tensor_attr));}16. RKNN模型当前使用输出动态形状的查询
rknn_set_input_shapes接口调用完了、RKNN_QUERY_CURRENT_OUTPUT_ATTR渡、模型在当前使用输出属性信息查询可以。最初在rknn_tensor_attr结构体作成需要(注:该RV1106/RV1103/RV1106B/RV1103B/RK2118在支持)。
示例:
rknn_tensor_attr cur_output_attrs[io_num.n_output];memset(cur_output_attrs, 0, io_num.n_output * sizeof(rknn_tensor_attr));for (uint32_t i = 0; i < io_num.n_output; i++) { cur_output_attrs[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_CURRENT_OUTPUT_ATTR, &(cur_output_attrs[i]), sizeof(rknn_tensor_attr));}17. RKNN模型当前使用原生输入动态形状的查询
rknn_set_input_shapes 接口调用完了、RKNN_QUERY_CURRENT_NATIVE_INPUT_ATTR 渡、模型当前使用原生输入属性信息查询可以。在、 rknn_tensor_attr 结构体作成需要 (注: 该 RV1106/RV1103/RV1106B/RV1103B/RK2118 在支持)。
示例:
rknn_tensor_attr cur_input_attrs[io_num.n_input];memset(cur_input_attrs, 0, io_num.n_input * sizeof(rknn_tensor_attr));for (uint32_t i = 0; i < io_num.n_input; i++) { cur_input_attrs[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_CURRENT_NATIVE_INPUT_ATTR, &(cur_input_attrs[i]), sizeof(rknn_tensor_attr));}18. RKNN模型当前使用原生输出动态形状的查询
rknn_set_input_shapes 接口调用完了、RKNN_QUERY_CURRENT_NATIVE_OUTPUT_ATTR 渡、模型当前使用原生输出属性信息查询可以。在、 rknn_tensor_attr 结构体作成需要 (注: 该 RV1106/RV1103/RV1106B/RV1103B/RK2118 在支持)。
示例:
rknn_tensor_attr cur_output_attrs[io_num.n_output];memset(cur_output_attrs, 0, io_num.n_output * sizeof(rknn_tensor_attr));for (uint32_t i = 0; i < io_num.n_output; i++) { cur_output_attrs[i].index = i; ret = rknn_query(ctx, RKNN_QUERY_CURRENT_NATIVE_OUTPUT_ATTR, &(cur_output_attrs[i]), sizeof(rknn_tensor_attr));}2.6 rknn_inputs_set
rknn_inputs_set 函数在比模型的输入数据设置可以。该函数多个输入支持、各输入 rknn_input 结构体对象。渡前在用户各对象设置需要。注:RV1106/RV1103/RV1106B/RV1103B/RK2118 该接口未支持。
| 项目 | 内容 |
|---|---|
| API | rknn_inputs_set |
| 機能 | 模型输入数据设置。 |
| 参数 | rknn_context context:rknn_context对象。 uint32_t n_inputs:输入数据的個数。 rknn_input inputs[]:输入数据数组。数组的各要素 rknn_input 结构体对象。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_input inputs[1];memset(inputs, 0, sizeof(inputs));inputs[0].index = 0;inputs[0].type = RKNN_TENSOR_UINT8;inputs[0].size = img_width * img_height * img_channels;inputs[0].fmt = RKNN_TENSOR_NHWC;inputs[0].buf = in_data;inputs[0].pass_through = 0;ret = rknn_inputs_set(ctx, 1, inputs);;2.7 rknn_run
rknn_run 函数1回的模型推理执行。调用前在 rknn_inputs_set 函数、或零拷贝接口在比输入数据设置需要。
| 项目 | 内容 |
|---|---|
| API | rknn_run |
| 機能 | 1回的模型推理执行。 |
| 参数 | rknn_context context:rknn_context对象。 rknn_run_extend* extend:予約拡張。当前使用为NULL渡。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
ret = rknn_run(ctx, NULL);2.8 rknn_outputs_get
rknn_outputs_get 函数模型推理的输出数据获取。该函数多个的输出数据一度在获取可以。各输出 rknn_output 结构体对象在、函数调用前在各 rknn_output 对象順在作成设置需要。输出数据的buffer格納在2的方式。1用户自分在確保释放方式在、该場合 rknn_output 对象的 is_prealloc 1在设置、buf用户確保buffer在向。1 rknn 割当方式在、该場合 is_prealloc 0在设置、函数执行後在 buf 输出数据指。注:RV1106/RV1103/RV1106B/RV1103B/RK2118 该接口未支持。
| 项目 | 内容 |
|---|---|
| API | rknn_outputs_get |
| 機能 | 模型推理输出获取。 |
| 参数 | rknn_context context:rknn_context对象。 uint32_t n_outputs:输出数据的個数。 rknn_output outputs[]:输出数据数组。数组的各要素 rknn_output 结构体对象在、模型的1的输出表示。 rknn_output_extend* extend:予約拡張。当前使用为NULL渡。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_output outputs[io_num.n_output];memset(outputs, 0, sizeof(outputs));for (int i = 0; i < io_num.n_output; i++) { outputs[i].index = i; outputs[i].is_prealloc = 0; outputs[i].want_float = 1;}ret = rknn_outputs_get(ctx, io_num.n_output, outputs, NULL);2.9 rknn_outputs_release
rknn_outputs_release 函数、rknn_outputs_get 函数在获取输出関連释放。
| 项目 | 内容 |
|---|---|
| API | rknn_outputs_release |
| 機能 | rknn_output对象释放。 |
| 参数 | rknn_context context:rknn_context对象。 uint32_t n_outputs:输出数据的個数。 rknn_output outputs[]:破棄 rknn_output 数组。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
ret = rknn_outputs_release(ctx, io_num.n_output, outputs);2.10 rknn_create_mem_from_phys
用户NPU在使用内存自分在割当必要場合、rknn_create_mem_from_phys 函数在比 rknn_tensor_mem 结构体作成、该获取可以。该函数物理、仮想、渡、外部内存関連信息 rknn_tensor_mem 结构体到设置。
| 项目 | 内容 |
|---|---|
| API | rknn_create_mem_from_phys |
| 機能 | 物理从 rknn_tensor_mem 结构体作成、内存割当。 |
| 参数 | rknn_context context:rknn_context对象。 uint64_t phys_addr:内存的物理。 void *virt_addr:内存的仮想。 uint32_t size:内存。 |
| 返回值 | rknn_tensor_mem*:张量内存信息结构体。 |
示例:
// suppose we have got buffer information as input_phys, input_virt and sizerknn_tensor_mem* input_mems[1];input_mems[0] = rknn_create_mem_from_phys(ctx, input_phys, input_virt, size);2.11 rknn_create_mem_from_fd
用户NPU在使用内存自分在割当必要場合、rknn_create_mem_from_fd 函数在比 rknn_tensor_mem 结构体作成、该获取可以。该函数文件fd、、仮想、渡、外部内存関連信息 rknn_tensor_mem 结构体到设置。
| 项目 | 内容 |
|---|---|
| API | rknn_create_mem_from_fd |
| 機能 | 文件从 rknn_tensor_mem 结构体作成。 |
| 参数 | rknn_context context:rknn_context对象。 int32_t fd:内存的文件。 void *virt_addr:内存的仮想。fd在支持内存的先頭。 uint32_t size:内存。 int32_t offset:文件和仮想在対内存。 |
| 返回值 | rknn_tensor_mem*:张量内存信息结构体。 |
2.12 rknn_create_mem
用户NPU内部在内存割当場合、rknn_create_mem 函数用户指定内存割当、rknn_tensor_mem 结构体返。
| 项目 | 内容 |
|---|---|
| API | rknn_create_mem |
| 機能 | rknn_tensor_mem 结构体作成、内存割当。 |
| 参数 | rknn_context context:rknn_context对象。 uint32_t size:内存。 |
| 返回值 | rknn_tensor_mem*:张量内存信息结构体。 |
示例:
// suppose we have got buffer sizerknn_tensor_mem* input_mems[1];input_mems[0] = rknn_create_mem(ctx, size);2.13 rknn_create_mem2
用户NPU内部在内存割当場合、rknn_create_mem2 函数用户指定内存和内存割当、rknn_tensor_mem 结构体返。rknn_create_mem2 rknn_create_mem 的主違、rknn_create_mem2 在 alloc_flags 、割当内存 cacheable 在指定在点。rknn_create_mem 指定在、在 cacheable 。
| 项目 | 内容 |
|---|---|
| API | rknn_create_mem2 |
| 機能 | rknn_tensor_mem 结构体作成、内存割当。 |
| 参数 | rknn_context context:rknn_context对象。 uint64_t size:内存。 uint64_t alloc_flags:内存cacheable在制御。 RKNN_FLAG_MEMORY_CACHEABLE:cacheable内存作成。 RKNN_FLAG_MEMORY_NON_CACHEABLE:non-cacheable内存作成。 RKNN_FLAG_MEMORY_FLAGS_DEFAULT:RKNN_FLAG_MEMORY_CACHEABLE 同。 |
| 返回值 | rknn_tensor_mem*:张量内存信息结构体。 |
2.14 rknn_destroy_mem
rknn_destroy_mem 函数 rknn_tensor_mem 结构体破棄。用户割当内存用户自身释放需要。
| 项目 | 内容 |
|---|---|
| API | rknn_destroy_mem |
| 機能 | rknn_tensor_mem 结构体破棄。 |
| 参数 | rknn_context context:rknn_context对象。 rknn_tensor_mem*:张量内存信息结构体。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_tensor_mem* input_mems[1];int ret = rknn_destroy_mem(ctx, input_mems[0]);2.15 rknn_set_weight_mem
用户网络weight用内存自分在割当、支持 rknn_tensor_mem 结构体初始化後、rknn_run 呼出前在 rknn_set_weight_mem 函数呼出在、NPU在该内存使用可以。
| 项目 | 内容 |
|---|---|
| API | rknn_set_weight_mem |
| 機能 | weight内存信息含 rknn_tensor_mem 结构体设置。 |
| 参数 | rknn_context context:rknn_context对象。 rknn_tensor_mem*:weight张量内存信息结构体。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_tensor_mem* weight_mems[1];int ret = rknn_set_weight_mem(ctx, weight_mems[0]);2.16 rknn_set_internal_mem
用户网络中間张量用内存自分在割当、支持 rknn_tensor_mem 结构体初始化後、rknn_run 呼出前在 rknn_set_internal_mem 函数呼出在、NPU在该内存使用可以。
| 项目 | 内容 |
|---|---|
| API | rknn_set_internal_mem |
| 機能 | 中間张量内存信息含 rknn_tensor_mem 结构体设置。 |
| 参数 | rknn_context context:rknn_context对象。 rknn_tensor_mem*:模型中間张量内存信息结构体。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_tensor_mem* internal_tensor_mems[1];int ret = rknn_set_internal_mem(ctx, internal_tensor_mems[0]);2.17 rknn_set_io_mem
用户网络的输入张量或输出张量用内存自分在割当、支持 rknn_tensor_mem 结构体初始化後、rknn_run 呼出前在 rknn_set_io_mem 函数呼出在、NPU在该内存使用可以。
| 项目 | 内容 |
|---|---|
| API | rknn_set_io_mem |
| 機能 | 模型的输入/输出内存信息含 rknn_tensor_mem 结构体设置。 |
| 参数 | rknn_context context:rknn_context对象。 rknn_tensor_mem*:输入/输出张量内存信息结构体。 rknn_tensor_attr *:输入/输出张量的属性。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_tensor_attr output_attrs[1];rknn_tensor_mem* output_mems[1];ret = rknn_query(ctx, RKNN_QUERY_NATIVE_OUTPUT_ATTR, &(output_attrs[0]), sizeof(rknn_tensor_attr));output_mems[0] = rknn_create_mem(ctx, output_attrs[0].size_with_stride);rknn_set_io_mem(ctx, output_mems[0], &output_attrs[0]);2.18 rknn_set_input_shape(已废弃)
该接口廃止此外。输入形状的在 rknn_set_input_shapes 接口使用。当前的版本在使用在。该接口継続使用必要場合、SDK 1.5.0 版本使用、1.5.0 版本的使用文書参照。
| 项目 | 内容 |
|---|---|
| API | rknn_set_input_shape |
| 機能 | 廃止済。当前使用不可。 |
| 参数 | 无。 |
| 返回值 | 无。 |
2.19 rknn_set_input_shapes
动态形状输入的RKNN模型在、推理前在当前使用输入形状指定需要。该接口输入数 rknn_tensor_attr 数组渡、各输入的形状支持数据信息含。各 rknn_tensor_attr 结构体对象的 index、name、dims、fmt、n_dims 必设置、该他的设置不要。该接口使用前在、rknn_query 函数在RKNN模型支持输入形状数动态形状列表查询可以。输入数据的形状、模型支持输入形状列表内在存在需要。初回执行時、或新输入形状到切替在、该接口调用新形状设置需要。在、繰返呼出必要。
| 项目 | 内容 |
|---|---|
| API | rknn_set_input_shapes |
| 機能 | 模型当前使用输入形状设置。 |
| 参数 | rknn_context context:rknn_context对象。 uint32_t n_inputs:输入张量的数量。 rknn_tensor_attr *:输入张量属性数组。所有的输入形状信息渡。用户各输入属性结构体的 index、name、dims、fmt、n_dims 设置必要、该他的设置不要。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
for (int i = 0; i < io_num.n_input; i++) { for (int j = 0; j < input_attrs[i].n_dims; ++j) { // 使用第一个动态输入形状 input_attrs[i].dims[j] = dyn_range[i].dyn_range[0][j]; }}ret = rknn_set_input_shapes(ctx, io_num.n_input, input_attrs);if (ret < 0) { fprintf(stderr, "rknn_set_input_shapes error! ret=%d\n", ret); return -1;}2.20 rknn_mem_sync
rknn_create_mem 函数在作成内存、在 cacheable 持。cacheable 付在作成内存CPUNPU同時在使用場合、cache動作在比数据整合性的問題発生可能性。该接口、cacheable 付内存同期、CPUNPU该内存到数据的整合性保証为在使用。
| 项目 | 内容 |
|---|---|
| API | rknn_mem_sync |
| 機能 | CPU cache DDR 数据同期。 |
| 参数 | rknn_context context:rknn_context对象。 rknn_tensor_mem* mem:张量内存信息结构体。 rknn_mem_sync_mode mode:CPU cache DDR 数据表示。 RKNN_MEMORY_SYNC_TO_DEVICE:CPU cache数据DDR到同期。通常、CPU内存書込後、NPU同一内存到前在、该在cache内数据DDR到書戻。 RKNN_MEMORY_SYNC_FROM_DEVICE:DDR数据CPU cache到同期。通常、NPU内存到書込後、次回CPU同一内存到際在cache数据无效化、CPUDDR从再加载为在使用。 RKNN_MEMORY_SYNC_BIDIRECTIONAL:CPU cache数据DDR到同期同時在、CPUDDR从再加载在。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
ret = rknn_mem_sync(ctx, &outputs[0].mem, RKNN_MEMORY_SYNC_FROM_DEVICE);if (ret < 0) { fprintf(stderr, " rknn_mem_sync error! ret=%d\n", ret); return -1;}3. 矩阵乘法数据结构定义
3.1 rknn_matmul_info
rknn_matmul_info 、矩阵乘法执行为的仕様信息表示。矩阵乘法的規模、输入/输出行列的数据类型、和内存含。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| M | int32_t | 行列A的行数。 |
| K | int32_t | 行列A的列数。 |
| N | int32_t | 行列B的列数。 |
| type | rknn_matmul_type | 输入和输出行列的数据类型: RKNN_FLOAT16_MM_FLOAT16_TO_FLOAT32:行列ABfloat16、行列Cfloat。 RKNN_INT8_MM_INT8_TO_INT32:行列ABint8、行列Cint32。 RKNN_INT8_MM_INT8_TO_INT8:行列A、B、Cint8。 RKNN_FLOAT16_MM_FLOAT16_TO_FLOAT16:行列A、B、Cfloat16。 RKNN_FLOAT16_MM_INT8_TO_FLOAT32:行列Afloat16、行列Bint8、行列Cfloat。 RKNN_FLOAT16_MM_INT8_TO_FLOAT16:行列Afloat16、行列Bint8、行列Cfloat16。 RKNN_FLOAT16_MM_INT4_TO_FLOAT32:行列Afloat16、行列Bint4、行列Cfloat。 RKNN_FLOAT16_MM_INT4_TO_FLOAT16:行列Afloat16、行列Bint4、行列Cfloat16。 RKNN_INT8_MM_INT8_TO_FLOAT32:行列ABint8、行列Cfloat。 RKNN_INT4_MM_INT4_TO_INT16:行列ABint4、行列Cint16。 RKNN_INT8_MM_INT4_TO_INT32:行列Aint8、Bint4、行列Cint32。 |
| B_layout | int16_t | 行列B的数据配置方式。 RKNN_MM_LAYOUT_NORM:行列B元的形状、KxN在配置。 RKNN_MM_LAYOUT_NATIVE:行列B高性能形状在配置。 RKNN_MM_LAYOUT_TP_NORM:行列BTranspose後的形状、NxK在配置。 |
| B_quant_type | int16_t | 行列B的量化方式。 RKNN_QUANT_TYPE_PER_LAYER_SYM:行列BPer-Layer方式在対称量化。 RKNN_QUANT_TYPE_PER_LAYER_ASYM:行列BPer-Layer方式在非对称量化。 RKNN_QUANT_TYPE_PER_CHANNEL_SYM:行列BPer-Channel方式在対称量化。 RKNN_QUANT_TYPE_PER_CHANNEL_ASYM:行列BPer-Channel方式在非对称量化。 RKNN_QUANT_TYPE_PER_GROUP_SYM:行列BPer-Group方式在対称量化。 RKNN_QUANT_TYPE_PER_GROUP_ASYM:行列BPer-Group方式在非对称量化。 |
| AC_layout | int16_t | 行列A和C的数据配置方式。 RKNN_MM_LAYOUT_NORM:行列AC元的形状在配置。 RKNN_MM_LAYOUT_NATIVE:行列AC高性能形状在配置。 |
| AC_quant_type | int16_t | 行列A和C的量化方式。 RKNN_QUANT_TYPE_PER_LAYER_SYM:行列ACPer-Layer方式在対称量化。 RKNN_QUANT_TYPE_PER_LAYER_ASYM:行列ACPer-Layer方式在非对称量化。 |
| iommu_domain_id | int32_t | 行列存在IOMMU空間。IOMMU空間一対一在支持、各IOMMU空間4GB。该参数主在、行列A、B、C的参数仕様大、内在NPU割当内存4GB超後、別的到切替必要場合在使用。 |
| group_size | int16_t | 1的要素数。量化有效在場合的有效。 |
| reserved | int8_t[] | 予約。 |
3.2 rknn_matmul_tensor_attr
rknn_matmul_tensor_attr 各行列张量的属性表示。行列的名称、形状、、数据类型含。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| name | char[] | 行列的名称。 |
| n_dims | uint32_t | 行列的维度数。 |
| dims | uint32_t[] | 行列的形状。 |
| size | uint32_t | 行列。単位。 |
| type | rknn_tensor_type | 行列的数据类型。 |
3.3 rknn_matmul_io_attr
rknn_matmul_io_attr 、行列的所有的输入和输出张量属性表、行列A、B、C的属性含。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| A | rknn_matmul_tensor_attr | 行列A的张量属性。 |
| B | rknn_matmul_tensor_attr | 行列B的张量属性。 |
| C | rknn_matmul_tensor_attr | 行列C的张量属性。 |
3.4 rknn_quant_params
rknn_quant_params 行列的量化参数表示。name、scale数组和zero_point数组到的该長含。name行列名識別为在使用、行列初始化時在得 rknn_matmul_io_attr 结构体从获取可以。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| name | char[] | 行列的名称。 |
| scale | float* | 行列的scale数组。 |
| scale_len | int32_t | 行列的scale数组長。 |
| zp | int32_t* | 行列的zero_point数组。 |
| zp_len | int32_t | 行列的zero_point数组長。 |
3.5 rknn_matmul_shape
rknn_matmul_shape 、特定shape的矩阵乘法在M、K、N表示。动态shape的矩阵乘法初始化際、shape的数量指定、rknn_matmul_shape 结构体数组的输入shape表需要。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| M | int32_t | 行列A的行数。 |
| K | int32_t | 行列A的列数。 |
| N | int32_t | 行列B的列数。 |
4. 矩阵乘法API说明
4.1 rknn_matmul_create
该函数、渡矩阵乘法仕様等的信息在基、矩阵乘法初始化、输入和输出张量的形状、、数据类型等的信息返。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_create |
| 機能 | 矩阵乘法初始化。 |
| 参数 | rknn_matmul_ctx* ctx:矩阵乘法。 rknn_matmul_info* info:矩阵乘法仕様信息结构体。 rknn_matmul_io_attr* io_attr:矩阵乘法输入和输出张量属性结构体。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_matmul_info info;memset(&info, 0, sizeof(rknn_matmul_info));info.M = 4;info.K = 64;info.N = 32;info.type = RKNN_INT8_MM_INT8_TO_INT32;info.B_layout = RKNN_MM_LAYOUT_NORM;info.AC_layout = RKNN_MM_LAYOUT_NORM;rknn_matmul_io_attr io_attr;memset(&io_attr, 0, sizeof(rknn_matmul_io_attr));int ret = rknn_matmul_create(&ctx, &info, &io_attr);if (ret < 0) { printf("rknn_matmul_create fail! ret=%d\n", ret); return -1;}4.2 rknn_matmul_set_io_mem
该函数矩阵乘法演算的输入/输出内存设置为在使用。调用前在 rknn_create_mem 在作成 rknn_tensor_mem 结构体用意、続 rknn_matmul_create 返行列A、B或C的 rknn_matmul_tensor_attr 结构体在该函数到渡、输入和输出内存矩阵乘法到设置。调用前在、rknn_matmul_info在设置内存在従行列A行列B的数据準備需要。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_set_io_mem |
| 機能 | 矩阵乘法的输入/输出内存设置。 |
| 参数 | rknn_matmul_ctx ctx:矩阵乘法。 rknn_tensor_mem* mem:张量内存信息结构体。 rknn_matmul_tensor_attr* attr:矩阵乘法输入和输出张量属性结构体。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
// Create Arknn_tensor_mem* A = rknn_create_mem(ctx, io_attr.A.size);if (A == NULL) { printf("rknn_create_mem fail!\n"); return -1;}memset(A->virt_addr, 1, A->size);// Set Aret = rknn_matmul_set_io_mem(ctx, A, &io_attr.A);if (ret < 0) { printf("rknn_matmul_set_io_mem fail! ret=%d\n", ret); return -1;}4.3 rknn_matmul_set_core_mask
该函数、矩阵乘法演算在使用可能NPU设置。(RK3588和RK3576平台的支持)。调用前在 rknn_matmul_create 函数在矩阵乘法初始化需要。该函数在値设置、使用指定在、矩阵乘法演算的性能効率向上可以。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_set_core_mask |
| 機能 | 矩阵乘法演算的NPU设置。 |
| 参数 | rknn_matmul_ctx ctx:矩阵乘法。 rknn_core_mask core_mask:矩阵乘法演算的NPU値。使用可能NPU指定。的各1的表、支持1的場合该使用可能在表示。0的場合使用不可(详细说明 rknn_set_core_mask API 参数参照)。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_matmul_set_core_mask(ctx, RKNN_NPU_CORE_AUTO);4.4 rknn_matmul_set_quant_params
rknn_matmul_set_quant_params 、各行列的量化参数设置为在使用。Per-Channel量化、Per-Layer量化、Per-Group量化方式的量化参数设置支持。Per-Group量化使用場合、rknn_quant_params 的 scale 和 zp 数组的長 N*K/group_size 。Per-Channel量化使用場合、scale 和 zp 数组的長 N 。Per-Layer量化使用場合、scale 和 zp 数组的長1。rknn_matmul_run 的前在该接口调用、所有的行列的量化参数设置。该接口呼出場合、量化方式Per-Layer量化在、scale=1.0、zero_point=0。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_set_quant_params |
| 機能 | 行列的量化参数设置。 |
| 参数 | rknn_matmul_ctx ctx:矩阵乘法。 rknn_quant_params* params:行列的量化参数信息。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
rknn_quant_params params_a;memcpy(params_a.name, io_attr.A.name, RKNN_MAX_NAME_LEN);params_a.scale_len = 1;params_a.scale = (float *)malloc(params_a.scale_len * sizeof(float));params_a.scale[0] = 0.2;params_a.zp_len = 1;params_a.zp = (int32_t *)malloc(params_a.zp_len * sizeof(int32_t));params_a.zp[0] = 0;rknn_matmul_set_quant_params(ctx, ¶ms_a);4.5 rknn_matmul_get_quant_params
rknn_matmul_get_quant_params 、rknn_matmul_type RKNN_INT8_MM_INT8_TO_INT32 在、 Per-Channel 量化方式的場合在、行列B的所有的的scale归一化後的scale値获取为在使用。获取scale値在A的元scale値掛在、C的scale値得可以。行列C在実際的scale場合、近似的在C的scale計算为在使用可以。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_get_quant_params |
| 機能 | 行列B的量化参数获取。 |
| 参数 | rknn_matmul_ctx ctx:矩阵乘法。 rknn_quant_params* params:行列B的量化参数信息。 float* scale:行列B的scale。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
float b_scale;rknn_matmul_get_quant_params(ctx, ¶ms_b, &b_scale);4.6 rknn_matmul_create_dyn_shape(已废弃)
该接口廃止此外。代在 rknn_matmul_create_dynamic_shape 接口使用。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_create_dyn_shape |
| 機能 | 廃止済。 |
| 参数 | 无。 |
| 返回值 | 无。 |
4.7 rknn_matmul_create_dynamic_shape
rknn_matmul_create_dynamic_shape 、动态shape矩阵乘法作成为在使用。该接口在 rknn_matmul_info 结构体、shape数、支持shape数组渡需要。shape数组在多个的M、K、N値記録。初始化成功後、rknn_matmul_io_attr 的数组得、数组内在所有的输入和输出行列的shape、、数据类型等的信息包含。当前、多个的異M、K、N的设置支持。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_create_dynamic_shape |
| 機能 | 动态shape矩阵乘法初始化。 |
| 参数 | rknn_matmul_ctx ctx:矩阵乘法。 rknn_matmul_info info:矩阵乘法仕様信息结构体。该場合M、K、N设置不要。 int shape_num:行列支持shape数。 rknn_matmul_shape dynamic_shapes[]:行列支持shape数组。 rknn_matmul_io_attr io_attrs[]:矩阵乘法输入和输出张量属性结构体数组。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
const int shape_num = 2;rknn_matmul_shape shapes[shape_num];for (int i = 0; i < shape_num; ++i) { shapes[i].M = i + 1; shapes[i].K = 64; shapes[i].N = 32;}rknn_matmul_io_attr io_attr[shape_num];memset(io_attr, 0, sizeof(rknn_matmul_io_attr) * shape_num);int ret = rknn_matmul_create_dynamic_shape(&ctx, &info, shape_num, shapes, io_attr);if (ret < 0) { fprintf(stderr, " rknn_matmul_create_dynamic_shape fail! ret=%d\n", ret); return -1;}4.8 rknn_matmul_set_dynamic_shape
rknn_matmul_set_dynamic_shape 、矩阵乘法在使用特定的shape指定为在使用。动态shape的矩阵乘法作成後、rknn_matmul_shape 结构体的1输入参数作为選択、该接口调用演算在使用shape设置。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_set_dynamic_shape |
| 機能 | 矩阵乘法shape设置。 |
| 参数 | rknn_matmul_ctx ctx:矩阵乘法。 rknn_matmul_shape* shape:矩阵乘法在使用shape指定。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
ret = rknn_matmul_set_dynamic_shape(ctx, &shapes[0]);if (ret != 0) { fprintf(stderr, "rknn_matmul_set_dynamic_shapes fail!\n"); return -1;}4.9 rknn_B_normal_layout_to_native_layout
rknn_B_normal_layout_to_native_layout 、行列B的元形状配置数据(KxN)高性能数据配置方式的数据到変換为在使用。
| 项目 | 内容 |
|---|---|
| API | rknn_B_normal_layout_to_native_layout |
| 機能 | 行列B的数据配置元形状从高性能形状到変換。 |
| 参数 | void* B_input:元形状的行列B数据。 void* B_output:高性能形状的行列B数据。 int K:行列B的行数。 int N:行列B的列数。 int subN:rknn_matmul_io_attr结构体的 B.dims[2] 在等値。 int subK:rknn_matmul_io_attr结构体的 B.dims[3] 在等値。 rknn_matmul_info* info:矩阵乘法仕様信息结构体。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
int32_t subN = io_attr.B.dims[2];int32_t subK = io_attr.B.dims[3];rknn_B_normal_layout_to_native_layout(B_Matrix, B->virt_addr, K, N, subN, subK, &info);4.10 rknn_matmul_run
该函数矩阵乘法演算执行、結果输出行列C在保存。该函数呼出前在、输入行列AB的数据準備、rknn_matmul_set_io_mem 函数在输入到设置需要。输出行列C在、rknn_matmul_set_io_mem 函数在输出到设置必要、输出行列的张量属性 rknn_matmul_create 函数在获取。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_run |
| 機能 | 矩阵乘法演算执行。 |
| 参数 | rknn_matmul_ctx ctx:矩阵乘法。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
int ret = rknn_matmul_run(ctx);4.11 rknn_matmul_destroy
该函数矩阵乘法演算破棄、関連释放。rknn_matmul_create 函数在作成矩阵乘法使用終後、该函数调用破棄需要。
| 项目 | 内容 |
|---|---|
| API | rknn_matmul_destroy |
| 機能 | 矩阵乘法演算破棄。 |
| 参数 | rknn_matmul_ctx ctx:矩阵乘法。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
int ret = rknn_matmul_destroy(ctx);5. 自定义算子数据结构定义
5.1 rknn_gpu_op_context
rknn_gpu_op_context 、GPU在执行自定义算子的信息表示。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| cl_context | void* | OpenCL的 cl_context 对象。使用時 cl_context 到。 |
| cl_command_queue | void* | OpenCL的 cl_command_queue 对象。使用時 cl_command_queue 到。 |
| cl_kernel | void* | OpenCL的 cl_kernel 对象。使用時 cl_kernel 到。 |
5.2 rknn_custom_op_context
rknn_custom_op_context 自定义算子的信息表示。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| target | rknn_target_type | 自定义算子执行设备: RKNN_TARGET_TYPE_CPU:CPU。 RKNN_TARGET_TYPE_GPU:GPU。 |
| internal_ctx | rknn_custom_op_interal_context | 算子内部。 |
| gpu_ctx | rknn_gpu_op_context | 自定义算子的OpenCL信息含。执行设备GPU的場合、函数内在该结构体从OpenCL的 cl_context 等的对象获取。 |
| priv_data | void* | 開発者管理数据。 |
5.3 rknn_custom_op_tensor
rknn_custom_op_tensor 自定义算子的输入/输出张量信息表示。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| attr | rknn_tensor_attr | 张量的名称、形状、等的信息含。 |
| mem | rknn_tensor_mem | 张量的内存、fd、有效数据等的信息含。 |
5.4 rknn_custom_op_attr
rknn_custom_op_attr 自定义算子的参数或属性信息表示。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| name | char[] | 自定义算子的参数名。 |
| dtype | rknn_tensor_type | 各要素的数据类型。 |
| n_elems | uint32_t | 要素数。 |
| data | void* | 参数数据内存領域的仮想。 |
5.5 rknn_custom_op
rknn_custom_op 注册自定义算子信息表示。结构体的定义如下。
| 成员变量 | 数据类型 | 说明 |
|---|---|---|
| version | uint32_t | 自定义算子版本番号。 |
| target | rknn_target_type | 自定义算子的执行。 |
| op_type | char[] | 自定义算子。 |
| cl_kernel_name | char[] | OpenCL的kernel函数名。 |
| cl_kernel_source | char* | OpenCL的名称。cl_source_size 0的場合文件絶対路径表、cl_source_size 0比大場合kernel函数的字符串表示。 |
| cl_source_size | uint64_t | cl_kernel_source字符串的場合字符串長表、文件路径的場合0在设置。 |
| cl_build_options | char[] | OpenCL kernel。 |
| init | int ()(rknn_custom_op_context op_ctx, rknn_custom_op_tensor* inputs, uint32_t n_inputs, rknn_custom_op_tensor* outputs, uint32_t n_outputs); | 自定义算子初始化函数。登録時在1回呼出。不要場合NULL在设置可以。 |
| prepare | int ()(rknn_custom_op_context op_ctx, rknn_custom_op_tensor* inputs, uint32_t n_inputs, rknn_custom_op_tensor* outputs, uint32_t n_outputs); | 前処理函数。rknn_run時在1回呼出。不要場合NULL在设置可以。 |
| compute | int ()(rknn_custom_op_context op_ctx, rknn_custom_op_tensor* inputs, uint32_t n_inputs, rknn_custom_op_tensor* outputs, uint32_t n_outputs); | 自定义算子機能的函数。rknn_run時在1回呼出。NULL在设置在。 |
| compute_native | int ()(rknn_custom_op_context op_ctx, rknn_custom_op_tensor* inputs, uint32_t n_inputs, rknn_custom_op_tensor* outputs, uint32_t n_outputs); | 高性能計算的函数。compute函数的違、输入和输出张量的格式異点。当前未支持在、NULL在设置。 |
| destroy | int ()(rknn_custom_op_context op_ctx); | 破棄函数。rknn_destroy時在1回呼出。 |
6. 自定义算子API说明
6.1 rknn_register_custom_ops
初始化在成功後、该函数自定义算子、执行、OpenCL信息、函数等、多个的自定义算子信息到登録为在使用。登録在成功、推理段階在 rknn_run 接口開発者的実装函数调用。
| 项目 | 内容 |
|---|---|
| API | rknn_register_custom_ops |
| 機能 | 多个的自定义算子到登録。 |
| 参数 | rknn_context context:rknn_context。函数调用前在context初始化済在需要。 rknn_custom_op op:自定义算子信息数组。数组的各要素 rknn_custom_op 结构体对象。 uint32_t custom_op_num:自定义算子信息数组的長。 |
| 返回值 | int 错误码(RKNN返回值错误码参照)。 |
示例:
// CPU operatorsrknn_custom_op user_op[2];memset(user_op, 0, 2 * sizeof(rknn_custom_op));strncpy(user_op[0].op_type, "cstSoftmax", RKNN_MAX_NAME_LEN - 1);user_op[0].version = 1;user_op[0].target = RKNN_TARGET_TYPE_CPU;user_op[0].init = custom_op_init_callback;user_op[0].compute = compute_custom_softmax_float32;user_op[0].destroy = custom_op_destroy_callback;strncpy(user_op[1].op_type, "ArgMax", RKNN_MAX_NAME_LEN - 1);user_op[1].version = 1;user_op[1].target = RKNN_TARGET_TYPE_CPU;user_op[1].init = custom_op_init_callback;user_op[1].compute = compute_custom_argmax_float32;user_op[1].destroy = custom_op_destroy_callback;ret = rknn_register_custom_ops(ctx, user_op, 2);if (ret < 0) { printf("rknn_register_custom_ops fail! ret = %d\n", ret); return -1;}6.2 rknn_custom_op_get_op_attr
该函数、自定义算子的函数内在自定义算子的参数信息获取为在使用。例Softmax算子的axis参数等。自定义算子参数的名 rknn_custom_op_attr 结构体渡。该接口呼出、参数値 rknn_custom_op_attr 结构体内的 data 在格納。開発者返结构体内的 dtype 在基、该C言語的特定数据类型的数组先頭到、要素数在従完全参数値読出。
| 项目 | 内容 |
|---|---|
| API | rknn_custom_op_get_op_attr |
| 機能 | 自定义算子的参数或属性获取。 |
| 参数 | rknn_custom_op_context* op_ctx:自定义算子。 const char* attr_name:自定义算子参数的名。 rknn_custom_op_attr* op_attr:自定义算子参数値表结构体。 |
| 返回值 | 无。 |
示例:
rknn_custom_op_attr op_attr;rknn_custom_op_get_op_attr(op_ctx, "axis", &op_attr);if (op_attr.n_elems == 1 && op_attr.dtype == RKNN_TENSOR_INT64) { axis = ((int64_t*)op_attr.data)[0];}…7. RKNN返回值错误码
RKNN API函数的返回值错误码的定义如下。
| 错误码 | 详细 |
|---|---|
| RKNN_SUCC(0) | 执行成功。 |
| RKNN_ERR_FAIL(-1) | 执行。 |
| RKNN_ERR_TIMEOUT(-2) | 执行。 |
| RKNN_ERR_DEVICE_UNAVAILABLE(-3) | NPU设备使用不可。 |
| RKNN_ERR_MALLOC_FAIL(-4) | 内存割当失败。 |
| RKNN_ERR_PARAM_INVALID(-5) | 渡参数不正。 |
| RKNN_ERR_MODEL_INVALID(-6) | 渡RKNN模型无效。 |
| RKNN_ERR_CTX_INVALID(-7) | 渡rknn_context无效。 |
| RKNN_ERR_INPUT_INVALID(-8) | 渡rknn_input对象无效。 |
| RKNN_ERR_OUTPUT_INVALID(-9) | 渡rknn_output对象无效。 |
| RKNN_ERR_DEVICE_UNMATCH(-10) | 版本一致。 |
| RKNN_ERR_INCOMPATILE_OPTIMIZATION_LEVEL_VERSION(-12) | RKNN模型在最適化的设置、当前的驱动互換性。 |
| RKNN_ERR_TARGET_PLATFORM_UNMATCH(-13) | RKNN模型当前的平台互換性。 |