LLM - Baichuan / ChatGLM Lora 异常:NotImplementedError: Cannot copy out of meta tensor; no data!

目录

一.引言

二.解决方案尝试

1.requirements 不匹配

2.AutoModel.from_pretrained 方法增加参数

3.load_state_dict 加载参数

三.解决方案


一.引言

使用 ChatGLM-6B、Baichuan-7B 进行模型 Lora 微调时,报错 NotImplementedError: Cannot copy out of meta tensor; no data!

遂开始尝试修复之旅。

显卡: Tesla V100 32G x 1

二.解决方案尝试

本着出问题先找自身原因,不行再找广大群众求助的态度,下面罗列下不同的解决方法。

1.requirements 不匹配

# chatglm
protobuf>=3.19.5,<3.20.1     protobuf==4.23.3 ❌
transformers==4.27.1         transformers==4.29.1
torch>=1.13.1       		 torch==2.0.1
tensorboard      			 tensorboard==2.13.0

和源代码提供的 requirements 和自己的 requirements 比对后,发现 protobuf 不满足版本要求,于是降版本尝试:

pip install protobuf==3.19.5

可以通过下述 pip 命令获取自己的全部版本依赖:

pip freeze > requriments.txt

测试:

测试后依旧报错 NotImplementedError: Cannot copy out of meta tensor; no data!

2.AutoModel.from_pretrained 方法增加参数

model = AutoModel.from_pretrained(xxx)

加载预训练模型时增加 empty_init=False 参数:

model = AutoModel.from_pretrained(xxx, empty_init=False)

解释:

按照原博的解释,这个错误通常是由于 Deepspeed 在使用自定义权重初始化时出现问题,而这些初始化可能需要从先前的训练中加载权重。如果在使用 Deepspeed 进行分布式训练时出现此错误,则需要在初始化模型时指定`empty_init=False`,以便在加载权重之前,权重矩阵不会被初始化为空。

AutoModel.from_pretrained 是 Hugging Face Transformers 库中的一个方法,用于从预训练模型中加载权重。在 Deepspeed 分布式训练中,模型的初始化和权重加载可能需要特殊处理,因此需要使用 `empty_init=False` 参数来指定在加载权重之前不要将权重矩阵初始化为空。

测试:

ChatGLM-6B Lora 添加该参数:

 Baichuan-7B Lora 添加该参数:

ChatGLM-6B 添加参数报了新的错误,Baichuan-7B 直接显示没有该参数。

3.load_state_dict 加载参数

这个是 Github 网友的解决方案,其原代码为:

peft_config = LoraConfig(task_type=TaskType.CAUSAL_LM, 
inference_mode=True,
r=8,
lora_alpha=32, 
lora_dropout=0.1)

model = get_peft_model(model, peft_config)

通过增加下述代码解决:

lora_w = torch.load(lora_weights)
model.load_state_dict(lora_w, strict=False)

大家如果与该场景匹配也可以尝试。

三.解决方案

最后的解决方案也比较简单,就是增加资源:

CUDA_VISIBLE_DEVICES=0 python baichuan_lora_tuning.py

修改为:

CUDA_VISIBLE_DEVICES=0,1 python baichuan_lora_tuning.py

不过 ChatGLM-6B 官方也提供了单卡的 demo,这里怀疑还是自己的代码哪里有问题,暂且双卡可以跑起来了,后面再试试单卡的调试。

补充:

今早试了下,单卡显存够也能跑起来了,其中 0 卡的显存变化比较明显,因为1卡已经基本满了:

GPU-Util 最高 80%+ 但是因为测试样本很少,所以基本很快就到 20% 左右。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BIT_666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值