单机多GPU训练模型入门指南(torch.nn.DataParallel)

目录

模型部分

1. 指定使用的GPU

2. 使用Torch的数据并行库(将模型搬到GPU上)

3. 保存模型

数据部分

1. 选择GPU

2. 将数据搬到GPU上

3. loss的反向传播修改

4. 如果需要保存loss数据

查看效果


本文将介绍模型数据两部分的处理。

模型部分

1. 指定使用的GPU

1.1 导入os库

import os

 1.2 给服务器上的GPU编号

最好一次性都编上,从0~n-1,n是服务器上的显卡的数量,一般为4or8张卡。

选择一:写在python代码中

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = '0,1,2,3'

选择二:在命令行设置

CUDA_VISIBLE_DEVICES=0,1,2,3

查看有没有设置好,使用命令行命令

echo $CUDA_VISIBLE_DEVICES

1.3 指定自己要使用哪几张卡

device_ids = [0, 1, 2, 3]

注 这个device_ids的列表要在后面作为参数传入

2. 使用Torch的数据并行库(将模型搬到GPU上)

这里要有两行代码

model = torch.nn.DataParallel(model, device_ids=device_ids)
model = model.cuda()

当然,也可以写在一起

model = torch.nn.DataParallel(model, device_ids=device_ids).cuda()

3. 保存模型

原来

model.save_pretrained(path.my_checkpoint)

现在

model.module.save_pretrained(path.my_checkpoint)

注:这里使用了huggingface的transformers库,使用torch.save应该是类似的。

数据部分

注:这里的数据都是训练函数里面的,测试函数里面的应该类似。

1. 选择GPU

device = torch.device("cuda:0")

2. 将数据搬到GPU上

data = data.to(device)

上面那句和下面这句好像是等价的

data = data.cuda()

3. loss的反向传播修改

这个地方也是我遇到的报错最多的地方。

原来

loss.backward()

改法1

loss.sum().backward()

改法2

loss.backward(torch.ones(loss.shape).to(device))

4. 如果需要保存loss数据

所有的loss都要改成

loss.mean().item()

查看效果

使用命令(每0.1秒刷新一次)

watch -n 0.1 nvidia-smi

 蓝色箭头所指是我的进程。

以上。

后记,发现下面的这个组合是可以的,将整合任务交给节点1

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"

os.environ["CUDA_VISIBLE_DEVICES"] = '1,0,2,3' #注意到0,1的顺序颠倒了

device_ids = [0, 1, 2, 3]

device = torch.device("cuda:0")

可以看出 19986*1  16772*3

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
torch.nn.parallel.DataParallelPyTorch中的一个模块,用于在单个节点上进行多GPU数据并行训练。它能够自动将输入数据划分为多个小批次,并将这些小批次分发到不同的GPU上进行计算。每个GPU上都有一个模型副本,每个副本都独立地计算损失和梯度,并将梯度聚合后进行参数更新。 然而,torch.nn.parallel.DataParallel有一些限制,例如需要在每个GPU上有足够的显存来存储模型和梯度,因为它会复制模型到每个GPU上。此外,它还要求输入数据能够被划分为多个小批次,并且每个小批次的大小是相同的。 相比之下,torch.nn.parallel.DistributedDataParallel是一个更高级的模块,可以在单节点或多节点上进行多进程的分布式训练。每个模型副本由独立的进程控制,可以在不同的机器上运行。它不需要将模型复制到每个GPU上,而是通过进程间通信来在各个进程之间共享模型参数和梯度。这样可以更好地利用多个GPU和多个机器的计算资源,提高训练速度。 值得注意的是,torch.nn.parallel.DistributedDataParallel的初始化和使用方法与torch.nn.parallel.DataParallel略有不同,需要进行一些额外的设置和配置。但是,对于单节点的多GPU数据并行训练,torch.nn.parallel.DistributedDataParallel已被证明比torch.nn.parallel.DataParallel更快。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Pytorchtorch.nn.parallel.DistributedDataParallel](https://blog.csdn.net/baidu_35120637/article/details/110816619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [torch.nn.parallel.DistributedDataParallel](https://blog.csdn.net/weixin_45216013/article/details/125472676)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSU迦叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值