Transformers模型实例化方法:AutoModel、AutoModelForCausalLM

酒酿小圆子~ 2024-08-29 09:01:02 阅读 80

文章目录

一、Pipline二、AutoModel2.1 Model Head(模型头)2.2 代码示例2.3 AutoModelForCausalLM.from_pretrained参数

三、具体模型参考资料

Transformers包括管道pipeline、自动模型auto以及具体模型三种模型实例化方法,如果同时有配套的分词工具(Tokenizer),需要使用同名调度。

管道(Pipline)方式:高度集成的使用方式,几行代码就可以实现一个NLP任务自动模型(AutoModel)方式:自动载入并使用GPT、ChatGLM等模型具体模型方式:在使用时需要明确具体的模型,并按照特定参数进行调试

在上述三种应用方式中:管道方式使用最简单,但灵活度最差;具体模型方式使用复杂,但是灵活度最高。通常我们在实际应用中,比较推荐使用自动模型(AutoModel)方式。

一、Pipline

为了更加方便的使用预训练模型,<code>Transformers提供了pipeline函数,该函数封装了模型及对应的数据前处理与后处理工工作,无需我们关注内部细节,只需要指定pipeline的任务类型并输入对应的文本,即可得到我们想要的答案,做到了真正的开箱即用。

目前,pipeline中支持的任务类型包括:

情感分析(sentiment-analysis):对给定的文本分析其情感极性文本生成(text-generation):根据给定的文本进行生成命名实体识别(ner):标记句子中的实体阅读理解(question-answering):给定上下文与问题,从上下文中抽取答案掩码填充(fill-mask):填充给定文本中的掩码词文本摘要(summarization):生成一段长文本的摘要机器翻译(translation):将文本翻译成另一种语言特征提取(feature-extraction):生成给定文本的张量表示

下面给出一段情感分析的代码示例:

from transformers import pipeline

model_path = "./models/sentiment-analysis"

classifier = pipeline("sentiment-analysis", model=model_path)

classifier(

[

"I've been waiting for a HuggingFace course my whole life.",

"I hate this so much!",

]

)

二、AutoModel

AutoModel是Hugging Face的Transformers库中的一个非常实用的类,它属于自动模型选择的机制,其允许用户在不知道具体模型细节的情况下,根据给定的模型名称或模型类型自动加载相应的预训练模型。 它减少了代码的重复性,并提高了灵活性,使得开发者可以轻松地切换不同的模型进行实验或应用。

2.1 Model Head(模型头)

Model Head在预训练模型的基础上添加一层或多层的额外网络结构来适应特定的模型任务,方便于开发者快速加载transformers库中的不同类型模型,不用关心模型内部细节。

AutoModel 支持的Model Head(模型头)包括:

ForCausalLM:因果语言模型头,用于decoder类型的任务,主要进行文本生成,生成的每个词依赖于之前生成的所有词。比如GPT、QwenForMaskedLM:掩码语言模型头,用于encoder类型的任务,主要进行预测文本中被掩盖和被隐藏的词,比如BERT。ForSeq2SeqLM:序列到序列模型头,用于encoder-decoder类型的任务,主要处理编码器和解码器共同工作的任务,比如机器翻译或文本摘要。ForQuestionAnswering:问答任务模型头,用于问答类型的任务,从给定的文本中抽取答案。通过一个encoder来理解问题和上下文,对答案进行抽取。ForSequenceClassification:文本分类模型头,将输入序列映射到一个或多个标签。例如主题分类、情感分类。ForTokenClassification:标记分类模型头,用于对标记进行识别的任务。将序列中的每个标记映射到一个提前定义好的标签。如命名实体识别,打标签ForMultiplechoice:多项选择任务模型头,包含多个候选答案的输入,预测正确答案的选项。

2.2 代码示例

对于目前常见的大语言模型,比如ChatGLM、Qwen、Baichuan等,既可使用AutoModel加载,也可使用AutoModelForCausalLM模型头进行加载。

下面给出一段加载ChatGLM模型的代码示例。

from transformers import AutoTokenizer, AutoModel, AutoModelForCausalLM

model_path = "./model/chatglm2-6b"

tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)

使用AutoModel加载:

model = AutoModel.from_pretrained(model_path, trust_remote_code=True)

使用AutoModelForCausalLM加载:

model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True)

2.3 AutoModelForCausalLM.from_pretrained参数

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]]): 如果模型存储在私有仓库中,需要提供访问令牌。

注意:device_map 可用于在多GPU或特定设备上分配模型,通过设置 device_map 可实现单机多卡计算。具体可以参考博客:Transformers大模型库:单机多卡推理之device_map

三、具体模型

按照自身需求加载对应的分词器(Tokenizer)和模型(Model),灵活度高,但是使用起来相对麻烦。

参考资料

【AI大模型】Transformers大模型库(五):AutoModel、Model Head及查看模型结构



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。