当前位置:   article > 正文

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

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 不匹配

  1. # chatglm
  2. protobuf>=3.19.5,<3.20.1 protobuf==4.23.3 ❌
  3. transformers==4.27.1 transformers==4.29.1
  4. torch>=1.13.1 torch==2.0.1
  5. 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 网友的解决方案,其原代码为:

  1. peft_config = LoraConfig(task_type=TaskType.CAUSAL_LM,
  2. inference_mode=True,
  3. r=8,
  4. lora_alpha=32,
  5. lora_dropout=0.1)
  6. model = get_peft_model(model, peft_config)

通过增加下述代码解决:

  1. lora_w = torch.load(lora_weights)
  2. 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% 左右。

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

闽ICP备14008679号