0
动态图与静态图转换
从 TensorFlow、PyTorch,到 PaddlePaddle、MindSpore、MegEngine,主流的 AI 框架动静态图转换,经历了动静分离、动静结合到动静统一的发展过程。兼顾动态图易用性和静态图执行性能高效两方面优势,均具备动态图转静态图的功能,支持使用动态图编写代码,框架自动转换为静态图网络结构执行计算。
短短七八年时间,动静态图互相转换的技术在 AI 系统领域发展迅速,大大提升了 AI 算法/模型的开发效率,提高了 AI 产品应用的便利性,实现了计算效率和灵活性的平衡。
更详细的具体实现将会在 AI 编译器里面的 PyTorch 动态图转静态图的尝试路径讲解。
背景
在前面的内容详细讲述过动态图与静态图的具体内容,静态图易于优化但灵活性低,动态图灵活性高但由于缺少统一的计算过程表示,难以在编译期进行分析。
历史发展
- 动静分离
动静分离阶段,其对应的代表性框架为谷歌在 2017 年发布的 TensorFlow,默认使用静态图,硬件亲和性能高,易部署。相对而言,2018 年发布的 PyTorch,默认采用动态图,其编程范式符合日常编程风格习惯,学习成本低,开发效率高。
- 动静结合
动态图和静态图都有其各自的优缺点,不过动态图难以转换成为静态图,那么能否让开发者通过标识符号,来通知 AI 框架对于表示的代码段实现静态图转换成为动态图。该思路的基本实现方式是在静态图代码块上加上装饰符。
2019 年谷歌发布的 TensorFlow 2.0 支持动静态图的相互转化,TensorFlow 2.0 默认使用动态图,允许将一部分 Python 语法转换为可移植、高性能、语言无关的 TensorFlow1.x 语法,从而支持 TensorFlow1.X 静态图和 TensorFlow2.X 动态图的切换。2022 年 Meta 发布的 PyTorch 2.0 从 Python 侧支持 Compiler
编译产生静态图的功能。
- 动静统一
动静统一是 AI 框架技术上追求的最终实现方式,开发者能够根据需要,灵活地在动态图与静态图之间切换。然而动态图和静态图的切换面临很大困难:静态图可以看作是一种特殊的领域语言(DSL),则该特殊 DSL 实际上是表示为静态语言的;但是 Python 实际为动态解释类型语言,因此很难将 Python 语言无损转化到静态语言中,又可以方便地从静态语言转换回 Python 代码。
实现方式
主流的 AI 框架最终目标是实现计算图的动静统一,目前从 AI 框架的技术趋势来看