适配 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)
  1. 核心补丁 set_submodule

    • Transformers 5.2 在调用 bitsandbytes 4bit 量化时,会调用模型的 set_submodule 方法,但 Qwen2ForCausalLM 原生未实现该方法
    • 我们通过猴子补丁(monkeypatch) 为 Qwen2ForCausalLM 手动添加 set_submodule 方法,逻辑与 PyTorch 2.4 原生实现一致
  2. 适配 Transformers 5.2 的参数变更

    • 移除废弃的 torch_dtype 参数,统一使用 dtype
    • 添加 bnb_4bit_quant_storage=torch.float32(Transformers 5.2 对 4bit 量化的必填参数)
    • 显式导入 Qwen2ForCausalLM 类,避免 AutoModel 自动加载时的类型识别问题
  3. 版本兼容优化

    • 保留 trust_remote_code=True(Qwen2 模型必须)
    • 使用 device_map="auto" 适配 PyTorch 2.4 的设备分配逻辑
    • 关闭 use_fast tokenizer(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)

补充:版本兼容注意事项

  1. Unsloth 版本适配:确保 Unsloth 版本 ≥ 2024.9,否则可能与 Transformers 5.2 冲突:
    pip install --upgrade unsloth>=2024.9 -i https://pypi.org/simple/
    
  2. Bitsandbytes 版本:建议使用 0.43.1(与 PyTorch 2.4 + Transformers 5.2 最佳兼容):
    pip install bitsandbytes==0.43.1
    

总结

  1. 核心修复:通过猴子补丁为 Qwen2ForCausalLM 补充 set_submodule 方法,解决 Transformers 5.2 调用该方法时的属性缺失问题。
  2. 版本适配:针对 Transformers 5.2 调整量化参数(新增 bnb_4bit_quant_storage),替换废弃的 torch_dtype 参数为 dtype
  3. 环境保障:确保 Unsloth ≥ 2024.9、Bitsandbytes == 0.43.1,与 PyTorch 2.4 + Transformers 5.2 形成稳定兼容组合。
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