推理结果处理
基本原理
关于模型执行的输出数据,如需进行进一步的处理,可由用户自行管理实现逻辑。
示例代码(直接处理内存中的数据)
以图片分类网络为例,模型执行结束后,需处理每一张图片的模型推理结果,直接输出top5置信度的类别编号。您可以从样例介绍中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
# 处理模型推理的输出数据,输出top5置信度的类别编号 inference_result = [] for i, item in enumerate(self.output_data): buffer_host, ret = acl.rt.malloc_host(self.output_data[i]["size"]) # 将推理输出数据从Device传输到Host ret = acl.rt.memcpy(buffer_host, self.output_data[i]["size"], self.output_data[i]["buffer"], self.output_data[i]["size"], ACL_MEMCPY_DEVICE_TO_HOST) data = acl.util.ptr_to_numpy(buffer_host, (self.output_data[i]["size"],), NPY_BYTE) inference_result.append(data) tuple_st = struct.unpack("1000f", bytearray(inference_result[0])) vals = np.array(tuple_st).flatten() top_k = vals.argsort()[-1:-6:-1] print("======== top5 inference results: =============") for j in top_k: print("[%d]: %f" % (j, vals[j])) # ......
示例代码(调用单算子处理推理结果)
以图片分类网络为例,模型执行结束后,需处理每一张图片的模型推理结果,直接输出最大置信度的类别编号。您可以从样例介绍中获取完整样例代码。
当前示例中,使用Cast算子(将推理结果的数据类型从float32转成float16)和ArgMaxD算子(从推理结果中查找最大置信度的类别标识)实现数据后处理。单算子调用的流程请参见算子调用,详细描述请参见单算子调用。
- Cast算子被封装成pyACL接口,因此在使用时,将算子的输入输出Tensor描述、算子输入输出数据的内存等信息作为acl.op.cast的入参,直接调用acl.op.cast接口加载并执行算子。
- ArgMaxD算子没有被封装成AscendCL接口,因此在使用时,必须自行构造算子描述信息(输入输出Tensor描述、算子属性等)、申请存放算子输入输出数据的内存、明确算子类型名称、调用acl.op.execute_v2接口加载并执行算子。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
ACL_MEMCPY_DEVICE_TO_HOST = 2 # 提前将Cast和ArgMaxD两个单算子的定义文件*.json编译成适配昇腾AI处理器的离线模型(*.om文件),用于验证单算子的运行 # 设置单算子模型文件所在的目录,加载单算子模型 ret = acl.op.set_model_dir("./op_models") # ...... # 以下步骤需针对每一张图片的模型推理结果进行处理 # 1.在数据后处理前,先获取模型推理的输出,dataset_ptr表示模型推理的输出 self.input_buffer = acl.mdl.get_dataset_buffer(dataset_ptr, 0) # 2.自定义函数_forward_op_cast,构造Cast算子的输入输出Tensor描述、申请存放算子输出数据的内存dev_buffer_cast、调用acl.op.cast接口加载并执行算子 self._forward_op_cast() # 3.自定义函数_forward_op_arg_max_d,构造ArgMaxD算子的输入输出Tensor、输入输出Tensor描述、算子属性、申请存放算子输出数据的内存dev_buffer_arg_max_d、调用acl.op.execute_v2接口加载并执行算子 self._forward_op_arg_max_d() # 4.将ArgMaxD算子的输出数据回传到Host # 4.1 根据ArgMaxD算子输出数据的大小,申请Host上的内存 host_buffer, ret = acl.rt.malloc_host(self.tensor_size_arg_max_d) # 4.2 将ArgMaxD算子的输出数据从Device复制到Host ret = acl.rt.memcpy(host_buffer, self.tensor_size_arg_max_d, self.dev_buffer_arg_max_d, self.tensor_size_arg_max_d, ACL_MEMCPY_DEVICE_TO_HOST) # 4.3 在终端窗口显示最大置信度的类别编号 data = acl.util.ptr_to_numpy(host_buffer, (self.output_shape,), 5) print("[SingleOP][ArgMaxOp] label of classification result is:{}" .format(data[0])) # 5.释放资源 # 5.1 释放Host的内存 ret = acl.rt.free_host(host_buffer) # 5.2 释放Device上存放算子输出数据的内存 ret = acl.rt.free(self.dev_buffer_cast) ret = acl.rt.free(self.dev_buffer_arg_max_d) # 5.3 释放aclDataBuffer类型数据(用于描述算子输出数据) ret = acl.destroy_data_buffer(self.output_buffer_cast) ret = acl.destroy_data_buffer(self.output_buffer_arg_max_d) # ...... |
父主题: 模型推理基本场景