om模型推理时出现Exception: acl.mdl.execute failed ret=500002
收藏回复举报
om模型推理时出现Exception: acl.mdl.execute failed ret=500002
t('forum.solved') 已解决
发表于2025-03-13 15:58:04
0 查看

将训练好的模型导出ONNX,再用atc工具转换成om,移植到Atlas 200I DK A2推理时出现下列报错:

Exception: acl.mdl.execute failed ret=500002

cke_2472.png

对应的代码段如下:

cke_5196.png

对om模型用ais_bench工具推理验证能够成功,显示如下:

cke_6109.png

完整推理代码如下:

import os 

import acl 

import numpy as np 

from PIL import Image 

ACL_MEM_MALLOC_HUGE_FIRST = 0 

ACL_MEMCPY_HOST_TO_DEVICE = 1 

ACL_MEMCPY_DEVICE_TO_HOST = 2 

class net: 

    def __init__(self, model_path): 

        self.device_id = 0 

        ret = acl.init() 

        if ret != 0: 

            print('acl init failed, errorCode is', ret) 

        ret = acl.rt.set_device(self.device_id) 

        if ret != 0: 

            print('set device failed, errorCode is', ret) 

        # 加载离线模型文件,返回标识模型的ID 

        self.model_id, ret = acl.mdl.load_from_file(model_path) 

        if ret != 0: 

            print('load model failed, errorCode is', ret) 

        self.model_desc = acl.mdl.create_desc() 

        ret = acl.mdl.get_desc(self.model_desc, self.model_id) 

        if ret != 0: 

            print('get desc failed, errorCode is', ret) 

 

        # 创建输入数据集 

        self.input_dataset = acl.mdl.create_dataset() 

        input_index = 0 

        self.input_buffer_size = acl.mdl.get_input_size_by_index(self.model_desc, input_index) 

        # 申请buffer内存 

        self.input_buffer, ret = acl.rt.malloc(self.input_buffer_size, ACL_MEM_MALLOC_HUGE_FIRST) 

        # 从内存创建buffer数据 

        input_data = acl.create_data_buffer(self.input_buffer, self.input_buffer_size) 

        # 将buffer数据添加到数据集 

        self.input_dataset, ret = acl.mdl.add_dataset_buffer(self.input_dataset, input_data) 

        if ret != 0: 

            print('acl.mdl.add_dataset_buffer failed, errorCode is', ret) 

 

        # 创建输出数据集 

        self.output_dataset = acl.mdl.create_dataset() 

        output_index = 0 

        output_buffer_size = acl.mdl.get_output_size_by_index(self.model_desc, output_index) 

        self.output_buffer, ret = acl.rt.malloc(output_buffer_size, ACL_MEM_MALLOC_HUGE_FIRST) 

        output_data = acl.create_data_buffer(self.output_buffer, output_buffer_size) 

        self.output_dataset, ret = acl.mdl.add_dataset_buffer(self.output_dataset, output_data) 

        if ret != 0: 

            print('acl.mdl.add_dataset_buffer failed, errorCode is', ret) 

 

    def forward(self, inputs): 

        # 执行推理任务 

        # 遍历所有输入,拷贝到对应的buffer内存中 

        bytes_data = inputs.tobytes() 

        bytes_ptr = acl.util.bytes_to_ptr(bytes_data) 

        # 将图片数据从Host传输到Device。 

        ret = acl.rt.memcpy(self.input_buffer,              # 目标地址 device 

                            self.input_buffer_size,         # 目标地址大小 

                            bytes_ptr,                      # 源地址 host 

                            self.input_buffer_size,         # 源地址大小 

                            ACL_MEMCPY_HOST_TO_DEVICE)      # 模式:从host到device 

        if ret != 0: 

            print('memcpy failed, errorCode is', ret) 

        # 执行模型推理。 

        ret = acl.mdl.execute(self.model_id, self.input_dataset, self.output_dataset) 

        if ret != 0: 

            print('execute failed, errorCode is', ret) 

        # 处理模型推理的输出数据 

        output_index = 0 

        output_data_buffer = acl.mdl.get_dataset_buffer(self.output_dataset, output_index) 

        output_data_buffer_addr = acl.get_data_buffer_addr(output_data_buffer) 

        output_data_size = acl.get_data_buffer_size(output_data_buffer) 

        ptr, ret = acl.rt.malloc_host(output_data_size) 

        # 将推理输出数据从Device传输到Host。 

        ret = acl.rt.memcpy(ptr, 

                            output_data_size, 

                            output_data_buffer_addr, 

                            output_data_size, 

                            ACL_MEMCPY_DEVICE_TO_HOST) 

        if ret != 0: 

            print('memcpy failed, errorCode is', ret) 

        # 从内存地址获取bytes对象 

        bytes_out = acl.util.ptr_to_bytes(ptr, output_data_size) 

        # 按照float32格式将数据转为numpy数组 

        data = np.frombuffer(bytes_out, dtype=np.float32) 

 

        return data 

 

    def __del__(self): 

        # 销毁输入输出数据集 

        acl.rt.free(self.input_buffer)                   # 释放buffer内存 

        acl.mdl.destroy_dataset(self.input_dataset)      # 销毁输入数据集 

        acl.rt.free(self.output_buffer)                  # 释放buffer内存 

        acl.mdl.destroy_dataset(self.output_dataset)     # 销毁输出数据集 

        # 销毁模型描述 

        ret = acl.mdl.destroy_desc(self.model_desc) 

        if ret != 0: 

            print('destroy_desc failed, errorCode is', ret) 

        # 卸载模型 

        ret = acl.mdl.unload(self.model_id) 

        if ret != 0: 

            print('unload model failed, errorCode is', ret) 

        # 释放device 

        ret = acl.rt.reset_device(self.device_id) 

        if ret != 0: 

            print('reset device failed, errorCode is', ret) 

        # acl去初始化 

        ret = acl.finalize() 

        if ret != 0: 

            print('finalize failed, errorCode is', ret) 

if __name__ == "__main__": 

    detr = net('model.om') 

    # 设置输入张量 

    tensor = np.random.rand(1, 3, 640, 640) 

    print(tensor) 

    result = detr.forward(tensor) 

    print(result) 

    print("*****run finish******") 

    del detr 

我要发帖子