Update table reference

This commit is contained in:
Eric_lai
2022-01-27 11:26:38 +08:00
parent 15e22c1765
commit 5ff00cf99e
3 changed files with 15 additions and 8 deletions

View File

@@ -75,8 +75,9 @@ def model(X1, X2):
```
在静态生成过程中,计算框架获取完整的计算图可以分析出计算$\boldsymbol{Y_1}$和$\boldsymbol{Y_2}$的过程相对独立,可以将其进行自动并行计算,加快计算效率。而动态生成的过程中,若无手动配置并行策略,计算框架无法获取图结构不能分析出算子之间的独立性,则只能按照代码顺序执行。模型在输出结果之前执行了*add*和*relu*算子操作,在静态生成过程中利用计算图优化策略中的算子融合方法,可以将这两个算子融合为一个算子执行,这样减少了中间变量$\boldsymbol{Y}$的存储与读取过程,加快了计算效率,减少了内存占用。而动态生成过程则需要按照顺序执行*add*和*relu*两步操作,需要存储变量$\boldsymbol{Y}$。除此之外,由于静态生成能够同时分析重构出前向计算图和反向计算图,可以提前确定反向计算中需要保存的前向中间变量信息。而动态生成则在完成前向计算后才能构建出反向计算图,为了保证反向计算效率需要保存更多的前向计算中间变量信息,相比之下静态生成的过程更加节省内存占用。
为了方便读者对比,将静态图和动态图特性总结见表。
为了方便读者对比,将静态图和动态图特性总结见表3.3.1
:静态图和动态图对比
|特性|静态图|动态图|
|:---:| :---: | :---: |
@@ -86,7 +87,7 @@ def model(X1, X2):
| 性能 | 优化策略多,性能更佳 | 图优化受限,性能较差 |
| 内存占用 | 内存占用少 | 内存占用相对较多 |
| 部署能力 |可直接部署 | 不可直接部署|
:label:`cmp_dynamic_static`
针对两种模式的特性,结合任务需求选择合适的模式可以事半功倍,学术科研以及模型开发调试阶段,为了快速验证思想和迭代更新模型结构可以选择动态图模式进行构建算法;网络模型确定,为了加速训练过程或者为硬件部署模型,可以选择静态图模式。
@@ -128,7 +129,9 @@ def model(X, flag):
```
代码中模型整体可以采用动态生成,而\@ms\_function可以使用基于源码转换的技术将模块*add_and_relu*的转化为静态图结构。与动态生成中代码执行相同,模型接受输入按照模型定义的计算顺序进行调度执行,并生成临时图结构,当执行语句*Y=add_and_relu(Y,b)* 时,计算框架会自动调用该模块静态生成的图结构执行计算。模块*add_and_relu* 可以利用静态图中的优化技术来提高计算性能,实现动态图和静态图的混合执行。此外,动静态转换的技术常用于模型部署阶段,动态图预测部署时除了需要已经训练完成的参数文件,还须提供最初的模型组网前端代码,这使得动态图部署受到局限性,部署硬件中往往难以提供支持前端语言执行环境。因此当使用动态图模式训练完成模型参数后,可以将整体网络结构转换为静态图格式,将神经网络模型和参数文件进行序列化保存,与前端代码完全解耦,扩大模型部署的硬件支持范围。
主流的计算框架TensorFlow、MindSpore等中均提供动静态相互转换与融合执行的技术我们将各框架中支持源码转换和追踪转换技术的接口梳理如下表所示。
主流的计算框架TensorFlow、MindSpore等中均提供动静态相互转换与融合执行的技术我们将各框架中支持源码转换和追踪转换技术的接口梳理如下表3.3.2所示。
:主流框架动态图转换静态图支持
|框架|动态图转静态图|
| :-:| :---: |
@@ -136,5 +139,5 @@ def model(X, flag):
| MindSpore | context.set_context(mode=context.PYNATIVE_MODE) 动态图模式 <br> context.set_context(mode=context.GRAPH_MODE) 静态图模式 <br>\@ms_function支持基于源码转换 |
| PyTorch | torch.jit.script()支持基于源码转换,<br>torch.jit.trace()支持基于追踪转换 |
| PaddlePaddle | paddle.jit.to_static()支持基于源码转换,<br>paddle.jit.TracedLayer.trace()支持基于追踪转换 |
:label:`dynamic_static_switch`