您的当前位置: 网站首页 技术文章 Python报错ModuleNotFoundError: No module named 'unsloth.trainers'?一文教你正确导入SFTTrainer的方法

Python报错ModuleNotFoundError: No module named 'unsloth.trainers'?一文教你正确导入SFTTrainer的方法

使用Unsloth微调LLM时遇到"ModuleNotFoundError: No module named 'unsloth.trainers'"报错?原因竟是框架API已更新!现在需直接从trl库导入SFTTrainer。本文提供完整解决方案和代码示例,帮你快速修复问题。
Python报错ModuleNotFoundError: No module named 'unsloth.trainers'?一文教你正确导入SFTTrainer的方法

Python报错ModuleNotFoundError: No module named 'unsloth.trainers'?一文教你正确导入SFTTrainer的方法

引言

在使用 Unsloth 框架进行大语言模型微调时,许多开发者会遇到一个常见的导入错误:

ModuleNotFoundError: No module named 'unsloth.trainers'

这个错误通常出现在尝试运行微调代码时,让人感到困惑。本文将详细分析这个错误的成因,并提供正确的解决方案。

问题原因分析

这个错误的根本原因在于 Unsloth 框架的 API 已经发生了重大更新。在新版本中,Unsloth 团队调整了模块的组织结构,不再将 SFTTrainer 放在 unsloth.trainers 子模块中,而是推荐直接从 trl 库导入。

这种变化背后的原因是:Unsloth 在后台自动完成了优化和补丁工作,因此开发者可以直接使用标准库进行训练,无需通过 Unsloth 特定的导入路径。

错误代码示例

如果你在代码中使用了以下导入语句,就会遇到这个错误:

import torch
from unsloth import FastLanguageModel
from unsloth.trainers import SFTTrainer  # ❌ 这是旧版本的写法
from transformers import TrainingArguments, DataCollatorForSeq2Seq
from datasets import load_dataset
import os

运行上述代码时,Python 解释器会抛出 ModuleNotFoundError: No module named 'unsloth.trainers' 异常。

正确的导入方式

根据 Unsloth 官方文档 的最新推荐,正确的导入方式应该是直接从 trl 库引入:

import torch
from unsloth import FastLanguageModel
from trl import SFTTrainer, SFTConfig  # ✅ 正确的导入方式
from datasets import load_dataset
import os

完整示例代码

下面是一个使用正确导入方式的完整微调训练示例:

import torch
from unsloth import FastLanguageModel
from trl import SFTTrainer, SFTConfig  # 从 trl 导入
from datasets import load_dataset
import os

# 禁用 TensorFlow 警告
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"

# 1. 加载预训练模型
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/Llama-3.2-1B-Instruct",
    max_seq_length = 2048,
    dtype = None,
    load_in_4bit = True,
)

# 2. 添加 LoRA 适配器
model = FastLanguageModel.get_peft_model(
    model,
    r = 16,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", 
                      "gate_proj", "up_proj", "down_proj"],
    lora_alpha = 16,
    lora_dropout = 0,
    bias = "none",
    task_type = "CAUSAL_LM",
)

# 3. 准备数据集
dataset = load_dataset("abisee/cnn_dailymail", "3.0.0", split="train[:1%]")

# 4. 配置训练参数
training_args = SFTConfig(
    output_dir = "./results",
    num_train_epochs = 1,
    per_device_train_batch_size = 2,
    gradient_accumulation_steps = 4,
    warmup_steps = 5,
    learning_rate = 2e-4,
    logging_steps = 1,
    optim = "adamw_8bit",
    weight_decay = 0.01,
    lr_scheduler_type = "linear",
    seed = 3407,
    report_to = "none",
)

# 5. 初始化训练器并开始训练
trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = dataset,
    args = training_args,
)

trainer.train()

关键变化对比

| 方面 | 旧版本写法 | 新版本写法 | |------|-----------|-----------| | 导入来源 | unsloth.trainers | trl | | 配置类 | TrainingArguments | SFTConfig | | API 稳定性 | 已被弃用 | 官方推荐 | | 后台优化 | 需要手动配置 | 自动完成 |

注意SFTConfigtrl 库中推荐的配置类,它继承自 Transformers 的 TrainingArguments,并针对 SFT 场景进行了优化。

补充说明

为什么推荐使用 trl?

  1. 标准化trl 是 Hugging Face 官方维护的训练库,API 更加稳定和标准化
  2. 兼容性:直接使用 trl 可以确保与其他 Hugging Face 生态系统的工具无缝集成
  3. 维护性:Unsloth 在后台自动应用优化补丁,无需手动管理底层实现

如果仍想使用旧写法

如果你由于某些原因需要使用旧版本的导入方式,可以考虑:

  • 检查是否安装了旧版本的 Unsloth:pip install unsloth==特定版本
  • 但请注意,旧版本可能存在已知的 bug 且不再获得更新支持

强烈建议使用新版本的导入方式,以确保获得最佳的性能和安全保障。

总结

遇到 ModuleNotFoundError: No module named 'unsloth.trainers' 错误时,不要慌张。这是 Unsloth 框架 API 正常演进的结果。只需要将导入语句从:

from unsloth.trainers import SFTTrainer

改为:

from trl import SFTTrainer, SFTConfig

即可解决问题。Unsloth 会在后台自动完成所有必要的优化工作,让你可以专注于模型微调的核心逻辑。

评论 (0)

加载中...