pytorch之前的库都是静态定义计算图的,pytorch和N3LDG都是是动态定义计算图,本库实现了动态计算图和自动批量化
自然语言处理构建适用所有实例的计算图难处:
- 各实例的长度不一样
- 实例包含结构化信息,比如句法结构(词语组成句子的结构)
1. 相关工作
GPU加速:高效的分配显存。比如创建3个显存块,一个前向传播使用,一个反向传播,最后一个用于存储参数和相关梯度。通过显存池动态分配。
2.计算图
2.1 计算图的引入
-
实现计算图需要定义Node类作为计算图节点
-
前向传播Node类包括:
-
前向传播计算方法
-
本节点向量
-
各输入向量(不含输入向量的是初始节点)
-
参数
- 反向传播Node类包括:
-
反向传播计算方法
-
损失函数L对y的导数
-
L对各输入向量的导数
-
- 反向传播Node类包括:
-
2.2自动批量化
-
共享参数的同类型计算y = wx+b
-
不含参数矩阵的同类型计算y=tanh(x)
-
优先执行平均深度更小的过程
3 CPU计算
- CPU实现高效计算:
- 1.把各节点的输入向量组成矩阵
- 2.执行矩阵运算
- 3.将矩阵运算的结果拆分后赋值给各节点。
4 GPU计算:并行能力
- cuBLAS是英伟达的CUDA线性代数计算库,并需要编写核函数实现。但N3LDG是不依赖cuDNN
- GPU两类操作存在性能瓶颈:
-
1.显存的分类和释放
-
2.显存和内存直接的IO
-
由于动态构建计算图时,各向量地址的动态变化
-
-
优化:
-
1.针对显存的分配和释放:由于实验过程中显存的分配和释放占用了总训练大量的时间。所以通过显存池进行管理,只有显存池不够时才去申请新模块
-
2.将需要传输到显存的同样大小数据,先在内存中连续存放,再调用一次库函数传至显存。
-
5 实验
- 1、在单线程cpu上N3LDG和PyTorch进行对比,不同的MB,N3LDG性能都大幅度领先
-
2、在GPU上N3LDG对比了PyTorch CUDA 和 PyTorch cuDNN,N3LDG在CNN和Tree-LSTM上面性能更优,在Bi-LSTM上当MB较大时性能更优。(不使用 cuDNN 的PyTorch(称之为 PyTorch CUDA)以及使用 cuDNN的 PyTorch(PyTorch cuDNN))
- 3、测试了做自动批量化与否时各训练阶段时长,批量化后时间大大缩减
-
4、测试单线程 CPU 矩阵乘法的总执行时间、执行次数和平均执行时间,自动批量化后用时更短
- 5、 针对是否最batch,测试CUDA 核函数的总执行时间、执行次数和平均执行时间
6 结论
在NLP领域,移除手动批量化过程,提出了轻量级nlp库N3LDG。
在CPU上CNN、Bi-LSTM、Tree-LSTM性能更优
GPU上,CNN、Tree-LSTM性能更优