动态图和静态图tensorflow和pytorch

343 篇文章 9 订阅

动态图和静态图的区别,可以理解为解释执行和编译执行的区别,动态图就是原生python编程习惯,而静态图其实是加了编译层,理论上编译的要比解释的快,但实际上有些任务速度区别不大,因为原生python也可以优化的很快,况且大部分算力和时间是消耗在gpu上了。
飞桨完全可以动态图编程和训练,训练结束后直接就可以自由的选择存储动态图模型还是静态图模型。存储为动态图模型方便以后的继续训练和优化,存储为静态图模型就是为了上项目和落地。
简单来说,工业应用之前,研发/竞赛/训练,最优选择都是动态图。工业落地优选静态图(落地前的工作还是动态图为主)

为使您的问题得到快速解决,在建立Issues前,请您先通过如下方式搜索是否有相似问题:【搜索issue关键字】【使用labels筛选】【官方文档】
如何选择使用静态图还是动态图?
我在别的博客上看到
Q:作为新手,我应该如何选择?使用静态图好还是动态图好?
A:目前飞桨官方在主推动态图,即命令式编程。如果您是新手,建议从动态图开始学习;如果您有一定的基础,可以尝试静态图。因为最后训练出来的模型肯定是需要部署的,目前使用用命令式编程(动态图)得到的模型文件不能很方便的部署,因此对部署有需求的话,建议使用静态图。
我想知道动态图和静态图该如何选择,二者在预测性能及精度上是否有区别,部署的话我会使用flask搭建服务来部署,可能基于CPU或GPU上进行预测

动态图和静态图
目前神经网络框架分为静态图框架和动态图框架,PyTorch 和 TensorFlow、Caffe 等框架最大的区别就是他们拥有不同的计算图表现形式。 TensorFlow 使用静态图,这意味着我们先定义计算图,然后不断使用它,而在 PyTorch 中,每次都会重新构建一个新的计算图。通过这次课程,我们会了解静态图和动态图之间的优缺点。

对于使用者来说,两种形式的计算图有着非常大的区别,同时静态图和动态图都有他们各自的优点,比如动态图比较方便debug,使用者能够用任何他们喜欢的方式进行debug,同时非常直观,而静态图是通过先定义后运行的方式,之后再次运行的时候就不再需要重新构建计算图,所以速度会比动态图更快。



下面我们比较 while 循环语句在 TensorFlow 和 PyTorch 中的定义

TensorFlow
# tensorflow
import tensorflow as tf

first_counter = tf.constant(0)
second_counter = tf.constant(10)
def cond(first_counter, second_counter, *args):
    return first_counter < second_counter

def body(first_counter, second_counter):
    first_counter = tf.add(first_counter, 2)
    second_counter = tf.add(second_counter, 1)
    return first_counter, second_counter
c1, c2 = tf.while_loop(cond, body, [first_counter, second_counter])
with tf.Session() as sess:
    counter_1_res, counter_2_res = sess.run([c1, c2])
print(counter_1_res)
print(counter_2_res)
20
20
可以看到 TensorFlow 需要将整个图构建成静态的,换句话说,每次运行的时候图都是一样的,是不能够改变的,所以不能直接使用 Python 的 while 循环语句,需要使用辅助函数 tf.while_loop 写成 TensorFlow 内部的形式

这是非常反直觉的,学习成本也是比较高的

下面我们来看看 PyTorch 的动态图机制,这使得我们能够使用 Python 的 while 写循环,非常方便

PyTorch
# pytorch
import torch
first_counter = torch.Tensor([0])
second_counter = torch.Tensor([10])
while (first_counter < second_counter)[0]:
    first_counter += 2
    second_counter += 1
print(first_counter)
print(second_counter)
 20
[torch.FloatTensor of size 1]


 20
[torch.FloatTensor of size 1]
可以看到 PyTorch 的写法跟 Python 的写法是完全一致的,没有任何额外的学习成本

