购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 深度学习框架的执行模式

在主流深度学习框架中,执行模式(也称为指令调度模式)包括Eager模式和Graph (图)模式两种。

1.3.1 Eager模式和Graph模式的对比

本小节对 Eager模式和 Graph模式进行简单的对比,以便读者理解如何选择执行模式。

1.Eager模式

Eager模式比较简单,在Eager模式下编写代码与编写普通的Python代码类似。Eager模式可以立即对操作进行评估,无须先构建计算图,再执行计算。

Eager模式是TensorFlow 2.0的默认执行模式。在Eager模式中,TensorFlow会直接计算代码中张量的值。

Eager模式简化了TensorFlow中模型构建的过程。用户可以立刻看到操作的结果。因为Eager模式简单易用,不但可以调试代码,而且可以减少重复编写代码的概率,所以建议初学者选择Eager模式。

Eager模式的主要特点如下。

① 简单易用的开发接口:只使用原生Python代码和数据结构进行开发即可。

② 更易于调试:只需直接调用操作、查看和测试模型。

③ 控制流更自然:Eager模式直接使用Python程序的控制流,无须使用复杂的计算图控制流。

④ 支持GPU和TPU(张量处理器)加速。

2.Graph模式

Eager模式便捷,适合初学者使用,但是它的运行速度比Graph模式慢。

因为Eager模式要一条一条地依次运行Python程序的所有操作,这样很难对程序进行优化。而Graph模式则会从Python程序中抽象出张量计算,在计算之前构建一个高效的图。在 TensorFlow 中使用 tf.Graph 对象表示图,这是一种特殊的由 tf.Operation 和tf.Tensor对象组成的数据结构。tf.Operation代表计算单元,tf.Tensor代表数据单元。图可以不依赖原始的Python代码单独保存,也可以单独运行。也就是说图是不依赖代码的,因此也不依赖某个具体的平台,这为开发跨平台应用提供了更多的灵活性。例如,一个训练好的模型可以通过图很方便地部署于移动设备、嵌入式设备和不支持Python的后端应用环境中。

关于图(计算图)的概念将在 1.3.2 小节中介绍,这里只需了解图的特点和优点。图易于优化,可以很方便地实现编译器级别的转换,例如使用常量折叠算法对张量值进行统计推断。常量折叠算法就是将图中常量的计算合并起来,提前计算。例如, C = A + B ,如果 A B 都是常量(假定 A =100、 B =500),则在使用 C 时,可直接使用 C = 600。也可以将不同操作的子部分分配到不同的线程和设备。Graph模式具有以下特性。

① 运行速度快。

② 灵活、易于扩展。

③ 支持平行运行,即将子操作分配到不同的线程和设备中运行。

④ 当在多个设备上平行运行时非常高效。

⑤ 可以利用GPU和TPU的加速能力。

因此,Graph模式是大模型训练的理想执行模式。

3.如何选择执行模式

通过前面的介绍,我们知道 Eager 模式更容易学习和测试,Graph 模式更高效、运行速度更快。因此最好的选择应该是以Eager模式构建模型,以Graph模式运行模型。那么比较流行的开源深度学习框架又是如何选择的呢?下面我们对 TensorFlow 和PyTorch的执行模式进行分析。

TensorFlow 2.0之前的版本,默认采用Graph模式,因为它运行速度快、高效且灵活度高。TensorFlow 2.0已经将Graph模式切换到Eager模式。为什么TensorFlow 2.0选择Eager模式呢?一方面,Eager模式更容易上手;另一方面,PyTorch选择了另一种细分执行模式——动态计算图(动态图)。它是与 Eager 模式相似的执行模式。动态图虽然没有TensorFlow的Graph模式高效,但是它可以为研究者和人工智能开发人员提供更简单、更便捷的开发接口,这使得PyTorch对新手更具吸引力。在Google Trends的统计数据中,2015年10月1日—2022年5月27日TensorFlow和PyTorch的搜索数量对比如图1-14所示。

图1-14 2015年10月1日—2022年5月27日TensorFlow和PyTorch的搜索数量对比

我们可以看到,虽然 PyTorch 2017 年才面世,但是它的受关注程度已经反超了TensorFlow。这种情况也促使TensorFlow团队最终选择以Eager模式作为默认的执行模式,Graph模式为备选项。

PyTorch则使用动态图作为默认的执行模式,静态计算图(静态图)作为备选项。

1.3.2 计算图的概念

在TensorFlow、PyTorch和Theano等深度学习框架中,反向传播算法是通过使用计算图来实现的。

1.什么是计算图

计算图是一个有向无环图,用于表现和评估数学表达式。下面介绍一个计算图的简单实例。假设有一个函数 F ,公式如下。

