MindSpore中使用Graph模式运行网络首次运行慢,且输入Shape改变就会重新编译

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图编译机制的正常表现,但可以通过以下方式优化:

  1. 优化Shape变化(分桶策略):
  • 如果输入Shape在几个固定范围内变化,可以配置mindspore.set_context中的jit_config或在Ascend ACL层配置分档(Bucketing)
  • 将相近的Shape补齐(Padding)到固定的几个标准Shape,减少图编译的次数。
  1. 使用动态Shape特性:
  • 将网络配置为支持动态Shape(Dynamic Shape)。这需要算子本身支持动态Shape,且在编译时不需要指定具体数值,而是指定范围。这虽然会轻微牺牲执行性能,但能避免频繁的图重新编译。
  1. 保存和加载MindIR:
  • 一旦编译完成,可以将模型保存为MindIR格式。下次启动时直接加载MindIR,可以跳过大部分图编译过程。