2023-06-21 16:16阅读: 943评论: 0推荐: 1

多卡训练

1、前言

  近期做到的一些工作涉及到多卡训练,不得不感慨深度学习真的是一个烧钱的活,顺便记录一下,主要记录用法,不涉及实现原理。


2、单机多卡并行

官方DDP文档:

GETTING STARTED WITH DISTRIBUTED DATA PARALLEL

Github 仓库:

Github 中文文档

GETTING STARTED WITH DISTRIBUTED DATA PARALLEL

DataParallel

使用 nn.Dataarallel() 将模型变换一下,一行搞定

model = nn.DataParallel(model)

根据

为方便说明,我们假设模型输入为(32, input_dim),这里的 32 表示batch_size,模型输出为(32, output_dim),使用 4 个GPU训练。nn.DataParallel起到的作用是将这 32 个样本拆成 4 份,发送给 4 个GPU 分别做 forward,然后生成 4 个大小为(8, output_dim)的输出,然后再将这 4 个输出都收集到cuda:0上并合并成(32, output_dim)。
可以看出,nn.DataParallel没有改变模型的输入输出,因此其他部分的代码不需要做任何更改,非常方便。但弊端是,后续的loss计算只会在cuda:0上进行,没法并行,因此会导致负载不均衡的问题。

针对负载不均衡问题,一个缓解的方法是将 loss 放入模型内部计算,即在 forward 的时候计算 loss。

DistributedDatarallel

   分布式数据并行方法,通过多进程实现。

1、从一开始就会启动多个进程(进程数等于GPU数),每个进程独享一个GPU,每个进程都会独立地执行代码。这意味着每个进程都独立地初始化模型、训练,当然,在每次迭代过程中会通过进程间通信共享梯度,整合梯度,然后独立地更新参数。

2、每个进程都会初始化一份训练数据集,通过DistributedSampler函数实现,即同样的模型喂进去不同的数据做训练,也就是所谓的数据并行。

3、进程通过local_rank变量来标识自己,local_rank为0的为master,其他是slave。这个变量是torch.distributed包帮我们创建的,使用方法如下:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--local_rank", type=int, default=-1)
args = parser.parse_args()

运行代码

python -m torch.distributed.launch --nproc_per_node=4 --nnodes=1 train.py

其中,nnodes 表示节点数量,单机,即为1,nproc_per_node 为每个节点的进程数量,与 GPU 数量一致。

模型保存与加载
TODO

3、遇到的问题

1、DistributedDataarallel 方法,有时候会出现进程卡死的问题,现象上即为显卡的利用率卡在 100%,未启动进程组,根据tjds排查是IO 虚拟化(也称为 VT-d 或 IOMMU)启用了ACS导致,具体原因参考 故障排除——NCCL2.16.2 文档

方法一:排查原因是BIOS里IO虚拟化(VT-d)默认启动了PCI访问控制服务(ACS)导致GPU间无法直接通过P2P方式通信,需在BIOS关闭此功能,具体操作参考 tjds

1、 查看ACS是否开启

执行 lspci -vvv | grep -I acsctl 如果有显示SrcValid+说明已启用ACS功能

2、 添加iommu=pt参数到grub(此步骤应该可以跳过)

编辑/etc/default/grub文件添加iommu=pt,再执行update-grub更新grub文件

3、 关闭BIOS里ACS功能

重启操作系统开机时按 del 进入 BIOS 关闭 ACS 功能,不关 VT-d 只关闭 ACS 功能,具体路径:Path: Advanced -> Chipset Configuration -> North Bridge -> IIO Configuration -> Intel VT for Directed I/O (VT-d) -> ACS Control -> Enable / Disable.

4、 检查ACS是否关闭

执行lspci -vvv | grep -I acsctl 如果全显示SrcValid-说明已关闭ACS功能

方法二:仍然使用 ‘nccl‘ 后端,禁用 GPU 的 P2P 通信。

torch.distributed.init_process_group(backend="nccl")
NCCL_P2P_DISABLE=1 CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 train.py