在上面的公式中,最先计算的是 b × c ,这里假设 u = b × c 。因此,函数 F 的描述如下。

再假设 v = a + u ,函数 F 可以描述如下。

综合以上过程,函数 F 可以使用图1-15所示的计算图来描述。

图1-15 函数F的计算图

如果给输入参数赋初值,则每个节点都会得到一个值,最终得到函数 F 的值,具体如图1-16所示。

图1-16 函数F的最终值

图1-15和图1-16只是计算图的演示,不同框架实现计算图的方式不同。计算图通常有两个主要元素:节点(Node)和边(Edge)。节点用于表示数据,例如标量、向量、矩阵、张量;边用于表示运算,例如加、减、乘、除和卷积等。

计算图可以用于以下两种类型的计算。

① 前向计算:图1-15和图1-16演示的计算过程就是前向计算。

② 反向计算:利用计算图求出函数 F 对应每个变量的导数。例如,计算 F v 的导数(求d F /d v )的过程如下。

已知 F = 3× v ,当 v =7时, F =21;当 v =7.001时, F =21.003。

F的增量除以 v 的增量等于3,即d F /d v =3。

2.深度学习中的计算图

神经网络的计算可以按照前向传播(前向传递)和反向传播(反向传递)两个步骤进行组织。首先执行前向传播步骤,用于计算神经网络的输出。然后执行反向传播步骤,用于计算梯度和导数。计算图可以解释为什么按这种方式进行组织。

如果想理解计算图中求导数的方法,则要理解一个变量变化后如何造成依赖它的变量发生变化。如果 A 直接影响 C ,那么就需要了解 A 是如何影响 C 的。如果对 A 的值做微小的改变, C 会如何改变?这就是 C A 求偏导数。

图 1-17 演示了反向传播的计算图求导数的过程。

在图1-17所示的计算图中,有 a b c 这3个输入参数,其输出结果为 Y 。在计算图的相关位置标记了相邻节点数据计算偏导数的结果,具体说明如下。

d = a + b ,当 a 增加一个很小的数值(例如0.001)时, d 也会增加同样的数值(0.001),因此 d a 的偏导数∂ d /∂ a =1。

② 同理, d b 的偏导数∂ d /∂ b =1。

e = b c ,当 b 增加一个很小的数值(例如0.001)时, e 也会增加同样的数值(0.001),因此 e a 的偏导数∂ e /∂ b =1。

图1-17 反向传播的计算图求导数的过程

e = b c ,当 c 增加一个很小的数值(例如0.001)时, e 会减少同样的数值(增加−0.001),因此 e c 的偏导数∂ e /∂ c =−1。

Y = d × e ,当 d 增加一个很小的数值(例如 0.001)时, Y 会增加该数值的 e 倍( e ×0.001),因此 Y d 的偏导数∂ Y /∂ d = e

⑥ 同理, Y e 的偏导数∂ Y /∂ e = d

我们可以按照以下方法计算最终的输出结果 Y 对输入参数 a b c 的偏导数。

Y a 的偏导数∂ Y /∂ a =∂ Y /∂ d ×∂ d /∂ a = e × 1 = e

Y b 的偏导数∂ Y /∂ b =∂ Y /∂ d ×∂ d /∂ b = e × 1 = e

Y c 的偏导数∂ Y /∂ c =∂ Y /∂ e ×∂ e /∂ c = d × (−1) = − d

因此计算图能使通过反向传播来求偏导数很容易得到结果。

3.静态图

在 1.3.1 小节中介绍了静态图和动态图在开源深度学习框架中的应用。静态图和动态图是计算图的两种类型。

静态图包含以下2个阶段。

① 阶段1:为模型的体系结构制定方案。

② 阶段2:训练模型并生成预测,为模型提供大量数据。

静态图的优点是可以提供强大的离线图优化和调度。因此,静态图比动态图运行得快。静态图的缺点是处理结构化数据及可变大小的数据时效果不好,而且需要先构建模型的结构才能执行计算,操作比较烦琐。

4.动态图

当执行前向计算时会默认定义动态图。动态图的构建和计算同时发生,这种机制可以实时得到中间结果,使调试更容易。动态图对于编程实现更加友好。但是由于每次执行时都会构建计算图,因此执行的效率较低。

5.MindSpore的执行模式

MindSpore 提供了动态图和静态图统一的编码方式,增加了静态图和动态图的可兼容性,用户无须开发多套代码,只要变更一行代码便可切换动态图/静态图模式,用户可在开发时选择静态图模式,这样便于开发调试;在运行时再切换至动态图模式,这样可以获得更好的性能体验。 xO2tnTES6QUdAiOG2KAoH0OjRE8Szzvig7U0PWAW/OeJzBTm62VSKUcYoSAzq71D

点击中间区域
呼出菜单
上一章
目录
下一章
×