上面的例子展示如何使用静态图和动态图构建 while 循环,看起来动态图的方式更加简单且直观,你觉得呢?

深度学习框架 の 动态图 vs 静态图

0.192 字数 1,431 阅读 2,681

Date: 2020/08/03

Author: CW

Foreword:

各位炼丹者应该都会有自己常用的一种或几种深度学习框架,如 MxNet、Caffe、Tensorflow、Pytorch、PaddlePaddle(百度),甚至是国产新兴框架 MegEngine(旷视)、MindSpore(华为)等,在涉及介绍这些框架的时候,都会提及动态图和静态图这样的概念,那么它们究竟是什么意思呢?在框架中又是如何体现与使用的呢?本文会结合 Tensorflow、Pytorch 以及小鲜肉 MegEngine 的例子来为诸位揭开这神秘的面纱。


计算图

不论是动态图还是静态图,它们都属于计算图。计算图是用来描述运算的有向无环图,它有两个主要元素:结点(Node)和边(Edge)。结点表示数据,如向量、矩阵、张量,而边表示运算,如加减乘除卷积等。

采用计算图来描述运算的好处不仅是让运算流的表达更加简洁清晰,还有一个更重要的原因是方便求导计算梯度

计算图

上图表示的是 y = (w + x) * (w + 1) 代表的计算图,若要计算y对w的导数,那么结合链式求导法则,就在计算图中反向从y找到所有到w的路径,每条路径上各段的导数相乘就是该路径的偏导,最后再将所有路径获得的偏导求和即可。

叶子节点是用户创建的变量,如上图的x与w,在Pytorch的实现中,为了节省内存,在梯度反向传播结束后,非叶子节点的梯度都会被释放掉。


动态图

动态图意味着计算图的构建和计算同时发生(define by run)。这种机制由于能够实时得到中间结果的值,使得调试更加容易,同时我们将大脑中的想法转化为代码方案也变得更加容易,对于编程实现来说更友好。Pytorch使用的就是动态图机制,因此它更易上手,风格更加pythonic,大受科研人员的喜爱。


静态图

静态图则意味着计算图的构建和实际计算是分开(define and run)的。在静态图中,会事先了解和定义好整个运算流,这样之后再次运行的时候就不再需要重新构建计算图了(可理解为编译),因此速度会比动态图更快,从性能上来说更加高效,但这也意味着你所期望的程序与编译器实际执行之间存在着更多的代沟,代码中的错误将难以发现,无法像动态图一样随时拿到中间计算结果。Tensorflow默认使用的是静态图机制,这也是其名称的由来,先定义好整个计算流(flow),然后再对数据(tensor)进行计算。


动态图 vs 静态图

通过一个例子来对比下动态图和静态图机制在编程实现上的差异,分别基于Pytorch和Tensorflow实现,先来看看Pytorch的动态图机制:

import torch


first_counter = torch.Tensor([0])

second_counter = torch.Tensor([10])


while (first_counter < second_counter)[0]:

    first_counter += 2

    second_counter += 1


print(first_counter)

print(second_counter)

可以看到,这与普通的Python编程无异。

再来看看在基于Tensorflow的静态图机制下是如何实现上述程序的:

import tensorflow as tf

first_counter = tf.constant(0)

second_counter = tf.constant(10)

# tensorflow

import tensorflow as tf


first_counter = tf.constant(0)

second_counter = tf.constant(10)


def cond(first_counter, second_counter, *args):

    return first_counter < second_counter


def body(first_counter, second_counter):

    first_counter = tf.add(first_counter, 2)

    second_counter = tf.add(second_counter, 1)

    return first_counter, second_counter


c1, c2 = tf.while_loop(cond, body, [first_counter, second_counter])


with tf.Session() as sess:

    counter_1_res, counter_2_res = sess.run([c1, c2])


print(counter_1_res)

print(counter_2_res)

(⊙o⊙)… 对Tensorflow不熟悉的童鞋来说,第一反应可能会是:这什么鬼!?确实,看上去会有点难受..

