一、环境配置

环境:

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... 类(例如,AutoModelForSequenceClassificationAutoModelForQuestionAnswering)。

示例:

from transformers import AutoModel, AutoModelForCausalLM

# 加载一个通用的 Transformer 模型(例如,BERT)
model = AutoModel.from_pretrained("bert-base-uncased")

# 加载一个用于文本生成的 GPT 模型
model = AutoModelForCausalLM.from_pretrained("gpt2")

Logo

一站式 AI 云服务平台

更多推荐