AttributeError: ‘Qwen2ForCausalLM‘ object has no attribute猴子补丁为 Qwen2ForCausalLM 补充 set_submodule 方法
·
适配 PyTorch 2.4 + Transformers 5.2 的解决方案
你提到的版本组合(PyTorch 2.4 + Transformers 5.2)是关键信息,这个版本组合下需要针对性调整代码,核心解决 set_submodule 兼容问题和 Qwen2 模型加载适配问题。
第一步:确认依赖版本(验证环境)
先执行以下命令确认版本匹配,避免版本混杂:
# 检查版本
python -c "import torch, transformers; print(f'PyTorch: {torch.__version__}'); print(f'Transformers: {transformers.__version__}')"
# 确保版本输出为:
# PyTorch: 2.4.0
# Transformers: 5.2.0
第二步:适配版本的完整代码
以下是针对 PyTorch 2.4 + Transformers 5.2 优化的代码,重点修复 Qwen2 模型加载的 set_submodule 问题:
import os
import torch
import logging
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
Qwen2ForCausalLM # 显式导入Qwen2模型类
)
from unsloth import FastLanguageModel
import warnings
warnings.filterwarnings("ignore")
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# 修复Transformers 5.2中Qwen2的set_submodule兼容问题
def monkeypatch_qwen2_set_submodule():
"""为Qwen2ForCausalLM添加缺失的set_submodule方法(适配PyTorch 2.4+)"""
if not hasattr(Qwen2ForCausalLM, 'set_submodule'):
def set_submodule(self, module_name, value):
# 拆分模块名(如 'model.layers.0.self_attn.q_proj')
parts = module_name.split('.')
parent = self
for part in parts[:-1]:
parent = getattr(parent, part)
# 设置最终模块
setattr(parent, parts[-1], value)
Qwen2ForCausalLM.set_submodule = set_submodule
logging.info("✅ 已为Qwen2ForCausalLM补丁set_submodule方法")
def main():
try:
# 【0/5】补丁Qwen2模型(核心修复)
monkeypatch_qwen2_set_submodule()
# 【1/5】加载本地扩充词库
logging.info("【1/5】加载本地扩充词库...")
vocab_size = 203711 # 替换为你的实际词库大小逻辑
logging.info(f"✅ 本地词库加载完成,扩充后词库大小:{vocab_size}")
# 【2/5】配置4bit量化(适配Transformers 5.2)
logging.info("【2/5】加载本地DeepSeekR1-Qwen-14B模型...")
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_quant_storage=torch.float32 # Transformers 5.2新增参数
)
# 模型路径(替换为你的实际路径)
model_path = "/path/to/your/DeepSeekR1-Qwen-14B"
# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained(
model_path,
trust_remote_code=True,
padding_side="right",
use_fast=False,
dtype=torch.bfloat16 # 替换废弃的torch_dtype
)
# 加载模型(适配Transformers 5.2 + PyTorch 2.4)
model = AutoModelForCausalLM.from_pretrained(
model_path,
quantization_config=bnb_config,
device_map="auto",
trust_remote_code=True,
dtype=torch.bfloat16, # 替换torch_dtype
low_cpu_mem_usage=True
)
logging.info("✅ Qwen2模型加载完成(适配PyTorch 2.4 + Transformers 5.2)")
# 【3/5】后续训练逻辑(示例)
logging.info("【3/5】开始模型训练...")
# 这里添加你的训练代码
except Exception as e:
logging.error(f"训练出错:{str(e)}")
raise
if __name__ == "__main__":
main()
关键修改说明(针对 PyTorch 2.4 + Transformers 5.2)
-
核心补丁
set_submodule:- Transformers 5.2 在调用 bitsandbytes 4bit 量化时,会调用模型的
set_submodule方法,但 Qwen2ForCausalLM 原生未实现该方法 - 我们通过猴子补丁(monkeypatch) 为 Qwen2ForCausalLM 手动添加
set_submodule方法,逻辑与 PyTorch 2.4 原生实现一致
- Transformers 5.2 在调用 bitsandbytes 4bit 量化时,会调用模型的
-
适配 Transformers 5.2 的参数变更:
- 移除废弃的
torch_dtype参数,统一使用dtype - 添加
bnb_4bit_quant_storage=torch.float32(Transformers 5.2 对 4bit 量化的必填参数) - 显式导入
Qwen2ForCausalLM类,避免 AutoModel 自动加载时的类型识别问题
- 移除废弃的
-
版本兼容优化:
- 保留
trust_remote_code=True(Qwen2 模型必须) - 使用
device_map="auto"适配 PyTorch 2.4 的设备分配逻辑 - 关闭
use_fasttokenizer(Qwen2 与 fast tokenizer 存在兼容性问题)
- 保留
第三步:验证修复效果
运行代码后,如果看到以下日志说明修复成功:
2026-03-16 XX:XX:XX,XXX - INFO - ✅ 已为Qwen2ForCausalLM补丁set_submodule方法
2026-03-16 XX:XX:XX,XXX - INFO - 【1/5】加载本地扩充词库...
2026-03-16 XX:XX:XX,XXX - INFO - ✅ 本地词库加载完成,扩充后词库大小:203711
2026-03-16 XX:XX:XX,XXX - INFO - 【2/5】加载本地DeepSeekR1-Qwen-14B模型...
2026-03-16 XX:XX:XX,XXX - INFO - ✅ Qwen2模型加载完成(适配PyTorch 2.4 + Transformers 5.2)
补充:版本兼容注意事项
- Unsloth 版本适配:确保 Unsloth 版本 ≥ 2024.9,否则可能与 Transformers 5.2 冲突:
pip install --upgrade unsloth>=2024.9 -i https://pypi.org/simple/ - Bitsandbytes 版本:建议使用 0.43.1(与 PyTorch 2.4 + Transformers 5.2 最佳兼容):
pip install bitsandbytes==0.43.1
总结
- 核心修复:通过猴子补丁为 Qwen2ForCausalLM 补充
set_submodule方法,解决 Transformers 5.2 调用该方法时的属性缺失问题。 - 版本适配:针对 Transformers 5.2 调整量化参数(新增
bnb_4bit_quant_storage),替换废弃的torch_dtype参数为dtype。 - 环境保障:确保 Unsloth ≥ 2024.9、Bitsandbytes == 0.43.1,与 PyTorch 2.4 + Transformers 5.2 形成稳定兼容组合。
更多推荐



所有评论(0)