本部分详细介绍了训练流水线。
优化输入流水线
摘要:输入受限的流水线的原因和干预在很大程度上取决于任务。使用性能分析器并注意常见问题。
使用适当的分析器(如以下分析器之一)诊断输入绑定的流水线:
- 适用于 JAX 的 Perfetto
- 适用于 TensorFlow 的 TensorFlow 性能分析器。
归根结底,具体原因和干预在很大程度上取决于任务。 更广泛的工程注意事项(例如,最大限度地减少磁盘占用量)可能会影响输入流水线性能。
以下是输入绑定流水线的常见原因:
- 数据未与训练过程共存,从而导致 I/O 延迟。例如,通过网络读取训练数据可能会导致 I/O 延迟。
- 大量在线数据预处理。考虑在离线后进行预处理,然后保存结果。
- 会干扰数据流水线预提取的意外同步障碍。例如,在 CommonLoopUtils 中的设备与主机之间同步指标时。
我们建议为输入受限的流水线采用以下干预方式:
- 对预提取示例的输入流水线进行插桩(例如 tf.data.Dataset.prefetch)。
- 请尽快从流水线中移除每个未使用的功能和元数据。
- 增加复制输入流水线(例如,使用 tf.data 服务)的示例的作业数量。
评估模型性能
摘要:比训练更大的批次大小运行评估。按照常规的时间间隔(而不是常规的时间间隔)运行评估。
评估设置
您可以使用以下设置评估模型的性能:
- 在线评估:当模型在生产环境中提供预测时收集指标。在线评估通常会以最实际的方式评估模型质量,因为它与模型的使用方式相匹配。
- 离线评估:当模型在代表生产环境的离线训练、验证或测试集运行时收集指标。根据具体问题,离线评估的成本和计算成本可能相当高。
- 定期评估:在模型训练期间收集可能作为离线评估代理的指标,和/或用于离线评估中使用的部分数据的指标。定期评估是最实用和最经济的选择,但可能无法完全代表生产环境。旨在使用离线代理快速进行代理,而不影响训练期间收到的信号的可靠性。
设置定期评估
出于以下原因,我们建议您在训练期间定期进行评估:
- 实时监控训练进度。
- 有助于回顾性模型检查点选择。
- 在训练结束时检查训练曲线。
最简单的配置是在同一计算实例中同时执行训练和定期评估,并定期在训练和评估之间切换。在这种情况下,用于评估的批次大小至少应该与用于训练的批次大小相同。这是因为在评估期间不需要维护模型激活,从而降低了每个示例的计算要求。
以固定的间隔(而不是时间间隔)执行定期评估。 根据时间间隔进行评估可能使难以理解训练曲线,尤其是在训练可能遇到训练作业被抢占、网络延迟问题等情况时。
验证和测试指标的周期(使用随机化训练集、验证集、测试集拆分)可能表示实现 bug,例如:
- 测试数据与训练数据重叠。
- 训练数据未正确打乱。
按照定期间隔间隔进行评估可以使问题更容易发现。
如果评估集无法被批次大小整除,则可能会导致部分批次出现。确保正确填充内边距样本(例如,计算批次平均损失的加权平均值),以防止损失函数出现偏差。 通常,您可以将这些填充示例的权重设为 0。
为每次评估保存足够的信息,以支持离线分析。 理想情况下,您可以针对各个具体示例保存预测,因为它们对调试非常有用。生成 SavedModel 等工件可简化评估作业完成后的临时模型检查。
选择定期评估样本
定期评估作业的运行速度可能不够快,无法在合理时间内针对完整离线评估集计算指标。 这个问题通常需要进行采样数据以进行定期评估。构建采样数据集时,请考虑样本大小问题,以及不均衡数据集中的特殊问题。
样本大小
检查定期作业使用的采样数据集上计算的性能是否与整个离线评估集上的性能一致;也就是说,确保采样数据集和完整数据集之间没有偏差。
您用于定期评估的数据集应该是以下两个数据集:
- 小到可以轻松生成完整的模型预测。
- 足够大,可以执行以下两项操作:
- 准确衡量模型的改进;也就是说,测量结果不应受标签噪声的干扰。
- 享受连续的多次试验机会,同时仍能得出准确的估算值。也就是说,质量足够大,可避免以不当方式与验证集“适配”的验证方式,无法与留出的测试集通用。但是,这种考虑很少涉及实用性。
不均衡数据集
对于不平衡的数据集,在罕见的少数类上的性能通常很嘈杂。对于只有少数少数样本的数据集,请正确记录预测数量,以深入了解准确性提升。例如,0.05 灵敏度提升听起来很棒,但这项改进是否仅仅源于另一个示例是正确的?
保存检查点,以追溯方式选择最佳检查点
摘要:运行固定步数的训练,并以追溯方式从运行中选择最佳检查点。
大多数深度学习框架都支持模型检查点。也就是说,定期将模型的当前状态保存到磁盘。检查点功能可让训练作业灵活计算实例中断。最佳检查点通常不是最后一个检查点,尤其是验证集性能不会随时间而继续增加,而是针对特定值波动时。
设置流水线以跟踪到目前为止训练期间看到的 N 个最佳检查点。在训练结束时,选择模型只表示选择最佳检查点。我们将此方法称为回顾性最佳检查点选择。通常不需要对潜在的提前停止提供支持,因为您预先指定了试验预算,并且保留了目前为止的 N 个最佳检查点。
设置实验跟踪
摘要:跟踪不同的实验时,您需要跟踪一些基本指标,例如研究中检查点的最佳性能以及对研究的简短说明。
我们建议您在电子表格中跟踪实验结果。我们的电子表格通常包含以下列:
- 研究名称
- 指向研究配置存储位置的链接。
- 研究的备注或简短说明。
- 运行的试验次数
- 研究中最佳检查点的验证集性能。
- 启动测试需要哪些具体的再现命令或关于未提交的更改的备注。
找到一个便捷的跟踪系统,该系统至少能够捕获上面列出的信息。未跟踪的实验可能也不存在。
批量归一化实现详情
摘要:现在,您通常可以将 批量归一化替换为 LayerNorm,但如果无法进行这种替换,则在更改批次大小或主机数量时会有复杂的细节。
批量归一化会根据当前批次的平均值和方差对其进行激活处理。不过,在多设备设置中,除非明确同步,否则每台设备上的这些统计信息会有所不同。轶事报告(主要针对 ImageNet)表明,在实践中仅使用大约 64 个示例计算这些标准化统计信息实际上更有效。(如需了解详情,请参阅训练时间更长、泛化效果更佳:缩小神经网络大型批量训练中的泛化差距中的描述。)分离总批次大小和用于计算批量规范统计信息的样本数量对批量比较尤其有用。
Ghost 批量标准化实现有时无法正确处理每台设备的批次大小大于虚拟批次大小的情况。在这种情况下,您需要在每台设备上对批次进行下采样,以获取正确数量的批量规范统计信息示例。
测试模式批量归一化中使用的指数移动平均值 (EMA) 只是训练统计信息的线性组合。因此,您只需要同步这些 EMA,然后再将其保存到检查点中。不过,批量归一化的一些常见实现不会同步这些 EMA,而只会保存第一台设备上的 EMA。
多主机流水线注意事项
摘要:对于日志记录、评估、RNG、检查点和数据分片,多主机训练可以非常轻松地引入 bug!
对多主机流水线执行以下操作:
- 确保流水线仅在一个主机上进行日志记录和检查点。
- 在评估或设置检查点之前,在各主机之间同步批量标准化统计信息。
- 跨主机分片数据文件,通常可以提高性能。
关键:确保在不同主机上具有相同的 RNG 种子(用于模型初始化),以及在不同主机上使用不同的种子(用于数据重排/预处理)。因此,请务必对其进行适当标记。