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

作者在尝试对ChatGLM-6B和Baichuan-7B模型进行Lora微调时遇到NotImplementedError。首先检查了requirements的版本匹配,然后尝试在AutoModel.from_pretrained方法中添加empty_init=False参数,以及使用load_state_dict加载权重,但都未解决问题。最终,通过指定CUDA_VISIBLE_DEVICES为多卡运行解决了问题,同时发现单卡运行在足够显存的情况下也可运行成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.引言

二.解决方案尝试

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% 左右。

### 解决 Python `PermissionError` 错误 当遇到类似于 `PermissionError: [Errno 13] Permission denied` 的错误时,这通常意味着当前用户没有足够的权限来访问指定文件或目录。对于提到的 `deepseek-ai/deepseek-llm-7b-chat` 文件夹访问权限问题,可以通过调整文件夹及其子项的所有权或权限设置来解决。 #### 方法一:更改文件夹所有权 通过将目标文件夹的所有者更改为当前用户,可以有效避免频繁输入密码的情况。具体操作如下: ```bash sudo chown -R $USER:$USER ~/path/to/deepseek-ai/deepseek-llm-7b-chat ``` 这条命令将会把 `/path/to/deepseek-ai/deepseek-llm-7b-chat` 下所有的文件和子文件夹的所有权都转移给当前登录用户[^1]。 #### 方法二:修改文件夹读写权限 如果不想改变文件夹的所有权,则可以选择适当放宽该文件夹的访问权限。注意这样做可能会带来一定的安全风险,在生产环境中应谨慎考虑此方案: ```bash chmod -R u+rwx,g+rx,o+rx ~/path/to/deepseek-ai/deepseek-llm-7b-chat ``` 上述命令分别授予了所有者(`u`)完全控制、组成员(`g`)以及其他人(`o`)可读取并进入这些目录的权利。 #### 使用虚拟环境隔离依赖包管理 为了避免全局安装Python库带来的潜在冲突与权限问题,建议创建独立的工作区——即所谓的“虚拟环境”。这样不仅能够简化开发流程中的依赖关系处理,还能减少因权限不足而引发的各种麻烦: ```bash python3 -m venv myvenv source myvenv/bin/activate pip install --upgrade pip setuptools wheel cd ~/path/to/deepseek-ai/deepseek-llm-7b-chat pip install . ``` 激活后的虚拟环境下,默认情况下不会受到系统级路径的影响,因此也不再需要额外配置特殊权限就能顺利完成软件包的安装过程。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BIT_666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值