本页面介绍了在不使用 Transformers 库中 Trainer 类的情况下训练和微调模型的方法。虽然 Trainer API(在训练器类中介绍)为模型训练提供了高级抽象,但无训练器工作流程通过利用 🤗 Accelerate 库,为训练过程提供了更大的灵活性和控制。
无训练器工作流程允许直接管理训练循环,同时仍保留分布式训练、混合精度、梯度累积和实验跟踪等功能。当以下情况时,此方法特别有用:
Trainer 实现的自定义训练逻辑训练器与无训练器对比
来源
🤗 Accelerate 库是无训练器工作流程的基础,负责处理设备放置、分布式训练、混合精度和梯度累积。
Accelerate 工作流程
来源
无训练器工作流程在所有示例脚本中都遵循一致的模式,可分为几个关键阶段
无训练器实现流程
来源
任何无训练器工作流程的第一步都是初始化 Accelerator。此组件处理设备放置、分布式训练、混合精度以及 Trainer 类通常管理的其它优化。
来源
无训练器工作流程需要显式创建 PyTorch DataLoaders。与 Trainer 类在内部处理此过程不同,您需要创建和配置自己的 DataLoaders。
来源
在无训练器工作流程中,优化器和学习率调度器需要手动创建。这为您提供了自定义优化策略的灵活性。
来源
在训练之前,所有组件都需要由 accelerator 准备。此步骤处理设备放置、分布式训练设置和混合精度配置。
在此准备步骤之后,模型和优化器将针对可用硬件(CPU、GPU、TPU 等)和分布式训练设置进行正确配置。如果适用,数据加载器也将为分布式训练进行正确分片。
来源
训练循环是手动实现的,让您完全控制训练过程。
训练循环流程
一个典型的实现如下所示:
来源
评估也通过任务特定逻辑手动实现。这为您提供了实现自定义评估指标和过程的灵活性。
对于生成模型,您可以实现生成并在生成的输出上计算指标。
来源
检查点和最终模型可以使用 accelerator 工具保存。这确保了在分布式训练环境中的正确处理。
来源
Transformers 库支持针对各种任务的无训练器工作流程。每个任务都需要特定的模型类和评估指标。
| 任务 | 模型类 | 关键实现细节 |
|---|---|---|
| 因果语言建模 | AutoModelForCausalLM | 使用困惑度进行评估,对长序列使用滑动窗口 |
| 掩码语言建模 | AutoModelForMaskedLM | 使用特殊数据 collator 进行 token 掩码 |
| 文本分类 | AutoModelForSequenceClassification | 准确率、F1 分数等任务特定指标 |
| 摘要生成 | AutoModelForSeq2SeqLM | 实现 beam search 生成,ROUGE 指标 |
| 问答 | AutoModelForQuestionAnswering | 复杂的答案提取后处理 |
| Token 分类 | AutoModelForTokenClassification | Token 级别预测和指标(NER、POS 标注) |
| 图像分类 | AutoModelForImageClassification | 使用 transforms 进行图像预处理 |
| 多项选择 | AutoModelForMultipleChoice | 用于选择输入的特殊数据格式 |
| 翻译 | AutoModelForSeq2SeqLM | 处理源/目标语言,BLEU 指标 |
| 语义分割 | AutoModelForSemanticSegmentation | 像素级预测,IoU 指标 |
来源
尽管任务存在差异,但所有无训练器实现都遵循相似的结构。主要区别在于模型架构、数据处理和评估指标。
无训练器实现架构
核心训练循环在不同任务中保持一致,而任务特定组件则根据模型类型和评估要求进行定制。
来源
Trainer 中已有的功能tqdm 显示进度条和 accelerator 的跟踪功能来源
无训练器工作流程为微调和训练 Transformer 模型提供了 Trainer API 的灵活替代方案。通过直接管理训练循环,同时利用 🤗 Accelerate 库进行硬件加速和分布式训练,开发人员可以对训练过程实现更大的控制和定制,同时保持与更广泛的 Transformers 生态系统的兼容性。