paddle原理
memory模块
主要负责内存的分配和回收,直接供外部使用的是malloc和memcpy,其中malloc主要调用了buddy_allocator,buddy_allocator调用了system_allocator,其中system_allocator直接实现了cpu和gpu的内存分配,buddy_allocator在此基础上增加了缓存,实现了内存的重复利用。
framework模块
这个模块包含的功能比较多,最重要的是excutor,一个系统运行器,负责将一个programdesc直接运行起来,excutor本身是一个抽象类,主要的实现形式有直接运行,programdesc主要包含的blockdesc,blockdesc就是一系列opreator,另外一个并行方式,主要将programdesc转换为一个graph,graph中节点是node,node之间存在依赖,graph本身是一个有向无环图,所以每次可以取n个已经不存在依赖的节点并行运行。还有就是定义了tensor和lodtensor,lodtensor就是在tensor的基础上增加了一个lod字段,lod本身就是int的vector。此外scop和variable也都是在此模块中定义的,variable也存在desc定义。scop就是保存局部变量的。
tensor的数据结构,数据是一整块内存,有多种排列格式,包括NCHW和NHWC区别
1、NCHW其实代表的是[W H C N], 第一个元素是000,第二个元素是沿着w方向的,即001,这样下去002 003,再接着呢就是沿着H方向,即004 005 006 007…这样到019后,沿C方向,轮到了020,之后021 022 …一直到319,然后再沿N方向。
2、NHWC代表的是[C W H N], 第一个元素是000,第二个沿C方向,即020,040, 060…一直到300,之后沿W方向,001 021 041 061…301…到了303后,沿H方向,即004 024 …304.。最后到了319,变成N方向,320,340…
inference模块,定义了预测要用的类,io模块定义了load方法,用于从文件中加载programDesc。PaddlePredictor预测类基类,input是paddleTensor。api_impl文件中定义了默认的实现,通过io加载programdesc,然后执行excutor的run方法。tensorrt模块定义了tensorrt的预测实现,通过调用tensorrt来实现,convert子模块通过将op转化为tensorrt的layer。AnalysisPredictor是加入了优化分析的预测器。
paddle深度学习框架operator,又一个withKernel的基类,此类提供了数据转化的的实现,同时注册了kernel的类型,opreator根据类型做具体调用,对于一些无参的神经神经元的处理方式包含了前向类型和后向类型,前向是直接计算,后向是根据梯度将值传递会上一层,对于有参的神经元则只实现了前向而没有实现后向,后向交由优化器来完成,如梯度下降优化器。所以对于一个完整的神经网络,如一个简单的线性回归,首先计算每个全连接层的值,然后到达最后一层就是损失函数,因为这里都是已知值所以可以求出X,Y等变量的偏导数也就是梯度,然后执行反向传播,对于全连接层方向传播就是执行优化器,即参数更新。而对于无参神经元如,concat,如果一开始输入是[[1,2]]输出是[[1],[2]],则反向传播时就是将输入输出反过来而已。而对于激活神经元则比较麻烦,因为变量参与了计算,所以反向时也必须求导然后再反向,以ReciprocalFunctor为例,前向是 y=1/x,反向时, dx = dy/x*x.