Tensorflow在静态图的模式下,每次运算使用的计算图都是同一个,因此不能直接使用 Python 的 while 循环语句,而是要使用其内置的辅助函数 tf.while_loop,而且还要tf.Session().run()之类的乱七八糟..

而Pytorch是动态图的模式,每次运算会构建新的计算图,在编程实现上不需要额外的学习成本(当然首先你得会Python)。


动静结合

在最近开源的框架MegEngine中,集成了两种图模式,并且可以进行相互切换,下面举例说明将动态图转换为静态图编译过程中进行的内存和计算优化

y = w*x + b 的动态计算图如下:

动态图

可以看到,中间的运算结果是被保留下来的,如p=w*x,这样就一共需要5个变量的存储空间。若切换为静态图,由于事先了解了整个计算流,因此可以让y复用p的内存空间,这样一共就只需要4个变量的存储空间。

另外,MegEngine 还使用了 算子融合 (Operator Fuse)的机制,用于减少计算开销。对于上面的动态计算图,切换为静态图后可以将乘法和加法融合为一个三元操作(假设硬件支持):乘加(如下图所示),从而降低计算量。

静态图
禁止转载,如需转载请通过简信或评论联系作者。
更多精彩内容,就在简书APP
"一击换你美好生活!"
赞赏支持 还没有人赞赏,支持一下
总资产8 (约0.50元) 共写了16.5W字 获得118个赞 共88个粉丝
关注
DL:深度学习框架Pytorch、 Tensorflow各种角度对比
pytorchTensorFlow深度学习
【摘要】 DL:深度学习框架Pytorch、 Tensorflow各种角度对比         目录 先看两个框架实现同样功能的代码 1、Pytorch、Tensorflow代码比较 2Tensorflow(数据即是代码,代码就是数据)+Pytorch(随着进展定义、更改和执行节点) 3、TensorFlow —Google—像框架+静态图+公司好手,不易调试+额外...
DL:深度学习框架Pytorch、 Tensorflow各种角度对比

目录

先看两个框架实现同样功能的代码

1、Pytorch、Tensorflow代码比较

2Tensorflow(数据即是代码,代码就是数据)+Pytorch(随着进展定义、更改和执行节点)

3、TensorFlow —Google—像框架+静态图+公司好手,不易调试+额外概念(会话、图、变量范围、占位符),序列化更强大+支持移动和嵌入式部署+大规模分布式+强大的可视化工具

4、PyTorch —FaceBook—像库+动态图+科研好手,易理解且易调试+结合NumPy更易上手,小规模项目+支持分布式执行+暂时不支持分布式训练

​​​​​​​

相关文章
DL:深度学习框架Pytorch、 Tensorflow各种角度对比
DL:深度学习框架Pytorch、 Tensorflow各种角度对比——案例代码实现

先看两个框架实现同样功能的代码
1、Pytorch、Tensorflow代码比较
DL框架之PyTorch:PyTorch的简介、安装、使用方法之详细攻略
DL框架之Tensorflow:Tensorflow的简介、安装、使用方法之详细攻略
DL:深度学习框架Pytorch、 Tensorflow各种角度对比——案例代码实现

2Tensorflow(数据即是代码,代码就是数据)+Pytorch(随着进展定义、更改和执行节点)
         两种框架都在张量上运行,把任何模型都看作一个有向非循环图(DAG),但对于如何定义它们,PyTorch 和 TensorFlow 区别很大。

