昇腾社区首页
中文
注册

动态输入shape范围

本节介绍如何在模型构建时设置动态输入的shape范围。

功能介绍

用户在模型编译时可以指定模型输入数据的shape范围,从而编译出支持动态输入的模型。

支持的型号

Atlas 推理系列产品

Atlas 训练系列产品

Atlas A2训练系列产品/Atlas 800I A2推理产品

使用方法

  1. 在Data算子定义时,将数据shape的指定维度设置为-1:
    1
    2
    3
    4
    5
        auto shape_data = vector<int64_t>({ -1,3,5,-1 });
        TensorDesc desc_data(ge::Shape(shape_data), FORMAT_ND, DT_FLOAT);
        auto data = op::Data("data");
        data.update_input_desc_data(desc_data);
        data.update_output_desc_out(desc_data);
    
  2. 模型编译时,在aclgrphBuildModel接口options中通过INPUT_SHAPE指定模型输入数据的shape范围。
    1
    2
    3
    4
    5
    6
    void PrepareOptions(std::map<AscendString, AscendString>& options) {
        options.insert({
            {ge::ir_option::INPUT_FORMAT, "NCHW"},
            {ge::ir_option::INPUT_SHAPE, "8~20,3,5,-1"} 
        });
    }
    

    INPUT_SHAPE参数设置shape范围时的格式要求:

    • 支持按照name设置:"input_name1:n1,c1,h1,w1;input_name2:n2,c2,h2,w2",例如:"input_name1:8~20,3,5,-1;input_name2:5,3~9,10,-1"。指定的节点必须放在双引号中,节点中间使用英文分号分隔。input_name必须是转换前的网络模型中的节点名称。如果用户知道data节点的name,推荐按照name设置。
    • 支持按照index设置:"n1,c1,h1,w1;n2,c2,h2,w2",例如:"8~20,3,5,-1;5,3~9,10,-1"。可以不指定节点名,节点按照索引顺序排列,节点中间使用英文分号分隔。按照index设置shape范围时,data节点需要设置属性index,说明是第几个输入,index从0开始。
    • 动态维度有shape范围的用波浪号“~”表示,固定维度用固定数字表示,无限定范围的用-1表示。

使用注意事项

如果模型编译时通过该参数设置了动态输入的shape范围,则进行模型推理时,需要在模型执行aclmdlExecute接口之前调用aclmdlSetDatasetTensorDesc接口用于设置该输入的tensor描述信息(主要是设置Shape信息);模型执行之后,调用aclmdlGetDatasetTensorDesc接口获取模型动态输出的Tensor描述信息(主要是获取输出内存的大小、输出内存地址等)。