31 CPU与GPU
CPU是串行计算,单次计算的能力更强,但是需要从寄存器中取数据,所以如果计算次数过多,其时间会画到读取数据上面,导致CPU远远达不到最好的计算效果。(如果要提升CPU利用率,方法一是增加并行的核,方法二是提前进行缓存)
GPU是并行计算,相当于有几千个计算能力比CPU更差一些的核,这样解决了大量小计算的取数据的问题,可以同时进行上千个线程。
例子: CPU对于按行的处理更快,GPU对按列的更快
由于CPU和GPU的带宽不同,所以不要频繁在CPU和GPU之间传数据,因为会有带宽限制和同步开销。
高性能计算编程:
CPU:C++或高性能的语言(编译器较成熟)
GPU:CUDA、OpenCL(编译器较成熟)
硬件与编译器同样重要。
32 TPU及其它
DSP:数字信号处理
- 为数字信号处理算法设计:点积、卷积
- 低功耗、高性能:比移动GPU快5x,功耗更低
- 编程和调试困难(所以用的不多),编译器质量良莠不齐
FPGA:可编程阵列
- 有大量可以编程逻辑单元和可配置的连接
- 可以配置成计算复杂函数
- 通常比通用硬件更高效
- 工具链质量良莠不齐
- 一次编译需要数小时
AI ASIC
- 深度学习的热门领域
- GoogleTPU (核心就是做大矩阵乘法,systolic array,w(Y = WX)大小和阵列大小一样)
- 自己做的成本低,不然卡的利润过高
硬件越专用,越容易在专用领域上做出高端芯片。
33 单机多卡并行
多GPU并行使用,可以分为数据并行或模型并行
数据并行:把小批量分为n块,每块GPU拿到完整参数计算一块数据的梯度。这样计算效率一般更高,因为每块GPU对一个batch计算的时间都差不多,并行的同步性也比较好。
模型并行:把模型分成n块,每个GPU拿一块模型和它的前向结果。因为模型太大了就需要分割计算。
34 多GPU训练实现(编程实现)
35 分布式训练
数据放在分布式文件系统上,分多块GPU来进行训练,尽量在一个小集群里面做数据通讯,而不要做全局通讯。比如在GPU上加一层server,server为CPU和GPU之间的桥梁,防止很多无用的通讯。
同步SGD:每个worker都同步计算一个批量,n个GPU得到单GPU的n倍加速。
性能:因为每个批量的计算时间是max(计算时间,收发时间),所以只要解决收发问题,就可以保证GPU一直满负荷运算,而不是在等待。
适用情况:
- 使用一个大数据集(最好)
- 需要好的GPU-GU的带宽
- 模型的计算通讯比要号(FLOP / Model Size)
- 使用足够大的批量大小来获得好的系统性能
- 使用高效的优化算法对应批量大小