在便利性和上手难度上,PyTorch 远胜于TensorFlow ,
(1)、原因是PyTorch 是基于动态图,而TensorFlow 是基于静态计算图,因此PyTorch 能随时打印tensor的值,但是TensorFlow 需要设置回调的方法才能打印.
如果想在TensorFlow 中想判断一个变量的值的正确性,只能使用assert方法,这一点确实TensorFlow 不及PyTorch ,
上手难度上PyTorch 也是比TensorFlow 容易。
         TensorFlow 遵循“数据即是代码,代码就是数据”的理念。在 TensorFlow 中,在跑模型之前会静态的定义图形。和外界的所有联系都是通过 tf.Session 对象和 tf.Placeholder,它们都是会在模型运行被外部数据取代的张量。
         在 PyTorch 中,会更动态一些:你可以随着进展定义、更改和执行节点,没有特殊的会话界面或占位符。
         整体来看,PyTorch 和 Python 结合的更紧凑些,多数时候会感觉更原生。而在 TensorFlow 里写东西时,有时你会觉得你的模型好像躲在一堵墙后面一样,就通过墙上的几个洞洞跟你交流。当然了,这也看每个人的喜好和品味。 PyTorch 更适用于研究、爱好者和小规模项目的快速原型开发。TensorFlow 更适合大规模部署,尤其是涉及跨平台和嵌入式部署时。

3、TensorFlow —Google—像框架+静态图+公司好手,不易调试+额外概念(会话、图、变量范围、占位符),序列化更强大+支持移动和嵌入式部署+大规模分布式+强大的可视化工具
       PyTorch 开始会看起来很像一个框架。回想一下,编程框架会在特定领域为我们提供有用的抽象,用它们可以很方便的解决具体问题。而这是框架和库的的本质区别之处。

(1)、TensorFlow基于静态图:在 TensorFlow 中,图结构是静态的,也就是说图在「编译」之后再运行。需要先构建一个计算图,构建好了之后,这样一个计算图是不能够变的了,然后再传入不同的数据进去,进行计算。即固定了计算的流程,所以变得不太灵活。
    1)、如果要去改变计算的逻辑,或者随着时间变化的计算逻辑,这样的动态计算TensorFlow是实现不了的,或者是很麻烦。
(2)、TensorFlow不易调试:调试 TensorFlow 则没这么容易。它有两个选择,一是从会话中请求你想检查的变量,而是学会使用 TensorFlow 调试器(tfdbg)。
    1)、TensorFlow 则不同,你可以选择用一个叫 tfdbg 的特殊工具,它能让你在运行时评估 TensorFlow 表达式,浏览所有张量,在会话范围中操作。当然,无法用它调试 Python 代码,因此无需单独使用 pdb。
(3)、TensorFlow上手需学习额外概念—会话、图、变量范围、占位符:可以将 TensorFlow 看作是一种嵌入 Python 的编程语言。当你编写 TensorFlow 代码时,它会被 Python编译成图(graph),然后由 TensorFlow 执行引擎运行。
    1)、所以,TensorFlow 还有一些需要额外学习的概念,比如会话(session)、图、变量范围、占位符。要让基本的模型跑起来也需要更多样板代码。上手 TensorFlow 的时间肯定会比 PyTorch 长。

(4)、TensorFlow的序列化更强大:TensorFlow 的 Saver 对象也很容易使用,而且也为检查点提供了更多选择。TensorFlow 在序列化方面的主要优势是整个计算图都可以保存为 protocol buffer。这既包括参数,也包括运算。然后这个图可以用其它支持的语言(C++、Java)加载。对于不支持 Python 的部署环境来说,这是非常重要的功能。而且理论上,这个功能也可以在你修改模型的源代码,但又想运行旧模型时为你提供帮助。

(5)、TensorFlow 支持移动和嵌入式部署:但是在 TensorFlow 上,要将模型部署到安卓或 iOS 上需要不小的工作量,但至少你不必使用 Java 或 C++ 重写你模型的整个推理部分。
   1)、对于高性能服务器上的部署,还有 TensorFlow Serving 可用。除了性能方面的优势,TensorFlow Serving 的另一个重要特性是无需中断服务,就能实现模型的热插拔。

(6)、TensorFlow 的数据加载 比较复杂:我还没找到 TensorFlow 的非常有用的数据加载工具(读取器、队列、队列运行器等等)。部分原因是要将你想并行运行的所有预处理代码加入到 TensorFlow 图中并不总是那么简单直接(比如计算频谱图)。另外,TensorFlow 的 API 本身也更加冗长,学习起来也更难。

