菜单

无 Trainer 工作流程

相关源文件

本页面介绍了在不使用 Transformers 库中 Trainer 类的情况下训练和微调模型的方法。虽然 Trainer API(在训练器类中介绍)为模型训练提供了高级抽象,但无训练器工作流程通过利用 🤗 Accelerate 库,为训练过程提供了更大的灵活性和控制。

无训练器方法的概述

无训练器工作流程允许直接管理训练循环,同时仍保留分布式训练、混合精度、梯度累积和实验跟踪等功能。当以下情况时,此方法特别有用:

  1. 您需要对训练过程进行细粒度控制
  2. 您有难以使用 Trainer 实现的自定义训练逻辑
  3. 您希望将 Transformers 模型集成到现有的 PyTorch 训练 pipeline 中
  4. 您更喜欢显式代码而非抽象,以便更好地理解和调试

训练器与无训练器对比

来源

关键组件

Accelerate 库集成

🤗 Accelerate 库是无训练器工作流程的基础,负责处理设备放置、分布式训练、混合精度和梯度累积。

Accelerate 工作流程

来源

核心实现模式

无训练器工作流程在所有示例脚本中都遵循一致的模式,可分为几个关键阶段

无训练器实现流程

来源

实现细节

1. 设置 Accelerator

任何无训练器工作流程的第一步都是初始化 Accelerator。此组件处理设备放置、分布式训练、混合精度以及 Trainer 类通常管理的其它优化。

来源

2. 数据准备和 DataLoaders

无训练器工作流程需要显式创建 PyTorch DataLoaders。与 Trainer 类在内部处理此过程不同,您需要创建和配置自己的 DataLoaders。

来源

3. 优化器和学习率调度器

在无训练器工作流程中,优化器和学习率调度器需要手动创建。这为您提供了自定义优化策略的灵活性。

来源

4. Accelerator 准备

在训练之前,所有组件都需要由 accelerator 准备。此步骤处理设备放置、分布式训练设置和混合精度配置。

在此准备步骤之后,模型和优化器将针对可用硬件(CPU、GPU、TPU 等)和分布式训练设置进行正确配置。如果适用,数据加载器也将为分布式训练进行正确分片。

来源

5. 训练循环实现

训练循环是手动实现的,让您完全控制训练过程。

训练循环流程

一个典型的实现如下所示:

来源

6. 训练期间的评估

评估也通过任务特定逻辑手动实现。这为您提供了实现自定义评估指标和过程的灵活性。

对于生成模型,您可以实现生成并在生成的输出上计算指标。

来源

7. 保存检查点和最终模型

检查点和最终模型可以使用 accelerator 工具保存。这确保了在分布式训练环境中的正确处理。

来源

任务特定实现

Transformers 库支持针对各种任务的无训练器工作流程。每个任务都需要特定的模型类和评估指标。

任务模型类关键实现细节
因果语言建模AutoModelForCausalLM使用困惑度进行评估,对长序列使用滑动窗口
掩码语言建模AutoModelForMaskedLM使用特殊数据 collator 进行 token 掩码
文本分类AutoModelForSequenceClassification准确率、F1 分数等任务特定指标
摘要生成AutoModelForSeq2SeqLM实现 beam search 生成,ROUGE 指标
问答AutoModelForQuestionAnswering复杂的答案提取后处理
Token 分类AutoModelForTokenClassificationToken 级别预测和指标(NER、POS 标注)
图像分类AutoModelForImageClassification使用 transforms 进行图像预处理
多项选择AutoModelForMultipleChoice用于选择输入的特殊数据格式
翻译AutoModelForSeq2SeqLM处理源/目标语言,BLEU 指标
语义分割AutoModelForSemanticSegmentation像素级预测,IoU 指标

来源

任务实现的常见模式

尽管任务存在差异,但所有无训练器实现都遵循相似的结构。主要区别在于模型架构、数据处理和评估指标。

无训练器实现架构

核心训练循环在不同任务中保持一致,而任务特定组件则根据模型类型和评估要求进行定制。

来源

无训练器工作流程的优势

  1. 显式控制:直接管理训练循环提供了更大的灵活性
  2. 透明性:清晰了解训练过程的每一步
  3. 自定义:更容易实现自定义训练逻辑、损失函数或评估指标
  4. 集成性:更好地与现有 PyTorch 代码库集成
  5. 学习:更好地理解模型训练的底层机制

无训练器工作流程的缺点

  1. 冗余:需要编写和维护更多的代码
  2. 复杂性:需要手动处理更多细节
  3. 潜在错误:手动代码越多,出现错误的可能性越大
  4. 重复造轮子:可能需要重新实现 Trainer 中已有的功能

无训练器工作流程的最佳实践

  1. 从示例开始:使用示例脚本作为起点
  2. 利用 Accelerate 功能:充分利用 Accelerate 库的功能
  3. 一致的结构:遵循既定模式以保持清晰
  4. 错误处理:在设备特定操作周围添加适当的错误处理
  5. 进度跟踪:使用 tqdm 显示进度条和 accelerator 的跟踪功能
  6. 检查点:实施定期检查点以避免丢失工作

来源

结论

无训练器工作流程为微调和训练 Transformer 模型提供了 Trainer API 的灵活替代方案。通过直接管理训练循环,同时利用 🤗 Accelerate 库进行硬件加速和分布式训练,开发人员可以对训练过程实现更大的控制和定制,同时保持与更广泛的 Transformers 生态系统的兼容性。