下载
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
昇腾小AI

动态Shape输入(设置Shape范围)

Atlas 200/300/500 推理产品不支持该特性

Atlas 200/500 A2推理产品不支持该特性

接口调用流程

如果模型输入Shape是动态的,在模型执行之前调acl.mdl.set_dataset_tensor_desc设置该输入的tensor描述信息(主要是设置Shape信息),在模型执行之后,调用acl.mdl.get_dataset_tensor_desc接口获取模型动态输出的Tensor描述信息,再进一步调用aclTensorDesc数据类型的操作接口获取输出Tensor数据占用的内存大小、Tensor的Format信息、Tensor的维度信息等。

关键原理说明如下:

  1. 构建模型。

    模型推理场景下,对于动态Shape的输入数据,使用ATC工具转换模型时,通过“input_shape”参数设置输入Shape范围。

    ATC工具的参数说明请参见ATC工具使用指南

  2. 加载模型。

    模型加载的详细流程,请参见模型加载,模型加载成功后,返回标识模型的ID。

  3. 创建aclmdlDataset类型的数据,用于描述模型执行的输入、输出。

    详细调用流程请参见准备模型执行的输入/输出数据结构

    注意点如下:

    • 当调用acl.mdl.get_input_size_by_index获取到的size大小为0时,表示该输入的Shape是动态的,用户可根据实际情况预估一块较大的输入内存。
    • 当调用acl.mdl.get_output_size_by_index获取到的size大小为0时,表示该输出的Shape是动态的,用户可根据实际情况预估一块较大的输出内存。
  4. 在成功加载模型之后,执行模型之前,调用acl.mdl.set_dataset_tensor_desc接口设置动态Shape输入的Tensor描述信息(主要是设置Shape信息)。

    在调用acl.create_tensor_desc接口创建Tensor描述信息时,设置Shape信息,包括维度个数、维度大小,此处设置的维度个数、维度大小必须在模型构建时设置的输入Shape范围内,模型构建的详细说明请参见模型构建

  5. 执行模型。

    例如,调用acl.mdl.execute接口(同步接口)执行模型。

  6. 获取模型执行的结果数据。

    调用acl.mdl.get_dataset_tensor_desc接口获取动态Shape输出的Tensor描述信息,再利用aclTensorDesc数据类型的操作接口获取Tensor描述信息的属性,此处以获取size(表示Tensor数据占用的空间大小)为例,然后从内存中读取对应size的数据。

示例代码

调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

// 此例中假设模型的第一个输入为动态输入,其index为0;模型的第一个输出为动态输出,其index为0。
# 1.模型加载,加载成功后,再设置动态输入的Tensor描述信息,主要设置动态输入的Shape信息。
# ......

# 2.准备模型描述信息modelDesc_,准备模型的输入数据input_和模型的输出数据output_。
# 此处需注意:
# 当利用acl.mdl.get_input_size_by_index获取到的size大小为0时,表示该输入的Shape是动态的,用户可根据实际情况预估一块较大的输入内存。
# 当利用acl.mdl.get_output_size_by_index获取到的size大小为0时,表示该输出的Shape是动态的,用户可根据实际情况预估一块较大的输出内存。
# ......

# 3.自定义函数,设置动态输入的Tensor描述信息。
def set_tensor_desc():
    # ......
    # 创建Tensor描述信息,其中dataType和format不需要设置,pyACL直接从模型中获取,此处使用的默认值。
    #shape需要和给定的输入数据的shape一致。
    shapes = [1, 3, 224, 224]
    inputDesc = acl.create_tensor_desc(0, shapes, 0)

    # 设置index为0的动态输入的Tensor描述信息。
    ret = acl.mdl.set_dataset_tensor_desc(input_, inputDesc, 0)
    # ......


def model_execute():
    # ......
    # 调用自定义接口,设置动态输入的Tensor描述信息。
    set_tensor_desc()

    # 执行模型。
    ret = acl.mdl.execute(modelId, input_, output_)

    # 获取index为0的动态输出的Tensor描述信息。
    outputDesc = acl.mdl.get_dataset_tensor_desc(output_, 0)

    # 利用aclTensorDesc数据类型的操作接口获取outputDesc的属性,此处需要获取size(表示Tensor数据占用的空间大小),然后从内存中读取对应size的数据。
    outputFileName = str(ss)

    outputDesc_size = acl.get_tensor_desc_size(outputDesc)
    dataBuffer = acl.mdl.get_dataset_buffer(output_, 0)
    data = acl.get_data_buffer_addr(dataBuffer)
    outHostData = None

    # 调用acl.rt.get_run_mode接口获取软件栈的运行模式,并根据运行模式判断是否进行数据传输。
    runMode = None
    ret = acl.rt.get_run_mode(runMode)
    if runMode == ACL_HOST:
        ret = acl.rt.malloc_host(outHostData, outputDesc_size)

        # 由于动态shape申请的内存比较大,而真实数据的大小是outputDesc_size,所以此处用真实数据大小去拷贝内存。
        ret = acl.rt.memcpy(outHostData, outputDesc_size, data, outputDesc_size, ACL_MEMCPY_DEVICE_TO_HOST)
        with open(outputFileName, "wb") as f:
            f.write(outHostData)
        ret = acl.rt.free_host(outHostData)
    else:
        with open(outputFileName, "wb") as f:
            f.write(data)
    # ......

# 5.处理模型推理结果
# TODO
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词