昇腾社区首页
中文
注册

图编译模式使用流程

在MindIE-RT的技术路线上,我们提供了两种模型迁移的方式,一种是基于框架的图模式编译,一种是基于算子组网的算子编译模式。本章节介绍这两种迁移方式的使用流程。

图编译模式使用流程

在本节中,您将通过一个ResNet50的图片分类应用,了解调用MindIE-RT图编译模式使用的全过程,包括创建网络、模型优化、以及落盘优化后模型,编写一个优化模型的总体步骤,如图1所示。

图1 MindIE-RT推理优化流程图

创建网络

当用户获得了一个已经训练好的网络模型后,需要将该模型转换成MindIE-RT中的Network,Network可以由两种方式创建获得:

  • 使用parser解析框架模型文件,转换成Network,详情请查看创建网络
    //解析框架模型
    Builder* builder = Builder::CreateInferBuilder("Ascend310P3"); // 构造onnx解析器
    auto network = builder->CreateNetwork();  // 创建Network
    std::string modelPath("./resnet50.onnx");
    OnnxModelParser parser;
    bool ret = parser.Parse(network, modelPath.c_str()); // 解析onnx model生成Network
  • 使用Network提供的Layer添加接口,逐个算子搭建Network。
    // 手动组网
    Dims inputShape({16, 3, 224, 224});    
    Tensor *inputTensor = network->AddInput("input1", DataType::FLOAT, inputShape);
    int32_t numOutputMap = 64;
    Dims kernelHW({7, 7});
    std::vector<float> weight_data(64 * 3 * 7 * 7);
    std::vector<float> bias_data(64);
    WeightsBuf weightBuf {DataType::FLOAT, weight_data.data(), weight_data.size()};
    WeightsBuf biasBuf {DataType::FLOAT, bias_data.data(), bias_data.size()};
    ConvolutionLayer *convLayer = network->AddConvolutionLayer(inputTensor, numOutputMap, kernelHW, weightBuf, biasBuf); // network组网使用样例

生成模型

使用builder生成模型,从Network中生成出可以在昇腾AI处理器上部署的模型对象ModelData,可以选择是否将模型序列化并落盘。在builder过程中会对原始训练好的模型进行多级别的编译优化,然后生成昇腾AI处理器可以执行的代码,最终存储到ModelData中,在config选项中可以配置多个编译选项,来进行定制化编译。详情请查看生成模型

C++:

auto data = builder->BuildModel(network, config);  // 生成模型
std::ofstream fout("./resnet50.om", std::ios::binary);  // 保存模型为om格式
fout.write((char*)modelData.data.get(), modelData.size);
fout.close();

部署模型

用户可参考CANN AscendCL应用软件开发指南 (C&C++)CANN AscendCL应用软件开发指南 (Python),通过调用AscendCL的推理接口部署推理模型。