目录
2.AutoModel.from_pretrained 方法增加参数
一.引言
使用 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% 左右。