嫌麻烦可以写入 bashrc 环境变量。

方法三:更换后端为 ‘gloo’ , shell命令运行程序,纵享丝滑。

torch.distributed.init_process_group(backend="gloo")
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 train.py

缺点就是 gloo 的通信在我用的时候要比 nccl 慢很多。

2、如果训练过程中使用了 Sampler 进行数据分发, dataloader 的 shuffle 不能设置为 True。

3、dataloader 设置 batch_size 时,注意尽量保证每次循环每张卡至少可以分到一个 sample,不然有时候会因某张卡等待输入卡死。

4、我在训练时,dataloader的 num_works 通过 CPU 帮助 GPU 加载数据能够提升 GPU 利用率,倒是没遇到报错。

5、dataloader 的 pin_memory (锁页内存) 按道理是可以锁住一部分内存,减少 CPU 内存拷贝的,但是我用的时候会极大降低 GPU 利用率,此处存疑。

待更新ing

本文作者:Abyss_J

本文链接:https://www.cnblogs.com/abyss-130/p/17496547.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Abyss_J  阅读(943)  评论(0编辑  收藏  举报
  1. 1 it's 6pm but I miss u already. Audio artist
  2. 2 願い~あの頃のキミへ~ Audio artist
  3. 3 404 not found REOL
願い~あの頃のキミへ~ - Audio artist
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 童子-T

作曲 : Shingo.S/童子-T

ふたりの思い出

かき集めたなら

また泣けてきちゃう

寂しさ溢れて

最後の恋だと信じて願った

あの日々にウソはなかった

希望夢明るい未来

東京に持った大きな期待

だけど現実は甘くなくて

落ち葉見つめ深く思いつめてた

そんな時にあなたと出会って

いつもあなたに助けられて

バイトが楽しみになって

実はシフト被るように狙ってた

スタンプ使いが妙に上手くて

お化けも虫も受け付けなくて

くしゃくしゃの笑顔が可愛くて

眠れない夜は君のせいで

この気持ち今すぐに伝えたい

けどバレたくない

どうしたらいいの

迷ってるうちに

夜明けが来て

馬鹿みたいに後悔して

ふたりの想い出

かき集めたなら

また泣けてきちゃう

寂しさ溢れて

最後の恋だと信じて願った

あの日々にウソはなかった

帰り道の公園で受けた告白

ベタすぎるセリフ笑っちゃった

一生忘れられない思い出

あなたがプレゼントしてくれた

一日中ゲームやりこんで

夜ご飯は一緒に作って

贅沢なんてしなくたって

2人いればそれだけでよくて

口下手2人が本気で喧嘩

お互いブロック通じない電話

本気でぶつかり合えることが

どんな愛しいが気づけなかった

あなたが教えてくれたこと

くれたもの

胸に刻み過ごしてる今日も

だから伝えたいありがとう

ふたりの想い出

かき集めたなら

また泣けてきちゃう

寂しさ溢れて

最後の恋だと信じて願った

あの日々にウソはなかった

子供のままでいられたなら

何も怖がらず歩いて行けたかな

もっと早く大人になっていたなら

2人で乗り越えられたかな

今も君の夢夜空へ願う

今でも君は

あの頃と同じ笑顔で

今でも君は

あの頃のようにまっすぐで

今でも君は

あの頃と変わらない優しさで

今でも君は

君のままでいてほしいそう願うよ

ふたりの想い出

かき集めたなら

また泣けてきちゃう

寂しさ溢れて

最後の恋だと信じて願った

あの日々にウソはなかった

ふたりの想い出集めたら

泣き出しそうになる今夜も

寂しさ溢れて苦しくなる

最後の恋と信じ願った

あの日々に嘘はなかった

離れてもあなたの幸せ願う

ふたりの想い出集めたら

泣き出しそうになる今夜も

寂しさ溢れて苦しくなる

最後の恋と信じ願った

あの日々に嘘はなかった

離れてもあなたの幸せ願う

点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