1 系统环境
硬件环境(Ascend/GPU/CPU): Ascend
MindSpore版本: mindspore=2.6.0
执行模式(PyNative/ Graph): Graph
Python版本: Python=3.9
操作系统平台: Linux
2 报错信息
2.1 问题描述
在昇思MindSpore中使用Graph模式set_context(mode=GRAPH_MODE)运行网络,发现第一次运行非常慢,且只要输入Shape改变就会重新编译,如何优化?
2.2 脚本信息
set_context(mode=GRAPH_MODE)
3 根因分析
耗时原因: 第一次运行时,MindSpore需要进行静态图编译、算子选择和流分配,这非常耗时。输入Shape改变导致重新编译是因为触发了动态图机制,导致图缓存失效。
4 解决方案
这是MindSpore图编译机制的正常表现,但可以通过以下方式优化:
- 优化Shape变化(分桶策略):
- 如果输入Shape在几个固定范围内变化,可以配置
mindspore.set_context中的jit_config或在Ascend ACL层配置分档(Bucketing)。 - 将相近的Shape补齐(Padding)到固定的几个标准Shape,减少图编译的次数。
- 使用动态Shape特性:
- 将网络配置为支持动态Shape(Dynamic Shape)。这需要算子本身支持动态Shape,且在编译时不需要指定具体数值,而是指定范围。这虽然会轻微牺牲执行性能,但能避免频繁的图重新编译。
- 保存和加载MindIR:
- 一旦编译完成,可以将模型保存为MindIR格式。下次启动时直接加载MindIR,可以跳过大部分图编译过程。