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

对应的代码段如下:

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

完整推理代码如下:
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
将训练好的模型导出ONNX,再用atc工具转换成om,移植到Atlas 200I DK A2推理时出现下列报错:
Exception: acl.mdl.execute failed ret=500002
对应的代码段如下:
对om模型用ais_bench工具推理验证能够成功,显示如下:
完整推理代码如下:
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