当前位置:   article > 正文

#01【chatglm】双GPU微调时报错“不在相同设备上”-已解决_but found at least two devices, cuda0 and cuda1

but found at least two devices, cuda0 and cuda1

​公众号每天更新5条大模型问题及解决方案

今天,在【NLP学习群】中,一位同学反馈,单卡微调时很顺利,但是双显卡微调时显示错误,他自己折腾好几天都没解决。


01 报错信息分析:

报错信息如下:

return torch.embedding(weight, input, padding_idx, scale_grad_byfreq, sparse)RuntimeError: Expected all tensors to be on the same device. but fouund at least two devices, cuda:0 andcuda:1!(when checking argument for argument index in method wrapperCUDA 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 微调训练教程

如果你还不知道该怎么微调训练模型,我系统更新了训练和微调的实战知识库,跟着一步步做,你也能把大模型的知识真正应用到实处,产生价值。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/260427
推荐阅读
相关标签
  

闽ICP备14008679号