计算图架构原理与算法分析
计算图架构原理与算法分析
这些节点和主题的图表,以及它们的连接方式,经常被称为计算图。
计算图的可视化,可以帮助我们了解有哪些节点,以及它们如何互相沟通。
ROS提供了一个工具,叫做rqt_graph,可以显示系统的计算图。
计算图管道-RFC
SOC硬件通常包括多个异构芯片组,例如Xilinx Ultra96板包括Mali Gpu、Ultrascale+Fpga、Arm A53和Arm R5,目前TVM解决方案可以支持异构硬件串行运行,但为了达到最佳性能,需要一种在多个异构硬件中并行运行计算图的解决方案。
#管道如何工作
#Imagination Technologies的管道工作原理
已经在Graph Runtime中实现了流水线执行。这允许TVM运行时多次推断单个网络。推理之间共享记忆。我们有一个异构平台,包含4个设备加速器(nna)、计算(nnpu)、GPU和一个CPU。TVM编译器根据这些设备的功能对网络进行分区,Graph Runtime以流水线方式执行它们。这允许并行执行网络的某些部分。由于设备的数量是已知的,我们已经使用软件线程为每个设备创建了执行队列。运行时根据输入缓冲区和设备的可用性在执行队列中推送一个节点(打包函数)。
计算图的简介
计算图Computational Graph,被定义为有向图,其中节点对应于数学运算。 计算图是表达和评估数学表达式的一种方式。是一种描述方程的“语言”。既然是图,则有节点(变量),边(操作(简单函数))
反向传播通过使用计算图形在Tensorflow,Torch,Theano等深度学习框架中实现。 更为重要的是,理解计算图上的反向传播结合了几种不同的算法及其变体,如通过时间反向传播和共享权重反向传播。一切转换成计算图,它们仍然是相同的算法 - 只是在计算图上反向传播。
其中,TensorFlow是一个通过计算图的形式来表述计算的编程系统。基于TensorFlow这个编程系统中的每一个计算都是计算图上的一个节点,而节点与节点之间的连线则代表计算之间的依赖关系。
(1)、计算图,可以直观地把握计算过程。
(2)、计算图的节点是由局部计算构成的。局部计算构成全局计算。
(3)、在神经网络算法中,计算图的正向传播进行一般的计算。通过计算图的反向传播,可以计算各个节点的导数。
CG的优点:
优点1:局部计算。无论全局是多么复杂的计算,都可以通过局部计算使各个节点致力于简单的计算,从而简化问题。
优点2:利用计算图可以将中间的计算结果全部保存起来(比如,计算进行到2 个苹果时的金额是200 日元、加上消费税之前的金额650 日元等)。但是只有这些理由可能还无法令人信服。
优点3:实际上,使用计算图最大的原因是,可以通过反向传播高效计算导数。
CG应用:
1、利用计算图来理解神经网络的反向传播思路。
假设我们想知道苹果价格的上涨会在多大程度上影响最终的支付金额,即求“支付金额关于苹果的价格的导数”。设苹果的价格为x,支付金额为L,则相当于求dL/dx。这个导数的值表示当苹果的价格稍微上涨时,支付金额会增加多少。
“支付金额关于苹果的价格的导数”的值可以通过计算图的反向传播求出来。可以通过计算图的反向传播求导数。
可知,计算图的优点是,可以通过正向传播和反向传播高效地计算各个变量的导数值。传递这个局部导数的原理,是基于链式法则(chain rule)。
DL:深度学习神经网络算法中的相关概念(链式法则等)简介、使用之详细攻略
2、计算图的反向传播:沿着与正方向相反的方向,乘上局部导数。
如图所示,反向传播的计算顺序是,将信号E乘以节点的局部导数dy/dx,然后将结果传递给下一个节点。这里所说的局部导数是指正向传播中y = f(x) 的导数,也就是y 关于x的导数dy/dx。比如,假设y = f(x) = x^2,则局部导数为= 2x。把这个局部导数乘以上游传过来的值(即E),然后传递给前面的节点。
计算图的入门
0、基本思路
(1). 构建计算图。
(2). 在计算图上,从左向右进行计算。正向传播是从计算图出发点到结束点的传播。既然有正向传播这个名称,当然也可以考虑反向(从图上看的话,就是从右向左)的传播。实际上,这种传播称为反向传播(backward propagation)。反向传
播将在导数计算中发挥重要作用。
1、将数学公式 g = ( x + y ) ∗ z 转为计算图理解
2、太郎在超市买了2 个100 日元一个的苹果,消费税是10%,请计算支付金额。[1]
3、太郎在超市买了2 个苹果、3 个橘子。其中,苹果每个100 日元,橘子每个150 日元。消费税是10%,请计算支付金额。
CG与局部计算
计算图的特征是可以通过传递“局部计算”获得最终结果。“局部”这个词的意思是“与自己相关的某个小范围”。局部计算是指,无论全局发生了什么,都能只根据与自己相关的信息输出接下来的结果。
计算图可以集中精力于局部计算。无论全局的计算有多么复杂,各个步骤所要做的就是对象节点的局部计算。虽然局部计算非常简单,但是通过传递它的计算结果,可以获得全局的复杂计算的结果。
1、在超市买了2 个苹果和其他很多东西。
计算图的使用
0、使用TensorFlow的过程中,通常需要定义两个阶段
阶段1:定义计算图中所有的计算
阶段2:执行计算
定义计算阶段的Demo:下边的代码中,TensorFlow会自动将定义的计算a和b转化为计算图中的节点。在TensorFlow中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图。除了使用默认的计算图,TensorFlow支持通过tf.Graph函数来生成新的计算图。
import tensorflow as tf
a = tf.constant([1.0,2.0], name='a')
b = tf.constant([3.0,4.0], name='b')
result = a + b
1、backpropagation 算法用CG理解
pytorch compute graph 计算图 例子
例1
从例1、2中可以发现 使用
y =torch.tensor(x * x, requires_grad=True)
1
跟使用
y =x*x
1
效果不一样
x = torch.tensor(0.3, requires_grad=True)
print(x)
y =torch.tensor(x * x, requires_grad=True)
print(y)
z = 2 * y
print(z)
z.backward()
print('x grad: ',x.grad)
print('y grad: ',y.grad)
输出1
tensor(0.3000, requires_grad=True)
tensor(0.0900, requires_grad=True)
tensor(0.1800, grad_fn=<MulBackward0>)
x grad: None
y grad: tensor(2.)
例2
x = torch.tensor(0.3, requires_grad=True)
print(x)
y =x * x
print(y)
z = 2 * y
print(z)
z.backward()
print('x grad: ',x.grad)
print('y grad: ',y.grad)
输出2
tensor(0.3000, requires_grad=True)
tensor(0.0900, grad_fn=<MulBackward0>)
tensor(0.1800, grad_fn=<MulBackward0>)
x grad: tensor(1.2000)
y grad: None