使用QLoRA微调Gemma2B模型时遇TrainingArguments属性错误求助
错误解决方案:AttributeError: 'TrainingArguments' object has no attribute 'model_init_kwargs'
这个错误的核心原因是**trl库版本与transformers库不兼容**——新版本的SFTTrainer要求传入的训练配置是SFTConfig而非TrainingArguments,而旧版本的TrainingArguments并没有model_init_kwargs属性。
以下是两种可行的解决方法:
方法一:改用SFTConfig配置训练参数
SFTConfig是trl库专门为SFTTrainer设计的配置类,继承自TrainingArguments,天然兼容SFTTrainer的所有需求。
- 首先在导入库的部分添加
SFTConfig:
from trl import SFTTrainer, SFTConfig # 新增SFTConfig导入
- 将原来的
TrainingArguments替换为SFTConfig:
output_dir = "Gemma2B_finetune_QLoRA" per_device_train_batch_size = 1 per_device_eval_batch_size = 1 gradient_accumulation_steps = 8 logging_steps = 5 learning_rate = 5e-4 max_grad_norm = 1.0 max_steps = 250 num_train_epochs=10 warmup_ratio = 0.1 lr_scheduler_type = "cosine" max_seq_length = 2048 # 替换TrainingArguments为SFTConfig training_config = SFTConfig( output_dir=output_dir, per_device_train_batch_size=per_device_train_batch_size, per_device_eval_batch_size=per_device_eval_batch_size, gradient_accumulation_steps=gradient_accumulation_steps, save_strategy="no", evaluation_strategy="epoch", logging_steps=logging_steps, learning_rate=learning_rate, max_grad_norm=max_grad_norm, weight_decay=0.1, warmup_ratio=warmup_ratio, lr_scheduler_type=lr_scheduler_type, fp16=True, report_to=["tensorboard", "wandb"], hub_private_repo=True, push_to_hub=True, num_train_epochs=num_train_epochs, gradient_checkpointing=True, gradient_checkpointing_kwargs={"use_reentrant": False} )
- 创建
SFTTrainer时传入新的training_config:
trainer = SFTTrainer( model=model, args=training_config, # 替换为training_config train_dataset=dataset["train"], eval_dataset=dataset["test"], tokenizer=tokenizer, packing=True, dataset_text_field="content", max_seq_length=max_seq_length, # 注意:你已经手动将模型转为PEFT模型,这里可以不用再传peft_config dataset_kwargs={ "append_concat_token": False, "add_special_tokens": False, }, )
方法二:降级trl库到兼容版本
如果你不想修改代码结构,可以将trl库降级到仍支持TrainingArguments的版本,比如0.7.10:
pip install trl==0.7.10 --force-reinstall
额外优化建议
你的代码中已经手动加载模型并应用了peft_config(通过get_peft_model),因此在创建SFTTrainer时无需重复传入peft_config,避免潜在的冲突问题。
内容的提问来源于stack exchange,提问作者Tarun
相关产品推荐
相关产品推荐

