多 GPU 计算

  • 和单 GPU 相比,许要考虑的是各个网络层计算的交汇。
  • 目前基本了解就行,后续有需要再加深

参考:

概述

不用考虑太复杂的结构,简单理解深度学习中的并行计算就是,张量在多个计算设备上计算

  • 那么不考虑张量计算的依赖关系,可以在 cpu 和 gpu 同时计算
    • 主要看 device 在哪里
  • 一般的方法是多个 cuda 设备上计算然后使用 torch.cuda.synchronize() 不指定设备进行计算
    • 这里各个设备的计算指的是存储在对应设备上的张量计算
    • 如此我们就能把计算任务分解到多个设备上然后使用同步指令保证各个设备计算完成
      • 然后并行的跑多个神经网络(把网络不同部分放在不同设备上?或者使用多个设备跑流水线?)
        • 当然这里需要考虑反向传播需要的多个设备之间的交互怎么处理
      • 这样能够有更大的显存存储更多的张量

具体场景上的经验参考(单机多卡,多机多卡|使用服务器连接):

  • Pytorch 并行计算 稍微复杂,有兴趣和需要再研究,这里更多的是用于训练
  • 可以用 Nsight 等软件分析计算性能和过程

通信

  • 使用 .to(device,non_blocking=<True|False>) 操作能够把张量在设备中转移,但是转移是要消耗时间的,所以要考虑到通信的损失
    • non_blocking 可以不堵塞 PCIE 通信,能够 GPU 计算过程中就进行转移(已经计算好就移动,不等全部计算完)
  • 如果没有动态计算图,使用传统静态图的方法通信是非常麻烦的,计算时候要划分张量到各个设备,然后梯度要再传回合并再计算梯度下降

数据并行

每次训练中把各个批量放到多个 GPU 上进行划分(许要梯度聚合,把优化后的梯度发到各个 GPU 上)

训练步骤:(多个 GPU 都要载入模型)

  • 需要在所有设备上初始化网络参数;
  • 在数据集上迭代时,要将小批量数据分配到所有设备上;
  • 跨设备并行计算损失及其梯度;
  • 聚合梯度,并相应地更新参数。

torch:

  • 使用 nn.DataParallel 转化模型到多个设备上
  • 使用 .to(devices[0]) 把 X 和 y 汇聚到一个 gpu 上计算损失并反向传播。

/ob/%E3%80%901%E3%80%91%E5%B7%A5%E4%BD%9C%E5%8C%BA/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/%E5%AD%A6%E4%B9%A0/2024%E5%AD%A6%E4%B9%A0/D2L%20%E5%8A%A8%E6%89%8B%E5%AD%A6%E4%B9%A0%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E9%AB%98%E6%80%A7%E8%83%BD%E8%AE%A1%E7%AE%97/attachments/%E5%A4%9AGPU%E8%AE%A1%E7%AE%97%E5%AF%B9%E6%AF%94%E5%9B%BE.png
多种参数服务器配置:(参数指的是需要汇聚的参数,如梯度)
/ob/%E3%80%901%E3%80%91%E5%B7%A5%E4%BD%9C%E5%8C%BA/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/%E5%AD%A6%E4%B9%A0/2024%E5%AD%A6%E4%B9%A0/D2L%20%E5%8A%A8%E6%89%8B%E5%AD%A6%E4%B9%A0%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E9%AB%98%E6%80%A7%E8%83%BD%E8%AE%A1%E7%AE%97/attachments/%E4%B8%8D%E5%90%8C%E8%AE%BE%E5%A4%87%E5%81%9A%E5%8F%82%E6%95%B0%E6%9C%8D%E5%8A%A1%E5%99%A8.png