pytorch 多卡训练相关概念

2024-03-04 1105阅读

温馨提示:这篇文章已超过383天没有更新,请注意相关的内容是否还可用!

1、World,Rank,Local Rank

1.1 world

World可以认为是一个集合,由一组能够互相发消息的进程组成。

pytorch 多卡训练相关概念
(图片来源网络,侵删)

world size就表示这组能够互相通信的进程的总数。

1.2 rank

Rank可以认为是这组能够互相通信的进程在World中的序号。

1.3 local rank

Local Rank可以认为是这组能够互相通信的进程在它们相应主机(Host)中的序号。

不准确但较容易理解的:

  • world,所有能够通信的 gpu 集合。一般多卡所有卡都是可以通信的,因此可以简单理解为所有 GPU 的集合
  • world size,可以简单理解为所有 GPU 的数目
  • rank,gpu 在所有 gpu 中的序号
  • local rank,gpu 单所在主机中的 gpu 里面的序号

    2 模型并行与数据并行

    • 模型并行(model parellelism):如果模型特别大,GPU显存不够,无法将一个显存放在GPU上,需要把网络的不同模块放在不同GPU上,这样可以训练比较大的网络。
    • 数据并行(data parellelism):将整个模型放在一块GPU里,再复制到每一块GPU上,同时进行正向传播和反向误差传播。相当于加大了batch_size。

      3 BN 在不同设备之间的同步

      假设batch_size=2,每个GPU计算的均值和方差都针对这两个样本而言的。而BN的特性是:batch_size越大,均值和方差越接近与整个数据集的均值和方差,效果越好。

      使用多块GPU时,会计算每个BN层在所有设备上输入的均值和方差。如果GPU1和GPU2都分别得到两个特征层,那么两块GPU一共计算4个特征层的均值和方差,可以认为batch_size=4。注意:如果不用同步BN,而是每个设备计算自己的批次数据的均值方差,效果与单GPU一致,仅仅能提升训练速度;如果使用同步BN,效果会有一定提升,但是会损失一部分并行速度。

      4 混合精度

      在混合精度训练上,Apex 的封装十分优雅。直接使用 amp.initialize 包装模型和优化器,apex 就会自动帮助我们管理模型参数和优化器的精度了,根据精度需求不同可以传入其他配置参数。

      from apex import amp
      model, optimizer = amp.initialize(model, optimizer, opt_level='O1')
      

      其中 opt_level 为精度的优化设置:

      • O0:纯FP32训练,可以作为accuracy的baseline;
      • O1:混合精度训练(推荐使用),根据黑白名单自动决定使用FP16(GEMM, 卷积)还是FP32(Softmax)进行计算。
      • O2:“几乎FP16”混合精度训练,不存在黑白名单,除了Batch norm,几乎都是用FP16计算。
      • O3:纯FP16训练,很不稳定,但是可以作为speed的baseline;

        4 记录Loss曲线

        在我们使用多进程时,每个进程有自己计算得到的Loss,我们在进行数据记录时,希望对不同进程上的Loss取平均(也就是 map-reduce 的做法),对于其他需要记录的数据也都是一样的做法:

        def reduce_tensor(tensor: torch.Tensor) -> torch.Tensor:
            rt = tensor.clone()
            distributed.all_reduce(rt, op=distributed.reduce_op.SUM)
            rt /= distributed.get_world_size()
            return rt
        # calculate loss
        loss = criterion(predict, labels)
        reduced_loss = reduce_tensor(loss.data)
        train_epoch_loss += reduced_loss.item()
        注意在写入TensorBoard的时候只让一个进程写入就够了:
        # TensorBoard
        if args.local_rank == 0:
            writer.add_scalars('Loss/training', {
                'train_loss': train_epoch_loss,
                'val_loss': val_epoch_loss
            }, epoch + 1)
        
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]