文档
注册
评分
提单
论坛
小AI

编译Graph为离线模型并运行Graph(大模型分布式编译切分)

本章节内容包括两个部分,首先编译出可用于分布式部署的om离线模型,然后使用LoadGraph接口加载模型,最后使用RunGraph运行加载了该模型的Graph,得到图的执行结果。

编译用于分布式部署的离线模型

编译用于分布式部署的离线模型,除了本章节介绍的方法外,还可以通过ATC工具模型转换获取,模型转换时需要使能--distributed_cluster_build参数。

涉及的主要接口为:

  1. Graph定义完成后,调用aclgrphBuildInitialize进行系统初始化,申请系统资源。初始化时,大模型编译切分场景需要aclgrphBuildInitialize接口通过options配置CLUSTER_CONFIG参数,指定目标部署环境的逻辑拓扑关系。
  2. 调用aclgrphBuildModel将Graph编译为适配昇腾AI处理器的离线模型,编译过程中会加载TBE内置算子库和自定义算子库。此时模型保存在内存缓冲区中。
    大模型编译切分场景需要aclgrphBuildModel接口通过options配置DISTRIBUTED_CLUSTER_BUILD,开启后生成的离线模型将用于分布式部署。
    • 若输入是完整大模型,并且开启了算法切分

      aclgrphBuildModel接口通过options配置ENABLE_GRAPH_PARALLEL、GRAPH_PARALLEL_OPTION_PATH参数(ENABLE_GRAPH_PARALLEL参数开启算法切分,GRAPH_PARALLEL_OPTION_PATH参数配置切分策略配置文件路径)。

      大模型算法切分后会将子模型要部署的logic device id存放在子模型的属性中,重新加载部署后,部署模块根据该属性进行分布式部署。

      图1 原理图
    • 若入是切片模型,模型中包括通信算子,将切片模型编译为om离线模型

      aclgrphBuildModel接口通过options配置MODEL_RELATION_CONFIG(设置多个切片模型之间的输入输出关系)。

      图2 原理图
  3. 将内存缓冲区中的模型保存为离线模型文件*.om,调用aclgrphSaveModel,序列化保存离线模型到文件中。
  4. 调用aclgrphBuildFinalize结束进程,释放系统资源。

加载模型并运行Graph

涉及的主要接口为:

  1. 调用GEInitialize进行系统初始化(也可在Graph构建前调用),申请系统资源。
  2. 调用Session构造函数创建Session类对象,申请session资源。
  3. 调用LoadGraph在Session类对象中添加通过编译用于分布式部署的离线模型编译好的om离线模型或者通过ATC工具转换出来的可用于分布式部署的离线模型。
  4. 调用RunGraph运行图。
  5. 调用GEFinalize,释放系统资源。

开发示例

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

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

    1
    2
    3
    std::map<AscendString, AscendString>config = {{"ge.exec.deviceId", "0"},
                                                  {"ge.graphRunMode", "1"}};
    Status ret = ge::GEInitialize(config);
    

    可以通过config配置传入ge运行的初始化信息,配置参数ge.exec.deviceId和ge.graphRunMode,分别用于指定GE实例运行设备,图执行模式(在线推理请配置为0,训练请配置为1)。更多配置请参考表1

  3. 添加Graph对象并加载执行离线模型。
    若想使定义好的Graph运行起来,首先,要创建一个session对象,然后调用LoadGraph接口加载离线模型并执行。示例代码如下:
     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
    std::map <AscendString, AscendString> options;
    ge::Session *session = new Session(options);
    if(session == nullptr) {
      std::cout << "Create session failed." << std::endl;
      ...
      ...
      //释放资源
      ge::GEFinalize(); 
      return FAILED;
    }
    
    auto session = std::make_shared<ge::Session>(options);
    const std::string model_path;
    //加载离线模型 只支持加载可用于分布式部署的离线模型,且模型中不包含变量
    auto ret = session->LoadGraph(graph_id, load_option, model_path);
     // 执行模型
    ret = session->RunGraph(graph_id, inputs, outputs);
    if(ret != SUCCESS) {
      ...
      ...
      //释放资源
      ge::GEFinalize();
      delete session;
      return FAILED;
    }
    

    用户可以通过传入options配置图运行相关配置信息,相关配置请参考Session构造函数。其中图运行完之后的数据保存在Tensor output_cov中。

  4. 图运行完之后,通过GEFinalize释放资源。
    1
    ret = ge::GEFinalize();
    
搜索结果
找到“0”个结果

当前产品无相关内容

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