昇腾社区首页
EN
注册

动态输入shape范围

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

功能介绍

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

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

使用方法

  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描述信息;再进一步调用aclTensorDesc下的操作接口获取输出Tensor数据占用的内存大小、Tensor的Format信息、Tensor的维度信息等。