一、引言
这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。
🤗 Transformers 提供了数以千计的预训练模型,支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成。它的宗旨是让最先进的 NLP 技术人人易用。
🤗 Transformers 提供了便于快速下载和使用的API,让你可以把预训练模型用在给定文本、在你的数据集上微调然后通过 model hub 与社区共享。同时,每个定义的 Python 模块均完全独立,方便修改和快速研究实验。
🤗 Transformers 支持三个最热门的深度学习库: Jax, PyTorch 以及 TensorFlow — 并与之无缝整合。你可以直接使用一个框架训练你的模型然后用另一个加载和推理。
本文重点介绍自动模型类(AutoModel)。
二、自动模型类(AutoModel)
2.1 概述
AutoModel是Hugging Face的Transformers库中的一个非常实用的类,它属于自动模型选择的机制。这个设计允许用户在不知道具体模型细节的情况下,根据给定的模型名称或模型类型自动加载相应的预训练模型。它减少了代码的重复性,并提高了灵活性,使得开发者可以轻松地切换不同的模型进行实验或应用。
2.2 Model Head(模型头)
Model Head在预训练模型的基础上添加一层或多层的额外网络结构来适应特定的模型任务,方便于开发者快速加载transformers库中的不同类型模型,不用关心模型内部细节。
- ForCausalLM:因果语言模型头,用于decoder类型的任务,主要进行文本生成,生成的每个词依赖于之前生成的所有词。比如GPT、Qwen
- ForMaskedLM:掩码语言模型头,用于encoder类型的任务,主要进行预测文本中被掩盖和被隐藏的词,比如BERT。
- ForSeq2SeqLM:序列到序列模型头,用于encoder-decoder类型的任务,主要处理编码器和解码器共同工作的任务,比如机器翻译或文本摘要。
- ForQuestionAnswering:问答任务模型头,用于问答类型的任务,从给定的文本中抽取答案。通过一个encoder来理解问题和上下文,对答案进行抽取。
- ForSequenceClassification:文本分类模型头,将输入序列映射到一个或多个标签。例如主题分类、情感分类。
- ForTokenClassification:标记分类模型头,用于对标记进行识别的任务。将序列中的每个标记映射到一个提前定义好的标签。如命名实体识别,打标签
- ForMultiplechoice:多项选择任务模型头,包含多个候选答案的输入,预测正确答案的选项。
2.3 代码示例
对于目前常见的LLM,比如GLM、Qwen、Baichuan等,通常使用AutoModelForCausalLM模型头进行加载,比如下面代码中使用AutoModelForCausalLM.from_pretrained加载Qwen2模型。
from modelscope import snapshot_download from transformers import AutoTokenizer, AutoModelForCausalLM #model_dir = snapshot_download('ZhipuAI/glm-4-9b-chat') model_dir = snapshot_download('Qwen/Qwen2-7B-Instruct') import torch device = "cuda:2" # the device to load the model onto tokenizer = AutoTokenizer.from_pretrained(model_dir,trust_remote_code=True) prompt = "介绍一下大语言模型" messages = [ {"role": "system", "content": "你是一个智能助理."}, {"role": "user", "content": prompt} ] text = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True ) model_inputs = tokenizer([text], return_tensors="pt").to(device) model = AutoModelForCausalLM.from_pretrained( model_dir, device_map="cuda:2", trust_remote_code=True, output_attentions=True ) gen_kwargs = {"max_length": 512, "do_sample": True, "top_k": 1} with torch.no_grad(): outputs = model.generate(**model_inputs, **gen_kwargs) outputs = outputs[:, model_inputs['input_ids'].shape[1]:] #切除system、user等对话前缀 print(tokenizer.decode(outputs[0], skip_special_tokens=True)) print(model)
AutoModelForCausalLM.from_pretrained常见参数:
- model_name_or_path (str): 指定预训练模型的名称或模型文件的路径。例如,"gpt2"、"distilgpt2"或本地模型文件夹的路径。
- config (Optional[PretrainedConfig]): 模型配置对象或其配置的字典。通常不需要手动提供,因为如果未提供,它会根据model_name_or_path自动加载。
- tokenizer (Optional[PreTrainedTokenizer]): 与模型一起使用的分词器。如果提供,可以用于快速预处理文本数据。如果未提供,某些功能可能受限。
- cache_dir (Optional[str]): 用于存储下载的模型文件的缓存目录路径。
- from_tf (bool, default=False): 是否从TensorFlow检查点加载模型。
- force_download (bool, default=False): 是否强制重新下载模型,即使本地已有。
- resume_download (bool, default=False): 是否从上次下载中断的地方继续下载。
- proxies (dict, optional): 如果需要通过代理服务器下载模型,可以提供代理的字典。
- output_loading_info (bool, default=False): 是否返回加载模型时的详细信息。
- local_files_only (bool, default=False): 是否仅从本地文件加载模型,不尝试在线下载。
- low_cpu_mem_usage (bool, default=False): 是否优化模型加载以减少CPU内存使用,这对于大型模型特别有用。
- device_map (Optional[Dict[str, Union[int, str]]]): 用于在多GPU或特定设备上分配模型的字典。在PyTorch 2.0及Transformers的相应版本中更为常见。
- revision (str, optional): 指定模型版本或分支,用于从Hugging Face Hub加载特定版本的模型。
- use_auth_token (Optional[Union[str, bool]]): 如果模型存储在私有仓库中,需要提供访问令牌。
特别有用的一个功能就是输出模型结构,有助于快速理解模型
from modelscope import snapshot_download model_dir = snapshot_download('Qwen/Qwen2-7B-Instruct') from transformers import AutoTokenizer, AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained(model_dir) print(model)
Qwen2的模型结构如下
Qwen2ForCausalLM( (model): Qwen2Model( (embed_tokens): Embedding(152064, 3584) (layers): ModuleList( (0-27): 28 x Qwen2DecoderLayer( (self_attn): Qwen2SdpaAttention( (q_proj): Linear(in_features=3584, out_features=3584, bias=True) (k_proj): Linear(in_features=3584, out_features=512, bias=True) (v_proj): Linear(in_features=3584, out_features=512, bias=True) (o_proj): Linear(in_features=3584, out_features=3584, bias=False) (rotary_emb): Qwen2RotaryEmbedding() ) (mlp): Qwen2MLP( (gate_proj): Linear(in_features=3584, out_features=18944, bias=False) (up_proj): Linear(in_features=3584, out_features=18944, bias=False) (down_proj): Linear(in_features=18944, out_features=3584, bias=False) (act_fn): SiLU() ) (input_layernorm): Qwen2RMSNorm() (post_attention_layernorm): Qwen2RMSNorm() ) ) (norm): Qwen2RMSNorm() ) (lm_head): Linear(in_features=3584, out_features=152064, bias=False) )
三、总结
本文对使用transformers的AutoModel自动模型类进行介绍,主要用于加载transformers模型库中的大模型,文中详细介绍了应用于不同任务的Model Head(模型头)、使用模型头、输出模型结构等关于AutoModel常用的方法。希望对您有帮助。