动/静态图概念
Dynamo中动/静态图概念
Dynamo编译后的FX图动/静态属性与模型输入的形状相关,因此先介绍torch.compile入参“dynamic”对模型输入形状的编译影响。
-
dynamic=False:
- 将tensor类型输入的具体维度值编译为固定常量(也称为固定形状),如(10, 20)。
- 将scalar类型输入编译为固定常量(也称为固定值),如30。
-
dynamic=True:
- 将parameter/buffer类tensor输入的具体维度值编译为固定常量,如(10, 20)。
- 将user_input类tensor输入的具体维度值默认编译为符号(也称泛化为符号),如(s0, s1);若此类tensor被mark_static标记,其具体维度值被编译为固定常量,如(10, 20)。
- 将scalar类型输入编译为符号,如s2。
表 1 不同类型输入编译规则
| dynamic参数配置 | user_input tensor | mark_static的tensor | parameter/buffer tensor | scalar输入 |
|---|---|---|---|---|
| dynamic=False | 固定形状 | 固定形状 | 固定形状 | 固定值 |
| dynamic=True | 符号形状 | 固定形状 | 固定形状 | 符号 |
dynamic=False时,编译后输入的所有维度具体化,可视为完全地静态编译;dynamic=True时,编译后输入默认符号化,且允许通过mark_static局部静态化。
若Dynamo编译后FX图中的输入存在符号形状或符号scalar,通常称为FX动态shape图,否则称为FX静态shape图。
GE动/静态图概念
GE提供了两种模型图调度的方式,Host调度和下沉调度,详细介绍参见《CANN 图开发》中“概念和原理介绍>模型下沉调度”。
- Host调度:Host CPU将模型中的每个算子依次进行InferShape、Tiling计算、下发到Device执行操作。
- 下沉调度:在加载阶段,模型中的算子以整图形式提前下发到Device上。执行时,只需在Host侧下发一个模型执行的Task即可触发Device上模型调度执行。在下沉调度模型中,算子可以在加载阶段完成Tiling计算或静态Kernel编译,因此在执行态时无需再次计算Tiling。相比于Host调度模式,下沉调度模式可大大降低Host侧调度开销,有效减少Host和Device之间的交互,同时也可以解决Host调度的Host Bound。
GE动/静态shape图与调度模式:
-
对于所有输入tensor shape不固定的图,称为动态shape图。动态Shape图在执行时才能确定Shape,完成Tiling计算,只能采用Host调度。
-
对于所有输入tensor shape固定的图,称为静态shape图。静态shape图中的算子一般都能采用下沉调度。
-
对于部分输入tensor shape不固定,部分输入tensor shape固定的图,整图归类为动态shape图。静态部分可以采用下沉调度,动态部分可以采用Host调度。
特殊情况下,静态shape图中存在值依赖算子,该算子默认使用Host调度。因此,在静态shape图中,部分算子采用下沉调度(能下沉的部分称为静态子图,在GE build图中以PartitionedCall节点形式存在),部分算子采用Host调度。
表 2 GE动静图shape特征表
| GE动/静态shape图 | 调度方式 |
|---|---|
| 动态shape图 | 所有算子采用Host调度。部分算子采用Host调度,部分算子采用下沉调度。 |
| 静态shape图 | 所有算子采用下沉调度。部分算子采用Host调度,部分算子采用下沉调度。 |
通常,动态shape图也简称动态图,静态shape图也简称静态图。