华为MindSpore深度学习框架应用开发实战
上QQ阅读APP看书,第一时间看更新

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,如果AB都是常量(假定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则使用动态图作为默认的执行模式,静态计算图(静态图)作为备选项。