pytorch底层原理学习--计算图

发布于:2025-07-02 ⋅ 阅读:(18) ⋅ 点赞:(0)

计算图

计算图(Computational Graphs)是一种可以用来表示数学表达式的图。它类似于深度学习模型中的描述性语言,提供所需计算的功能描述。
在深度学习中,神经网络可以看成是一种有向图directed acyclic graph(DAG),即一种特殊的图结构,我们称之为计算图,其结构如下图所示:

在这里插入图片描述

和普通的图一样,计算图也是由节点(nodes)(上图中的椭圆)和边(edges)(上图中的箭头)构成。在神经网络模型中,计算图中的节点一般为张量数据,边为运算符号(也称为算子(operator)),也就是说计算图表示数据与数据之间的数学逻辑关系(运算),这正描述了神经网络的构成,因此计算图可以用于神经网络的正向传播和反向传播(见链接1或者李宏毅老师的课程)。因此在神经网络框架如pytorch和tensorflow中都使用计算图作为神经网络的计算方法,这一点非常重要,可以说计算图是pytorch和tensorflow的灵魂,只有认识到这一点才能更好的学习深度学习。

静态图和动态图

计算图分为两种方法:第一种叫静态图,英文有两种叫法:Static Computational Graphs和Graph Execution,第二种叫动态图,英文有两种叫法:Dynamic Computational Graphs,Eager Execution。

在tensorflow1.x版本中使用的就是静态图,在pytorch中使用的是动态图,这也是这两种深度学习框架最大的差异。从目前来说动态图更受欢迎,这也是pytorch使用量逐步超越tensorflow的原因(虽然2.x的tensorflow已经支持动态图)。

什么是静态图?

在这里插入图片描述

先定义然后运行(Define-Then-Run):在具有静态计算图的框架中(如TensorFlow 1.x),在执行任何计算之前,都会定义整个计算图。一旦定义,图就会“冻结”,这意味着在执行过程中不能更改。

执行:定义图后,通过向其中传输数据来执行它。此图在执行前经过编译和优化,可以提高运行时性能。

优点:优化效果更好,因为整个图是提前知道的,运行速度更快。

缺点:在动态修改模型架构或调试时灵活性较低,因为任何更改都需要重新定义和重新编译整个图。

也就是说静态图是先编译成机器码再运行,类似C语言或者C++的机制,是一种静态的,如果修改某个结构需要重新编译,然后运行。这种方法调试很困难并且这和python 的动态特性(在运行时才确定:如动态类、if条件分支、循环等)存在本质冲突。

什么是动态图?

在这里插入图片描述

在运行时定义(Define-by-Run):在 PyTorch 和其他具有动态计算图的框架中,计算图是在操作执行时动态构建的。这意味着计算图的结构是在运行时根据流经它的数据确定的。
执行:计算图在正向传递过程中动态定义。每次执行正向传递时,计算图都会重新定义(实时重新构建计算图),从而允许即时反馈和模型更改。
优点:

  • 灵活性:您可以在训练过程中更改模型架构,例如添加循环、条件语句或在每个步骤中更改操作。这在强化学习、循环神经网络 (RNN) 以及处理可变长度序列等场景中尤其有用。
  • 易于调试:由于计算图是实时构建的,您可以逐步检查和修改它,从而使调试更加直观。您可以使用标准的 Python 调试工具(例如打印语句、断点等)来实时检查和修改计算过程。

缺点:

运行速度可能较慢:由于计算图是在运行时构建和解释的,因此与静态计算图相比,其速度优化程度可能不高,尤其是在大规模部署中。不过,PyTorch 的优化功能和 TorchScript 等工具通常可以缓解这一问题。

在这里插入图片描述

另外:pytorch中默认是动态图,其也支持静态图,后面会单独开一节写一写pytorch的静态图。

参考:

[1计算图](Computational Graphs in Deep Learning - GeeksforGeeks)

[2静态图动态图](Dynamic vs Static Computational Graphs - PyTorch and TensorFlow - GeeksforGeeks)

[3静态图动态图2](Static vs Dynamic Computational Graphs | by Abhishek Jain | Medium)

[4pytorch图](Understanding PyTorch Eager and Graph Mode | by Hey Amit | Medium)

[5](391. Graph Execution VS Eager Execution - My Blog)


网站公告

今日签到

点亮在社区的每一天
去签到