MindSpore端边云统一格式 ——MindIR 【学习笔记】

转载地址:https://bbs.huaweicloud.com/forum/thread-105368-1-1.html

作者:ruochen

MindSpore端边云统一格式 —— MindIR

MindSpore端云协同的全场景AI架构

  • MindExpress:ME前端,对接用户的Python代码模块
  • MindSpore Lite:端侧,可以用在手机端(也就是可以在手机以及IOT设备上部署MindSpore模型训练的AI框架)
  • ModelZoo::网络定义,训练脚本
  • MindArmour:可攻防框架(隐私保护,对抗训练)
  • MindData:数据模块,包括对抗训练、Insight(可视化调参)
    MindSpore端边云统一格式 ——MindIR 【学习笔记】_第1张图片

Intermediate Representation —— IR介绍

IR:编译器的运行过程中,中间节点的表示,都可以称为IR (起到$\color{red}承上启下$的一个作用)
比如在一个程序编译过程中,源代码和目标代码之间的一个翻译就可以称之为IR
在AI框架中,IR表示实际上就是将用户的模型表达翻译成可执行的代码,再去进行训练和推理

MindSpore端边云统一格式 ——MindIR 【学习笔记】_第2张图片

MindIR的应用场景

MindSpore端边云统一格式 ——MindIR 【学习笔记】_第3张图片

  • 应用场景
    • 在Ascend AI处理器、GPU、CPU,导出MindIR文件
    • 使用MindSpore Serving服务或MindSpore Lite进行推理

MindIR概述

  • MindSpore通过统一IR定义了网络的逻辑结构和算子的属性,将MindIR格式的模型文件与硬件平台解耦,实现一次训练多次部署
  • MindIR作为MindSpore的统一模型文件,同时存储了网络结构和权重参数值。同时支持部署到云端Serving和端侧Lite平台执行推理任务
  • 同一个MindIR文件支持多种硬件形态的部署
    • Serving部署推理
    • 端侧Lite推理部署

相关基础概念介绍

  • Checkpoint
    • 采用了Protocol Buffers格式,存储了网络中所有的参数值
    • 一般用于训练任务中断后恢复训练,或训练后的微调(Fine Tune)任务
  • MindIR
    • 全程MindSpore IR,是MindSpore的一种基于图表示的函数式IR,定义了可扩展的图结构以及算子的IR表示
    • 它消除了不同后端的模型差异,一般用于跨硬件平台执行推理任务
  • ONNX
    • 全称Open Neural Network Exchange,是一种针对机器学习模型的通用表达
    • 一般用于不同框架间的模型迁移或在推理引擎(TensorRT)上使用
  • AIR
    • 全称Ascend Intermediate Representation,是华为定义的针对机器学习所设计的开放式文件格式
    • 它能更好地适应华为AI处理器,一般用于Ascend 310 上执行推理任务

MindSpore IR —— ANF介绍

MindSpore端边云统一格式 ——MindIR 【学习笔记】_第4张图片

  • AnfNode:ANode
    • ValueNode:Scalar、Tensor、Primitive等(比如图中的x、y、sub等)
    • ParameterNode:parameter(参数)
  • CNode:对应ANF复合表达式,表示一次函数调用,第一个input一般是Primitive

MindIR如何存储ANF

  • MindIR采用Protocol Buffers协议

    Protocol Buffers:由Google开发的一套开源序列化协议框架,类似于XML、JSON,采用协议序列化用于数据存储与读取,与XML相比,定义了数据格式更加简单

  • 顶层节点为GraphProto
    MindSpore端边云统一格式 ——MindIR 【学习笔记】_第5张图片

MindIR文件解析

MindSpore端边云统一格式 ——MindIR 【学习笔记】_第6张图片

如何生成MindIR文件

  • 定义网络
  • 训练网络,保存checkpoint文件
  • 导出模型文件
  • 导出模型代码如下
    import numpy as np
    from mindspore import Tensor, export, load_checkpoint, load_param_into_net
    # 定义网络
    resnet = ResNet50()
    # 加载训练好的checkpoint文件
    load_checkpoint("resnet50-2_32.ckpt", net=resnet)
    # 定义网络的输入
    input = np.random.uniform(0.0, 1.0, size=[32, 3, 224, 224]).astype(np.float32)
    # 导出MindIR格式文件
    export(resnet, Tensor(input), file_name='resnet50', file_format='MINDIR')
    >>> `resnet50.mindir`

你可能感兴趣的:(python)