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 稳定性 | 已被弃用 | 官方推荐 |
| 后台优化 | 需要手动配置 | 自动完成 |
注意:
SFTConfig是trl库中推荐的配置类,它继承自 Transformers 的TrainingArguments,并针对 SFT 场景进行了优化。
补充说明
为什么推荐使用 trl?
- 标准化:
trl是 Hugging Face 官方维护的训练库,API 更加稳定和标准化 - 兼容性:直接使用
trl可以确保与其他 Hugging Face 生态系统的工具无缝集成 - 维护性: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)