为啥acl.rt.memcpy总是返回107002
收藏回复举报
为啥acl.rt.memcpy总是返回107002
t('forum.solved') 已解决
新人帖
发表于2025-07-30 14:25:34
0 查看

1.模型加载也没有报错2.调用了acl.rt.set_device

def __init__(self, model_file=None, device_id=0, providers=None):
    self.model_file = model_file
    self.taskname = 'detection'
    self.device_id = device_id

    # 初始化ACL
    ret = acl.init()
    ret = acl.rt.set_device(device_id)
    # self.context, ret = acl.rt.create_context(device_id)

    # 加载模型
    assert osp.exists(self.model_file), f"Model file {self.model_file} not found"
    self.model_id, ret = acl.mdl.load_from_file(self.model_file)
    self.model_desc = acl.mdl.create_desc()
    ret = acl.mdl.get_desc(self.model_desc, self.model_id)
    if ret != 0:
        raise RuntimeError(f"get desc,错误码:{ret}")
        logger.error(f"get desc<UNK>{ret}")
    logger.info(f"get desc {self.model_desc}")
初始化调用,没有错误提示

推理的时候,
def forward(self, img, threshold):
    """前向传播"""
    scores_list = []
    bboxes_list = []
    kpss_list = []
    input_size = tuple(img.shape[0:2][::-1])
    logger.info('input_size={}'.format(input_size))
    # 图像预处理
    blob = cv2.dnn.blobFromImage(
        img, 1.0 / self.input_std, input_size,
        (self.input_mean, self.input_mean, self.input_mean),
        swapRB=True
    )

    # 确保blob数据是连续的
    if not blob.flags['C_CONTIGUOUS']:
        blob = np.ascontiguousarray(blob)
    logger.info(f"Input shape: {blob.shape}, dtype: {blob.dtype}")
    logger.info(f"First 10 values: {blob.ravel()[:10]}")
    expected_size = blob.size * blob.itemsize
    actual_buffer_size = self.input_data[0]["size"]

    logger.info(f"Blob size: {expected_size}, Buffer size: {actual_buffer_size}")

    if expected_size > actual_buffer_size:
        raise ValueError(f"Input data too large: {expected_size} > {actual_buffer_size}")
    # 拷贝数据到设备
    blob_bytes = blob.astype(np.float32).tobytes()
    if len(blob_bytes) > self.input_data[0]["size"]:
        raise ValueError(f"Input data size {len(blob_bytes)} exceeds buffer size {self.input_data[0]['size']}")
    bytes_ptr = acl.util.bytes_to_ptr(blob_bytes)

    try:
        ret = acl.rt.memcpy(self.input_data[0]["buffer"],  # 目标地址 device
                            self.input_data[0]["size"],  # 目标地址大小
                            bytes_ptr,  # 源地址 host
                            len(blob_bytes),  # 源地址大小
                            ACL_MEMCPY_HOST_TO_DEVICE)  # 模式:从host到device

        if ret != 0:
            logger.error(f"memcpy execution failed with error code: {ret}")
            raise RuntimeError(f"memcpy execution failed with error code: {ret}")
最后的ret总是107002,请帮忙看看为啥会这样,我哪里还需要注意?

我要发帖子