(7)、TensorFlow 的设备管理默认即可:设备管理的无缝性能非常好,通常你不需要指定任何东西,因为默认的设置就很好。比如说,TensorFlow 假设如果存在可用的 GPU,你就希望在 GPU 上运行。
    1)、TensorFlow 设备管理的唯一缺陷是它会默认占用所有可用的 GPU 上的所有内存,即使真正用到的只有其中一个。但也有一种简单的解决方案,就是指定 CUDA_VISIBLE_DEVICES。有时候人们会忘记这一点,就会让 GPU 看起来很繁忙,尽管实际上它们啥也没干。

(8)、TensorFlow的强大的可视化工具TensorBoard:TensorBoard 是一个用于可视化训练机器学习模型各个方面的工具。它是 TensorFlow 项目产出的最有用的功能之一。仅需在训练脚本中加入少许代码,你就可以查看任何模型的训练曲线和验证结果。TensorBoard 作为一个网页服务运行,可以尤其方便地可视化存储在 headless 节点上的结果。
   1)、展示模型图形、绘制标量变量、可视化分布和直方图、可视化图形  播放音频

(9)、TensorFlow持支持分布式执行、支持大规模分布式训练:在GPU的分布式计算上更为出色,在数据量巨大时效率比pytorch要高一些。

4、PyTorch —FaceBook—像库+动态图+科研好手,易理解且易调试+结合NumPy更易上手,小规模项目​​​​​​​+支持分布式执行+暂时不支持分布式训练
       TensorFlow 给人的感觉更像是一个库,而非一个框架:所有的操作都为低阶操作,你需要写很多样板代码,即便你可能并不想写(比如,一遍又一遍的定义方差和权重···)。

(1)、PyTorch基于动态图:创建和运行计算图可能是这两个框架差别最大的地方。在 PyTorch 中,图结构是动态的,也就是说图是在运行时创建的。即就和python的逻辑是一样的,要对变量做任何操作都是灵活的。
(2)、PyTorch容易理解且易调试: 简单的图构建方式更容易理解,但也许更重要的是也更容易调试。调试 PyTorch 代码就跟调试 Python 代码一样。你可以使用 pdb,并且可以在任何地方设置断点。
   1)、 PyTorch 的计算图是在运行时定义,可以用 pdb,ipdb,PyCharm 这些 Python 调试工具或者以前的可靠的打印语句也行。
(3)、PyTorch结合NumPy更易上手:PyTorch 本质上是支持 GPU 的 NumPy 替代,配备了可用于构建和训练深度神经网络的更高级的功能。所以如果你熟悉 NumPy、Python 和常用的深度学习抽象(卷积层、循环层、SGD 等),那 PyTorch 就很容易学。
(4)、PyTorch序列化的API比较简单:在这两种框架中,保存和加载模型都很简单。PyTorch 有一个非常简单的 API,既可以保存模型的所有权重,也可以 pickle(加工)整个类。

(5)、PyTorch不支持移动和嵌入式部署:而包括 PyTorch 在内的很多深度学习框架都没有这个能力。

(6)、PyTorch的数据加载 API 设计得很好:数据集、采样器和数据加载器的接口都是特定的。数据加载器可以接收一个数据集和一个采样器,并根据该采样器的调度得出数据集上的一个迭代器(iterator)。并行化数据加载很简单,只需为数据加载器传递一个 num_workers 参数即可。

(7)、PyTorch 的设备管理必须指定:而在 PyTorch 中,你必须在启用了 CUDA 之后明确地将所有东西移到 GPU 上。

(8)、PyTorch 的可视化只能调用matplotlib 、seaborn​​​​​​​等库:目前 PyTorch 并没有可以和 Tensorboard 匹敌的工具,不过倒是存在一些集成功能。虽然也能用一些绘图工具比如 matplotlib 和 seaborn

(9)、PyTorch 支持支持分布式执行、暂时不支持分布式训练:
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值