pytorch使用多显卡并行加速训练模型(nn.DataParallel)
torch.nn.DataParallel是一种能够将数据分散到多张显卡上从而加快模型训练的方法。
它的原理是首先在指定的每张显卡上拷贝一份模型,然后将输入的数据分散到各张显卡上,计算梯度,回传到第一张显卡上,然后再对模型进行参数优化。
所以,第一张显卡的负载往往更高,但由于该方法集成度高,书写简便,使用仍十分广泛。
示例:
import torch import torch.nn as nn ... gpu_num = x # 可用的gpu数量 model = Model() if gpu_num == 1: # 单卡 model = model.cuda(0) else: # 多卡 device_ids = list(range(gpu_num)) model = nn.DataParallel(model, device_ids=device_ids).cuda(device=device_ids[0]) ... # 所有数据都需要先放到指定的第一张显卡上才能进行多卡训练 data = data.cuda(0) ... # train ...
***注意使用nn.DataParellel时,模型后会自动添加一个.module的属性,在save的时候会将其保存下来,所以在load该模型时需要去掉字典key中的'.module'字符串
***在使用nn.DataParellel时,由于自动添加了module模型,因此需要分块训练模型的时候,也需要将模型块名更改。
例如:
# 原optimizer定义 optimizer = optim.Adam(params=model.part.parameters(), lr=0.00001) # 使用多卡训练后 optimizer = optim.Adam(params=model.module.part.parameters(), lr=0.00001)
若想解决负载不均的问题,可以将loss计算加入模型forward中,最后取平均
例如:
def forward(self, input_data, target_data=None) output_data = get_output(input_data) if labels is not None: loss = loss_function(output_data, target_data) return loss else: return output_data
如遇到报错 userwarning: was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector. warnings.warn('was asked to gather along dimension 0
可在loss_function的定义时加上reduction='none'
如:
loss_fn = nn.CrossEntropyLoss(reduction='none')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律