赞
踩
公众号每天更新5条大模型问题及解决方案
今天,在【NLP学习群】中,一位同学反馈,单卡微调时很顺利,但是双显卡微调时显示错误,他自己折腾好几天都没解决。
01 报错信息分析:
报错信息如下:
return torch.embedding(weight, input, padding_idx, scale_grad_by
freq, sparse)
RuntimeError: Expected all tensors to be on the same device. but fou
und at least two devices, cuda:0 and
cuda:1!(when checking argument for argument index in method wrapper
CUDA index_select)
报错分析:
这个报错信息表明在你的代码中涉及到了至少两个不同的CUDA设备,其中一个在cuda:0
上,另一个在cuda:1
上。在PyTorch中,所有涉及的张量必须在同一个设备上,否则会出现这个错误。
出现这种情况的原因可能是你的代码中有多个地方,如张量创建、张量运算等,写训练代码没有正确指定设备导致的。
为了解决这个问题,你需要确保在所有操作中使用相同的设备。
02 解决方案
a 配置CUDA 库
需要配置它们以支持双卡训练。可以使用以下命令配置 CUDA 库:
export CUDA_VISIBLE_DEVICES=0,1
b 配置PyTorch
你需要根据PyTorch实际安装路径来配置,让他调用torchvision库
export PYTHONPATH=/path/to/pytorch/炬芯库
export PYTHONPATH=/path/to/pytorch/炬芯库/torchvision
c 写训练代码
使用 Distributed Data Parallel(DDP)实现双卡微调,使用了 dist.all_reduce() 函数来实现跨 GPU 同步梯度。这将确保每个 GPU 上的模型参数都得到更新。
import torch
import torch.nn as nn
import torch.distributed as dist
# 设置可见的 GPU 设备
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1" # 设置为您想要使用的 GPU 编号,多个 GPU 之间用逗号隔开
# 创建模型和损失函数
model = nn.DataParallel(torch.nn.Linear(10, 1)) # 使用 DataParallel 包装模型
loss_fn = torch.nn.MSELoss()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
loss_fn = loss_fn.to(device)
# 初始化分布式数据并设置器
cluster_def = dist.cluster.ClusterDef()
cluster_def.parse_from_env()
dist.init_cluster(cluster_def, rank=0)
# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
for inputs, targets in dataloader:
inputs, targets = inputs.to(device), targets.to(device) # 将数据移动到设备
optimizer.zero_grad()
# 使用 DDP 将模型复制到各个 GPU
model = model.module if hasattr(model, 'module') else model
models = [model(inputs) for _ in range(torch.numel(inputs))]
# 计算损失并更新梯度
losses = [loss_fn(outputs, targets) for outputs in models]
loss = torch.stack(losses).mean()
loss.backward()
# 执行梯度同步
dist.all_reduce(损失.grad, op=dist.reduce_mean)
# 更新模型参数
optimizer.step()
请注意!为了使用 DDP,您需要将模型包装在 nn.Module 中。如果您的模型已经使用了 DataParallel,那么可以直接使用 model.module。如果没有,请将 model 传递给 nn.Module 进行包装。
至此!问题解决!
因为设备、目标不同,如果你的问题还没解决,可以公众号后台回复“问答3000条”进群,有更多同学帮你,也可以点公众号里的有偿1对1!
一意AI增效家
AI领域学习伴侣、大模型训练搭档、企服AI产品安全认证、专家培训咨询、企服知识图谱、数字人搭建
公众号
目前一意AI提供的价值主要在四个方面!
#1 高质量数据集
我搭建了一个数据共享交换平台,目前已收录中文对话、金融、医疗、教育、儿童故事五个领域优质数据集,还可以通过会员之间共享,工众后台:“数据集”下载。
#2 报错或问题解决
你可能像我们NLP学习群中的同学一样,遇到各种报错或问题,我每天挑选5条比较有代表性的问题及解决方法贴出来,供大家避坑;每天更新,工众后台:“问答3000条”获清单汇总。
#3 运算加速
还有同学是几年前的老爷机/笔记本,或者希望大幅提升部署/微调模型的速度,我们应用了动态技术框架,大幅提升其运算效率(约40%),节省显存资源(最低无显卡2g内存也能提升),工众后台:“加速框架”;
#4 微调训练教程
如果你还不知道该怎么微调训练模型,我系统更新了训练和微调的实战知识库,跟着一步步做,你也能把大模型的知识真正应用到实处,产生价值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。