Edge-Computing-Engine+CUDA加速深度学习计算图

Edge-Computing-Engine支持在NVIDIA GPU上高效运行神经网络构建和自动微分计算。

NEW

支持:

  1. 神经网络推理的前向传播
  2. 通过自动微分进行训练的反向传播
  3. 使用CUDA加速的操作以提高性能

计算图由表示各种操作的节点构建,如矩阵乘法、元素级操作和激活函数。所有操作都使用CUDA核函数实现,以便在NVIDIA GPU上并行执行。

核心函数说明

枚举类型和结构体

CUDA核函数(Kernel Functions)

辅助函数

计算图类方法

class ComputeGraph: 计算图管理类,提供以下方法:

主函数

main(): 示例程序入口点,演示如何使用计算图框架:

每个函数的详细作用

CUDA核函数详解

  1. reluForwardKernel: 对输入数据应用ReLU激活函数(max(0,x)),每个线程处理一个元素。
  2. reluBackwardKernel: 计算ReLU的梯度,当输入大于0时梯度为上游梯度,否则为0。
  3. sigmoidForwardKernel: 计算Sigmoid激活函数(1/(1+e^(-x))),每个线程处理一个元素。
  4. sigmoidBackwardKernel: 计算Sigmoid的梯度,公式为out_grad * sigmoid(x) * (1-sigmoid(x))。
  5. matmulForwardKernel: 实现矩阵乘法,每个线程负责计算结果矩阵中的一个元素。
  6. matmulBackwardAKernel: 计算矩阵乘法关于第一个输入矩阵的梯度,实现了dL/dA的计算。
  7. matmulBackwardBKernel: 计算矩阵乘法关于第二个输入矩阵的梯度,实现了dL/dB的计算。
  8. negGradKernel: 计算负梯度,用于减法操作的反向传播。
  9. mulBackwardKernel: 计算元素级乘法的梯度,对A的梯度为Bout_grad,对B的梯度为Aout_grad。
  10. divBackwardKernel: 计算元素级除法的梯度,对A的梯度为out_grad/B,对B的梯度为-A*out_grad/(B²)。

辅助函数详解

  1. addBackwardCUDA: 实现加法操作的梯度计算,由于加法的性质,输出梯度会直接传递给两个输入。
  2. subBackwardCUDA: 实现减法操作的梯度计算,第一个输入接收正梯度,第二个输入接收负梯度。
  3. mulBackwardCUDA: 封装元素级乘法的CUDA核函数调用,管理内存分配和传输。
  4. divBackwardCUDA: 封装元素级除法的CUDA核函数调用,管理内存分配和传输。
  5. matrixMatMulCPU: 在CPU上实现矩阵乘法,用于验证CUDA实现的正确性。

计算图类方法详解

  1. ~ComputeGraph(): 析构函数,负责释放所有节点占用的内存,防止内存泄漏。
  2. addInput, addAdd, addSub, addMul, addDiv, addMatMul, addReLU, addSigmoid: 这些方法用于创建不同类型的计算节点并添加到计算图中。每个方法创建一个特定类型的节点,设置其操作类型和输入节点,并将节点添加到图中。
  3. forward(): 按照拓扑排序顺序执行前向传播。对于每个节点,根据其操作类型调用相应的CUDA函数计算其值。
  4. backward(ComputeNode* outputNode): 执行反向传播。首先重置所有节点的梯度,然后从输出节点开始,按照拓扑排序的逆序计算每个节点的输入梯度。每种操作类型都有特定的反向传播逻辑。

主函数作用

main(): 演示如何使用计算图框架构建和训练简单的神经网络模型:

完整代码:

https://github.com/AllenZYJ/Edge-Computing-Engine/blob/master/cuda_mat/mat_grad.cu