ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Transformers 快速上手全解:Pipeline 推理、AutoClass 加载与 Trainer 微调实战

Transformers 快速上手全解:Pipeline 推理、AutoClass 加载与 Trainer 微调实战 Transformers 快速上手全解Pipeline 推理、AutoClass 加载与 Trainer 微调实战【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers本文基于 Hugging Face Transformers 官方文档 Quick Tour快速导览 展开完整覆盖从环境安装、pipeline一键推理、AutoClass 加载预训练模型、自定义模型构建到使用Trainer与 TensorFlow 完成训练的全流程。读完后你将掌握在 Transformers 中做快速推理、替换模型/分词器、保存与跨框架转换模型以及搭建完整微调训练循环的具体操作方法并能对照仓库源码理解每个 API 背后的实现位置。环境准备开始之前先确认依赖库已安装。官方导览给出的安装命令为pip install transformers datasets evaluate accelerate此外还需要安装你使用的机器学习框架例如 PyTorchpip install torch其中datasets用于加载数据集后文的语音识别与训练示例都会用到accelerate是pipeline中device_map分布式加载以及Trainer多卡/混合精度训练所依赖的库。Pipeline最简洁的预训练模型推理入口pipeline()是使用预训练模型做推理最简单、最快的方式。它把「前处理组件tokenizer / image_processor / feature_extractor / processor 模型 后处理」封装成一个可直接调用的对象覆盖文本、图像、音频与多模态等多种模态。仓库中该工厂函数的实现位于 pipeline 入口其函数签名为pipeline( task: str | None None, model: str | PreTrainedModel | None None, configNone, tokenizerNone, feature_extractorNone, image_processorNone, video_processorNone, processorNone, revisionNone, use_fast: bool True, tokenNone, deviceNone, device_mapNone, dtype: str | torch.dtype | None auto, trust_remote_codeNone, model_kwargsNone, pipeline_classNone, **kwargs, ) - Pipeline几个关键参数值得注意依据 源码 docstringtask决定返回哪个 pipeline 实现类未提供前处理组件时pipeline会自动按model→config→task的优先级加载默认组件use_fast默认True尽量使用 Rust 加速的 Fast tokenizerdevice/device_map控制模型放置的设备两者不能同时使用device_mapauto可借助 accelerate 自动切分大模型dtype默认auto按模型保存时的精度加载trust_remote_code是否允许执行 Hub 上仓库携带的自定义代码仅建议在已审查过代码时开启。支持的任务与默认模型官方文档列出了常见任务及其流水线标识符任务说明模态流水线标识符文本分类为文本序列分配标签NLPpipeline(tasksentiment-analysis)文本生成给定 prompt 生成文本NLPpipeline(tasktext-generation)摘要生成文本或文档摘要NLPpipeline(tasksummarization)图像分类为图像分配标签计算机视觉pipeline(taskimage-classification)图像分割为每个像素分配标签支持语义、全景、实例分割计算机视觉pipeline(taskimage-segmentation)目标检测预测图像中物体的边界框与类别计算机视觉pipeline(taskobject-detection)音频分类为音频数据分配标签音频pipeline(taskaudio-classification)自动语音识别将语音转换为文本音频pipeline(taskautomatic-speech-recognition)视觉问答给定图像和问题回答关于图像的问题多模态pipeline(taskvqa)文档问答给定文档和问题回答关于文档的问题多模态pipeline(taskdocument-question-answering)图像描述为给定图像生成描述文本多模态pipeline(taskimage-to-text)从源码结构看任务到实现的映射集中在 SUPPORTED_TASKS 这张注册表中每个任务包含三部分implpipeline 类、pt可加载该任务的 Auto 类、default默认模型及版本 commit。例如text-classification的默认模型是distilbert/distilbert-base-uncased-finetuned-sst-2-englishautomatic-speech-recognition的默认模型是facebook/wav2vec2-base-960himage-classification的默认模型是google/vit-base-patch16-224。也就是说当你只写pipeline(sentiment-analysis)而不指定模型时框架会按上表自动下载对应的默认模型与 tokenizer 并缓存到本地。此外TASK_ALIASES 注册了三个任务别名sentiment-analysis→text-classification、ner→token-classification、text-to-speech→text-to-audio这就是文档示例中可以直接使用sentiment-analysis这个任务名的原因。示例一情感分析创建 pipeline 实例并指定任务 from transformers import pipeline classifier pipeline(sentiment-analysis)随后即可对目标文本调用 classifier(I love showing you the Transformers library.) [{label: POSITIVE, score: 0.9998}]有多个输入时把输入以列表形式传入pipeline 返回一个字典列表 results classifier([We love showing you the Transformers library., I dont want to dislike it.]) for result in results: ... print(flabel: {result[label]}, score: {round(result[score], 4)}) label: POSITIVE, score: 0.9998 label: NEGATIVE, score: 0.5309示例二在数据集上批量跑自动语音识别pipeline也可以对一整个数据集做迭代处理。以自动语音识别为例 import torch from transformers import pipeline speech_recognizer pipeline(automatic-speech-recognition, modelfacebook/wav2vec2-base-960h)加载音频数据集例如 PolyAI/minds14 from datasets import load_dataset, Audio dataset load_dataset(PolyAI/minds14, nameen-US, splittrain)注意确保数据集的采样率与模型训练时的采样率一致用cast_column转换音频列 dataset dataset.cast_column(audio, Audio(sampling_ratespeech_recognizer.feature_extractor.sampling_rate))调用 audio 列会自动加载并重新采样音频文件。取出前 4 条样本的原始波形数组以列表形式传入 pipeline result speech_recognizer(dataset[:4][audio]) print([d[text] for d in result])性能提示在大型数据集上如果输入体积较大如音频、图像建议不要把所有输入一次性读进内存而是向 pipeline 传入生成器generator而非列表让数据按块流动处理。在 pipeline 中指定其他模型与 tokenizerpipeline可以容纳 Hub 上的任意模型很容易把它适配到其他使用场景。例如需要处理非英语文本时可以用多语言 BERT 情感分类模型 model_name nlptown/bert-base-multilingual-uncased-sentiment用AutoModelForSequenceClassification和AutoTokenizer加载模型及对应 tokenizer下一节详述 AutoClass from transformers import AutoTokenizer, AutoModelForSequenceClassification model AutoModelForSequenceClassification.from_pretrained(model_name) tokenizer AutoTokenizer.from_pretrained(model_name)然后把指定组件传入pipeline对应工厂函数签名中的model与tokenizer参数即可处理另一种语言的文本 classifier pipeline(sentiment-analysis, modelmodel, tokenizertokenizer) classifier(Nous sommes très heureux de vous présenter la bibliothèque Transformers.) [{label: 5 stars, score: 0.7273}]如果在 Hub 上找不到适合你使用场景的模型就需要用自己的数据对预训练模型做微调微调方法参见官方微调教程docs/source/en/training.md微调完成后也可以把模型推送到社区共享。AutoClass按名称自动加载模型与分词器AutoModelForSequenceClassification与AutoTokenizer就是驱动上述pipeline的两个协作组件。AutoClass 是一组快捷方式给定模型名称或路径自动读取其架构对应的configuration.json/tokenizer_config.json并实例化正确的类。你只需选择合适的 AutoClass 及其配套前处理类无需关心具体实现类名。AutoTokenizerTokenizer 负责把文本前处理成模型可消费的数值数组涉及词如何切分、切到哪一级等规则。最关键的一点必须用与模型相同的模型名实例化 tokenizer即沿用它预训练时的分词规则否则输入分布会错位。AutoTokenizer的实现位于 AutoTokenizer 类。加载方式 from transformers import AutoTokenizer model_name nlptown/bert-base-multilingual-uncased-sentiment tokenizer AutoTokenizer.from_pretrained(model_name)把文本传给 tokenizer encoding tokenizer(I love showing you the Transformers library.) print(encoding) {input_ids: [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102], token_type_ids: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], attention_mask: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}返回值是一个字典核心字段包括input_idstoken 的数值表示token_type_ids区分同一段输入中不同来源 token 的类型Bert 类模型区分 segment A/B全为 0 表示同一 segmentattention_mask标记哪些位置需要被注意力机制关注真实 token 为 1填充位为 0。Tokenizer 还支持接受输入列表并通过 padding 与截断得到长度一致的批量数据 pt_batch tokenizer( ... [We love showing you the Transformers library., I hope you dont dislike it.], ... paddingTrue, ... truncationTrue, ... max_length512, ... return_tensorspt, ... )return_tensorspt会把各字段转换为 PyTorch 张量文本、图像、音频与多模态输入的前处理细节分别由AutoImageProcessor、AutoFeatureExtractor、AutoProcessor覆盖参见官方 preprocessing 教程docs/source/en/preprocessing.md。AutoModelTransformers 提供了统一加载预训练实例的方式AutoModel的加载方式和AutoTokenizer完全一致区别只在于要按任务选择合适的 Auto 类。做文本序列分类时需要加载AutoModelForSequenceClassification from transformers import AutoModelForSequenceClassification model_name nlptown/bert-base-multilingual-uncased-sentiment pt_model AutoModelForSequenceClassification.from_pretrained(model_name)然后把前处理好的批量数据直接传给模型——把字典展开加**即可 pt_outputs pt_model(**pt_batch)模型在logits属性上输出最终激活前的结果对其应用 softmax 得到概率 from torch import nn pt_predictions nn.functional.softmax(pt_outputs.logits, dim-1) print(pt_predictions) tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725], [0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fnSoftmaxBackward0)关于模型输出的一个通用约定Transformers 中所有模型PyTorch 或 TensorFlow输出的都是最终激活函数如 softmax之前的张量因为最终激活常常与损失函数合并计算。模型输出是一个特殊的数据类Data class其属性在 IDE 中可自动补全且像元组或字典一样可用整数、切片或字符串索引访问其中为None的属性会被忽略。保存模型微调完成后可以用PreTrainedModel.save_pretrained把模型与 tokenizer 一起保存 pt_save_directory ./pt_save_pretrained tokenizer.save_pretrained(pt_save_directory) pt_model.save_pretrained(pt_save_directory)需要再次使用时用from_pretrained从本地路径加载 pt_model AutoModelForSequenceClassification.from_pretrained(./pt_save_pretrained)Transformers 的一个亮点能力是模型可以保存后再以另一种框架重新加载通过from_pt/from_tf参数实现框架间转换 from transformers import AutoModel tokenizer AutoTokenizer.from_pretrained(pt_save_directory) pt_model AutoModelForSequenceClassification.from_pretrained(pt_save_directory, from_ptTrue)自定义模型构建如果只是想改改模型结构可以修改模型的配置类configuration。配置类指定模型属性例如隐藏层数量、注意力头数量等。从自定义配置初始化模型时相当于从零开始权重随机初始化需要自行训练才能得到有意义结果。先导入AutoConfig加载想修改的预训练模型配置并在from_pretrained中直接覆写想改的属性如注意力头数 from transformers import AutoConfig my_config AutoConfig.from_pretrained(distilbert/distilbert-base-uncased, n_heads12)再用AutoModel.from_config从自定义配置创建模型 from transformers import AutoModel my_model AutoModel.from_config(my_config)如果需要完整的新架构而非仅改属性官方提供了「创建自定义模型」指南docs/source/en/create_a_model.md进一步说明自定义配置的写法。Trainer面向 PyTorch 的优化训练循环由于所有模型都是标准的torch.nn.Module你可以把它们放进任意常规训练循环中手动训练。但 Transformers 提供了Trainer类在基础训练循环之上额外提供分布式训练、混合精度、检查点管理、日志与评估等能力。按照任务不同通常向Trainer传入以下组件以情感分类微调为例1. 加载模型PreTrainedModel或任意torch.nn.Module from transformers import AutoModelForSequenceClassification model AutoModelForSequenceClassification.from_pretrained(distilbert/distilbert-base-uncased)2. 定义训练超参数TrainingArguments汇集所有可调训练参数学习率、批大小、epoch 数等未指定项使用默认值。该类定义于 TrainingArguments from transformers import TrainingArguments training_args TrainingArguments( ... output_dirpath/to/save/folder/, ... learning_rate2e-5, ... per_device_train_batch_size8, ... per_device_eval_batch_size8, ... num_train_epochs2, ... )3. 加载前处理类tokenizer、image processor、feature extractor 或 processor 之一 from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(distilbert/distilbert-base-uncased)4. 加载数据集 from datasets import load_dataset dataset load_dataset(rotten_tomatoes)5. 编写 tokenize 函数并批量映射到整个数据集 def tokenize_dataset(dataset): ... return tokenizer(dataset[text]) dataset dataset.map(tokenize_dataset, batchedTrue)6. 创建动态填充的数据整理器DataCollatorWithPadding定义于 data_collator.py它会在运行时把同一 batch 内长度不同的样本 padding 到统一长度避免离线预 padding 造成的显存浪费 from transformers import DataCollatorWithPadding data_collator DataCollatorWithPadding(tokenizertokenizer)然后把所有组件汇总进Trainer from transformers import Trainer trainer Trainer( ... modelmodel, ... argstraining_args, ... train_datasetdataset[train], ... eval_datasetdataset[test], ... processing_classtokenizer, ... data_collatordata_collator, ... )调用trainer.train()即开始训练 trainer.train()两个扩展点需要区分子类化Trainer通过覆写其内部方法可以自定义损失函数、优化器、学习率调度器等训练行为属于对训练逻辑本身的修改Callbacks回调用于与外部库集成、监控训练过程、报告进度或提前停止训练回调不修改训练循环本身若要改损失函数等仍须子类化Trainer。另外翻译、摘要等序列到序列任务应改用Seq2SeqTrainer与Seq2SeqTrainingArguments。使用 TensorFlow 训练所有模型同时也是标准的tf.keras.Model因此可以直接使用 Keras API 训练。Transformers 提供TFPreTrainedModel.prepare_tf_dataset方法把 Datasets 数据集便捷地转成tf.data.Dataset之后直接调用 Keras 的compile与fit即可。1. 加载 TF 版模型 from transformers import TFAutoModelForSequenceClassification model TFAutoModelForSequenceClassification.from_pretrained(distilbert/distilbert-base-uncased)2. 加载 tokenizer from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(distilbert/distilbert-base-uncased)3. 编写 tokenize 函数 def tokenize_dataset(dataset): ... return tokenizer(dataset[text])4. 用Dataset.map应用 tokenizer再交给prepare_tf_dataset可同时设置批大小与 shuffle dataset dataset.map(tokenize_dataset) tf_dataset model.prepare_tf_dataset( ... dataset[train], batch_size16, shuffleTrue, tokenizertokenizer ... )5.compile与fit由于每个 Transformers 模型都自带与默认任务对应的损失函数compile时无需显式指定 loss from tensorflow.keras.optimizers import Adam model.compile(optimizerAdam(3e-5)) # 无需损失函数参数 model.fit(tf_dataset)小结与下一步本文按照官方 Quick Tour 的脉络完成了 Transformers 的核心使用闭环推理pipeline(task, model, tokenizer)三行代码完成从下载到预测任务注册表与默认模型见 SUPPORTED_TASKS组件化AutoClass 系列AutoTokenizer/AutoModel*/AutoConfig/TFAutoModel*按名称统一加载各类组件并支持save_pretrained/from_pretrained与from_pt/from_tf的框架间转换训练PyTorch 侧用TrainingArguments 数据mapDataCollatorWithPaddingTrainer搭建完整微调循环TensorFlow 侧用prepare_tf_dataset Kerascompile/fit。掌握以上内容后可以继续深入创建完全自定义模型、针对特定任务微调、编写训练脚本以及阅读 Transformers 核心概念文档来理解模型输出数据类、attention mask 等细节。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表