#01【chatglm】双GPU微调时报错“不在相同设备上”-已解决

文章讲述了在NLP学习群中遇到的双卡微调报错问题,分析了错误原因——设备不一致,提供了配置CUDA库、PyTorch和使用DistributedDataParallel的解决方案。作者强调了确保所有张量在同一设备上操作的重要性,并给出了详细的代码示例。

​公众号每天更新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 微调训练教程

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

<think>好的,用户想在AutoDL平台上对ChatGLM3-6B模型进行单机多卡微调。我需要先理解用户的问题,然后根据提供的引用信息给出步骤。 首先,用户提到的AutoDL平台,可能需要使用特定的命令和环境配置。根据引用3中的信息,单机多卡可以使用torchrun命令,设置nproc_per_node为GPU数量。例如,使用8卡的话,命令是OMP_NUM_THREADS=1 torchrun --standalone --nnodes=1 --nproc_per_node=8 finetune_hf.py ...。但用户可能需要根据实际情况调整参数。 然后,用户需要准备数据和配置文件。引用3和4提到需要配置数据路径、模型路径和配置文件(如lora.yaml)。用户需要确认这些文件的位置是否正确,特别是数据路径是否指向正确的目录。 另外,引用4提到如果显存不足,可以使用accelerate库来分割模型到多张GPU。不过用户的问题是关于微调而不是推理,所以可能需要检查代码中是否已经支持多卡训练,或者是否需要修改模型加载方式。比如使用load_model_on_gpus函数,但需要确认该函数是否适用于微调场景。 还要注意环境依赖,比如安装accelerate库(pip install accelerate),这可能需要在训练脚本中正确初始化分布式训练。同,确保所有GPU都能被正确识别,可能需要设置CUDA_VISIBLE_DEVICES环境变量。 最后,用户可能需要调整学习率或批大小,以适应多卡训练。同,日志和模型保存路径也需要正确配置,避免多进程间的冲突。 总结步骤应该是:环境准备、启动命令、数据配置、参数调整。需要将这些步骤详细列出,确保用户能一步步操作。同,提醒用户注意可能遇到的坑,比如端口冲突、路径错误等。</think>在AutoDL平台上对ChatGLM3-6B进行单机多卡微调可分为以下步骤: ### 一、环境准备 1. 创建实例选择**多GPU规格**(如A100-10G*2) 2. 通过`nvidia-smi`命令确认GPU状态 3. 安装依赖库: ```bash pip install accelerate deepspeed transformers ``` ### 二、启动分布式训练 根据引用[3]提供的方案,使用torchrun启动分布式训练: ```bash OMP_NUM_THREADS=1 torchrun --standalone --nnodes=1 --nproc_per_node=2 finetune_hf.py \ data/AdvertiseGen/ \ THUDM/chatglm3-6b \ configs/lora.yaml ``` 参数说明: - `nproc_per_node=2`:使用2张GPU - `data/AdvertiseGen/`:微调数据路径 - `configs/lora.yaml`:LoRA参数配置文件 ### 三、多卡配置要点 1. **模型加载**:若遇到显存不足,参考引用[4]使用分片加载: ```python from utils import load_model_on_gpus model = load_model_on_gpus("THUDM/chatglm3-6b", num_gpus=2) ``` 2. **参数调整**: ```yaml # lora.yaml示例 device_map: "auto" fp16: true gradient_accumulation_steps: 4 per_device_train_batch_size: 2 ``` ### 四、监控与验证 1. 使用`watch -n 1 gpustat`监控GPU利用率 2. 验证多卡通信: ```bash echo $MASTER_ADDR # 应显示127.0.0.1 echo $MASTER_PORT # 默认29500 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一意AI增效家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值