关于使用transformers的Trainer微调报错 TypeError:model. forward() got an unexpected keyword argument ‘labels‘
在运行trainer.train()时,报错TypeError: Qwen2Model.forward() got an unexpected keyword argument 'labels'在尝试AutoModelForCausalLM后,发现居然跑通了!起初认为时在构造数据集时定义的问题,但是在调试过程中发现trainer的构造。以为可以解决问题了,emmmmm发现作者找到了问题,但是最终并
一、环境配置
环境:
Python 3.10.16
cuda 12.2
pytorch 2.5.0
依赖:
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install modelscope==1.22.0 # 用于模型下载和管理
pip install transformers== 4.48.0 # Hugging Face 的模型库,用于加载和训练模型
pip install streamlit==1.41.1
pip install sentencepiece==0.2.0
pip install accelerate>=0.26.0 # 用于分布式训练和混合精度训练
pip install datasets # 用于加载和处理数据集
pip install peft ==0.14.0 # 用于 LoRA 微调
二、具体报错原因
在加载模型使用了AutoModel这个方法
from transformers import TrainingArguments, Trainer, DataCollatorForSeq2Seq,AutoTokenizer,AutoModel
model_dir ='./model/DeepSeek-R1-Distill-Qwen-1.5B'
# Transformers加载模型权重
tokenizer = AutoTokenizer.from_pretrained(model_dir, use_fast=False, trust_remote_code=True)
model =AutoModel.from_pretrained(model_dir, torch_dtype=torch.bfloat16)
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=["c_proj"],
inference_mode=False, # 训练模式
r=8, # Lora 秩
lora_alpha=32, # Lora alaph,具体作用参见 Lora 原理
lora_dropout=0.5, # Dropout 比例
)
在运行trainer.train()时,报错TypeError: Qwen2Model.forward() got an unexpected keyword argument 'labels'
起初认为时在构造数据集时定义的问题,但是在调试过程中发现trainer的构造
class DataCollatorWithPadding:
def __call__(self, features: List[Dict[str, Any]]) -> Dict[str, Any]:
if "label" in batch:
batch["labels"] = batch["label"]
del batch["label"]
if "label_ids" in batch:
batch["labels"] = batch["label_ids"]
del batch["label_ids"]
然后百度了数篇文章,看到了 https://zhuanlan.zhihu.com/p/454630549
以为可以解决问题了,emmmmm发现作者找到了问题,但是最终并没有解决问题
然后突发奇想,去GitHub查看了Qwen的官方使用手册,https://github.com/QwenLM/Qwen2.5
from transformers import AutoModelForCausalLM, AutoTokenizer
发现了不同。AutoModelForCausalLM 和AutoModel 的不同。在尝试AutoModelForCausalLM后,发现居然跑通了!!!!!
三、区别(AutoModelForCausalLM和AutoModel)
注:下面内容由AI提供
AutoModelForCausalLM 和 AutoModel 都是 Hugging Face transformers 库中的类,用于加载预训练模型。 它们之间的关键区别在于模型的架构和预期用途:
AutoModel
- 用途: 这是一个通用的自动模型类。 它会根据预训练模型的配置自动推断正确的模型架构。
AutoModel可以加载各种类型的模型,例如文本分类、问答、序列标注等等。 - 架构:
AutoModel本身并不对应于任何特定的模型架构。 相反,它是一个智能的路由类,会根据你指定的预训练模型的配置选择正确的底层模型类。 - 输出:
AutoModel的输出取决于加载的模型架构。 例如,如果加载的是序列分类模型,则输出将包含 logits 或概率;如果加载的是问答模型,则输出将包含 start 和 end logits。 - 适用场景: 当你不确定预训练模型的具体架构,或者想要轻松地尝试不同的模型时,
AutoModel是一个不错的选择。
AutoModelForCausalLM
- 用途: 这是一个专门用于因果语言建模 (Causal Language Modeling) 的自动模型类。 因果语言建模是指模型需要根据之前的词语预测下一个词语的任务。 这种模型通常用于文本生成。
- 架构:
AutoModelForCausalLM用于加载具有因果语言建模头的模型。 也就是说,它加载的模型架构被设计用于预测序列中的下一个 token。 - 输出:
AutoModelForCausalLM的输出通常包含 logits,表示词汇表中每个 token 作为下一个 token 的概率。 - 适用场景: 当你明确想要执行文本生成任务时,例如:
- 文本续写
- 对话生成
- 代码生成
总结:
| 特性 | AutoModel |
AutoModelForCausalLM |
|---|---|---|
| 用途 | 通用模型加载器,适用于各种任务 | 专门用于因果语言建模(文本生成) |
| 架构 | 根据模型配置自动选择架构 | 加载具有因果语言建模头的模型 |
| 输出 | 取决于模型架构 | logits(表示下一个 token 的概率) |
| 适用场景 | 不确定模型架构或尝试不同模型时 | 文本生成任务 |
选择哪个类:
- 如果你想加载一个用于文本生成的模型(例如,GPT、GPT-2、Qwen2),你应该使用
AutoModelForCausalLM。 - 如果你想加载一个用于其他任务的模型(例如,文本分类、问答),你应该使用
AutoModel或其他更具体的AutoModelFor...类(例如,AutoModelForSequenceClassification、AutoModelForQuestionAnswering)。
示例:
from transformers import AutoModel, AutoModelForCausalLM
# 加载一个通用的 Transformer 模型(例如,BERT)
model = AutoModel.from_pretrained("bert-base-uncased")
# 加载一个用于文本生成的 GPT 模型
model = AutoModelForCausalLM.from_pretrained("gpt2")
更多推荐




所有评论(0)