打卡
目录
打卡
模型的两种保存形式
Checkpoint
中间表示IR
模型保存与加载
模型权重保存-例1
模型权重加载-例1
模型权重保存-例2
模型权重加载-例2
模型权重文件的空间占用计算-例
模型的两种保存形式
Checkpoint
权重参数文件
中间表示IR
中间表示(Intermediate Representation,IR)是程序编译过程中介于源语言和目标语言之间的程序表示。MindIR是一种基于图表示的函数式IR,其最核心的目的是服务于自动微分变换。
在图模式set_context(mode=GRAPH_MODE)
下运行用MindSpore编写的模型时,若配置中设置了set_context(save_graphs=1)
,运行时会输出一些图编译过程中生成的一些中间文件,我们称为IR文件。
-
ir后缀结尾的IR文件:一种比较直观易懂的以文本格式描述模型结构的文件,可以直接用文本编辑软件查看。
-
dot后缀结尾的IR文件:描述了不同节点间的拓扑关系,可以用graphviz将此文件作为输入生成图片,方便用户直观地查看模型结构。对于算子比较多的模型,推荐使用可视化组件MindSpore Insight对计算图进行可视化。
模型保存与加载
保存流程:
- 定义模型网络
- 选择损失函数、优化器等
- 训练模型、更新模型权重参数
- 选择1:保存模型权重参数Checkpoint到本地
- 选择2:保存中间表示IR到本地
加载流程:
- 定义模型网络
- 选择1:从本地加载模型权重参数Checkpoint
- 选择2:保存中间表示IR到本地
模型权重保存-例1
model = network()
mindspore.save_checkpoint( model, ## 待保存的对象。数据类型可为 mindspore.nn.Cell 、list或dict。"model.ckpt" ## 模型权重保存路径)
模型权重加载-例1
model = network()
param_dict = mindspore.load_checkpoint("model.ckpt")
param_not_load, _ = mindspore.load_param_into_net(model, param_dict)
print(param_not_load) ## param_not_load是未被加载的参数列表,为空时代表所有参数均加载成功。
模型权重保存-例2
MindIR同时保存了Checkpoint和模型结构,因此需要定义输入Tensor来获取输入shape。
model = network()
inputs = Tensor(np.ones([1, 1, 28, 28]).astype(np.float32))
mindspore.export(model, inputs, file_name="model", file_format="MINDIR")
模型权重加载-例2
mindspore.set_context(mode=mindspore.GRAPH_MODE)graph = mindspore.load("model.mindir")
model = nn.GraphCell(graph)
outputs = model(inputs)
print(outputs.shape)
模型权重文件的空间占用计算-例
- 计算方式:计算模型参数个数;按照每个参数占用的字节数计算所有参数的字节占用;转换字节占用单位为MB或GB等。
- 对比:查看实际保存的大小,与计算预期占用字节数做对比。
例子如下:可以看到,计算与预期基本一致。MindIR同时保存了Checkpoint和模型结构,参数文件会更大一些。