昇腾社区首页
EN
注册

编译并运行Graph场景

当前系统支持在用户脚本中指定配置动态维度信息,从而支持动态输入的场景,本节给出详细说明。

功能介绍

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

编译并运行Graph场景的动态维度当前仅支持在整图设置:使用Session参数设置维度信息,输入可以为dataset方式、placeholder方式,或者两种混合方式。对于混合输入,当前仅支持其中一种为动态变化的场景。

使用方法

  1. 在Data算子定义时,将数据shape的动态维度设置为-1:
    1
    2
    3
    4
    5
        auto shape_data = vector<int64_t>({ 1,-1,-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. 编译并运行Graph时,在Session接口和AddGraph接口的options中设置ge.inputShape/ge.dynamicNodeType信息,同时通过ge.dynamicDims指定维度信息。
    • ge.inputShape参数必须设置。
    • 整图设置动态维度时,用户在脚本中设置的ge.inputShape的输入顺序要和实际data节点的name字母序保持一致,比如有三个输入:label、data、mask,则ge.inputShape输入顺序应该为data、label、mask:
      1
      "data:1,1,40,-1;label:1,-1;mask:-1,-1"
      
    • 编译并运行Graph动态维度场景,如果模型有多个输入,非分档输入支持指定内部Format格式,分档输入不支持指定内部Format格式,详细使用方法请参见指定Graph输入输出的内部格式
    1
    2
    3
    4
    5
    6
    7
    std::map<std::string, std::string> options = {{"ge.inputShape", "data:1,1,40,-1;label:1,-1;mask:-1,-1"}, 
                                                 {"ge.dynamicDims", "20,20,1,1;40,40,2,2;80,60,4,4"}, 
                                                 {"ge.dynamicNodeType", "1"}};
    // 动态维度参数添加到Session
    ge::Session *session = new ge::Session(options);
    // 动态维度参数添加到graph
    session->AddGraph(graph_id, graph, options);
    
  • ge.inputShape表示网络的输入shape信息,以上配置表示网络中有三个输入,输入的name分别为data,label,mask,各输入的shape分别为(1,1,40,-1)、(1,-1)、(-1,-1),其中-1表示该维度为动态,需要通过ge.dynamicDims设置动态维度参数。
  • ge.dynamicDims用来设置动态维度的档位,档位中间使用英文分号分隔,每档中的dim值与ge.inputShape参数中的-1标识的参数依次对应,ge.inputShape参数中有几个-1,则每档必须设置几个维度。结合ge.inputShape信息,ge.dynamicDims配置为"20,20,1,1;40,40,2,2;80,60,4,4",则表示输入shape支持三个档位,模型编译时,支持的输入组合档位数分别为:
    • 第0档:data(1,1,40,20),label(1,20),mask(1,1)
    • 第1档:data(1,1,40,40),label(1,40),mask(2,2)
    • 第2档:data(1,1,40,80),label(1,60),mask(4,4)
  • ge.dynamicNodeType用于指定动态输入的节点类型。0:dataset输入为动态输入;1:placeholder输入为动态输入。当前不支持dataset和placeholder输入同时为动态输入。