自动调优:自动化性能调优

Horovod 带有几个可调节的“旋钮”,可以影响运行时性能,包括 --fusion-threshold-mb--cycle-time-ms(张量融合),--cache-capacity(响应缓存),以及 分层集体算法 --hierarchical-allreduce--hierarchical-allgather

确定这些值的最佳组合以最大化性能(最小化收敛时间)可能是一个试错过程,因为许多因素包括模型复杂度、网络带宽、GPU内存等都会影响训练期间每秒输入吞吐量。

Horovod 提供了一种机制来自动化选择这些“旋钮”最佳值的过程,称为 自动调优。Horovod 自动调优系统使用 贝叶斯优化在训练期间智能地搜索 参数组合的空间。此功能可以通过为 --autotune 设置 horovodrun 标志来启用:

$ horovodrun -np 4 --autotune python train.py

当启用自动调优时,Horovod将在训练的最初几个步骤/周期中尝试不同的参数值,并收集性能指标(以单位时间内allreduced/allgathered的字节数衡量)。 一旦实验达到收敛,或者收集到一定数量的样本,系统将记录发现的最佳参数组合,并在整个训练过程中继续使用它们。

所有探索的参数组合(以及选定的最佳值)的日志可以通过向 --autotune-log-file 选项提供给 horovodrun 来记录:

$ horovodrun -np 4 --autotune --autotune-log-file /tmp/autotune_log.csv python train.py

通过将最佳参数记录到文件中,您可以选择在命令行上设置已发现的最佳参数,而无需在训练暂停并稍后恢复时重新运行自动调优。

请注意,某些可配置参数(如张量压缩)不包含在自动调优过程中,因为它们可能影响模型收敛。目前自动调优的目的完全是为了提高扩展效率,而不对模型性能做出任何妥协。

常量参数

有时您可能希望保持某些值不变,仅调整未指定的参数。这可以通过在命令行或由--config-file提供的配置文件中显式设置这些值来实现:

$ horovodrun -np 4 --autotune --cache-capacity 1024 --no-hierarchical-allgather python train.py

在上面的例子中,参数 cache-capacityhierarchical-allgather 将不会被自动调优调整。

高级自动调优

启用自动调优会在训练早期阶段带来性能下降的权衡,以换取后期更好的性能。因此,通常建议在训练预计耗时较长(在非常大的数据集上进行多个周期)且使用默认设置时发现扩展效率不足的情况下使用自动调优。

您可以调整自动调优系统本身,以更改预热样本数量(开始时丢弃的样本)、每个样本的步数和最大样本数:

$ horovodrun -np 4 --autotune \
--autotune-warmup-samples 5 --autotune-steps-per-sample 20 --autotune-bayes-opt-max-samples 40 \
python train.py

增加这些值通常会提高自动调优过程的准确性,但代价是在自动调优过程中花费更多时间且性能下降。

最后,对于熟悉贝叶斯优化和高斯过程基础理论的用户,您可以调整噪声正则化项(alpha)以应对网络或其他系统资源中的方差:

$ horovodrun -np 4 --autotune --autotune-gaussian-process-noise 0.75 python train.py