下载
中文
注册

编译并运行FlowGraph

功能介绍

构建完FlowGraph之后,如果您希望直接编译并运行FlowGraph,得到图的执行结果,可以参考本节内容。涉及的主要接口为:

  1. 调用"GEInitialize"接口进行系统初始化(也可在Graph构建前调用),申请系统资源。
  2. 调用"Session构造函数"创建Session类对象,申请session资源。
  3. 调用"FlowGraph"接口在Session类对象中添加定义好的图。
  4. 调用"RunGraph"接口或者"FeedDataFlowGraph(feed所有输入)"和"FetchDataFlowGraph(获取所有输出数据)/FetchDataFlowGraph(按索引获取输出数据)"运行图。
  5. 调用"GEFinalize"接口,释放系统资源。

如上步骤中的"GEInitialize"、"Session构造函数"、"AddGraph"、"RunGraph"、"GEFinalize"详细信息请参考Ascend Graph开发指南

使用DataFlow开发框架时,NN模型执行使用是饱和模式。

开发示例

  1. 包含的头文件。
    1
    #include "ge_api.h"
    
  2. 申请系统资源。

    Graph定义完成后,调用GEInitialize进行系统初始化(也可在Graph定义前调用),申请系统资源。示例代码如下:

    1
    2
    3
    4
    5
    6
    std::map<AscendString, AscendString>config = {{"ge.exec.deviceId", "0"},
                                                  {"ge.exec.logicalDeviceClusterDeployMode", "SINGLE"},
                                                  {"ge.exec.logicalDeviceId", "[0:0]"},
                                                  {"ge.graphRunMode", "1"},
                                                  {"ge.exec.precision_mode", "allow_fp32_to_fp16"}};
    Status ret = ge::GEInitialize(config);
    

    可以通过config配置传入GE运行的初始化信息, 以上配置中的参数(ge.exec.deviceId、ge.graphRunMode和ge.exec.precision_mode),分别用于指定GE实例运行设备,图执行模式(在线推理请配置为0,训练请配置为1),以及算子精度模式。更多配置请参考“options参数说明”。

    由于部分UDF不支持负荷分担,所以需要在GE初始化时添加{"ge.exec.logicalDeviceClusterDeployMode", "SINGLE"}, {"ge.exec.logicalDeviceId", "[0:0]"}。其中logicalDeviceId 可以是[0:0],也可以是[0:1]。如果需要多实例部署,可以参考指定DataFlow节点部署位置来实现多实例部署。logicalDeviceId解释如下。

    logical_device_cluster_deploy_mode为SINGLE时,用于指定模型部署在某个指定的设备上。

    配置格式:[node_id:device_id]

    • node_id:昇腾AI处理器逻辑id,从0开始,表示资源配置文件中第几个设备。
    • device_id:昇腾AI处理器物理id。
  3. 添加Graph对象并运行Graph。
    若想使定义好的Graph运行起来,首先,要创建一个session对象,然后调用AddGraph接口添加图,再调用RunGraph接口执行图。示例代码如下:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    std::map <AscendString, AscendString> options;
    ge::Session *session = new Session(options);
    if(session == nullptr) {
    std::cout << "Create session failed." << std::endl;
    return FAILED;
    }
    // 构造FlowGraph
    Status ret = session->AddGraph(graph_id, flow_graph.ToGeGraph());
    if(ret != SUCCESS) {
    return FAILED;
    }
    // 方式一:RunGraph
    ret = session->RunGraph(graph_id, input, output);
    if(ret != SUCCESS) {
    return FAILED;
    }
    // 方式二:先FeedDataFlowGraph再FetchDataFlowGraph
    ge::DataFlowInfo dataFlowInfo;
    geRet = session->FeedDataFlowGraph(0, input, dataFlowInfo, 3000);
    if (geRet != ge::SUCCESS) {
        return FAILED;
    }
    geRet = session->FetchDataFlowGraph(0, output, dataFlowInfo, 3000);
    if (geRet != ge::SUCCESS) {
        return FAILED;
    }
    

    用户可以通过传入options配置图运行相关配置信息,相关配置请参考“options参数说明”。

    其中图运行完之后的数据保存在output中。

    如果dataflow图中包含udf节点,dataflow在图编译过程中会将编译结果放到用户指定udf的workspace目录下,落盘文件以graph_name_release.tar.gz格式存储。该文件用于dataflow模型部署阶段解压使用,在程序运行期间保证该文件不能被手动删除。

  4. 图运行完之后,通过GEFinalize释放资源。
    1
    ret = ge::GEFinalize();