赞
踩
目录
2.AutoModel.from_pretrained 方法增加参数
使用 ChatGLM-6B、Baichuan-7B 进行模型 Lora 微调时,报错 NotImplementedError: Cannot copy out of meta tensor; no data!

遂开始尝试修复之旅。
显卡: Tesla V100 32G x 1
本着出问题先找自身原因,不行再找广大群众求助的态度,下面罗列下不同的解决方法。
- # 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!
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 直接显示没有该参数。
这个是 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% 左右。


Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。