张量融合

Horovod 的独特之处在于它能够交错进行通信和计算,并结合对小规模 allreduce 操作的批处理能力,从而提升性能。我们将这种批处理功能称为 Tensor Fusion。

Tensor Fusion 的工作原理是尝试将所有在给定时刻准备进行归约的张量合并到一个归约操作中。Tensor Fusion 的算法如下:

  1. 确定哪些张量已准备好进行归约。选择前几个张量,这些张量符合 HOROVOD_FUSION_THRESHOLD 字节大小并具有相同的数据类型。

  2. 如果之前未分配,则分配大小为 HOROVOD_FUSION_THRESHOLD 的融合缓冲区。默认融合缓冲区大小为 128 MB。

  3. 将选定张量的数据复制到融合缓冲区。

  4. 对融合缓冲区执行allreduce操作。

  5. 将数据从融合缓冲区复制到输出张量中。

  6. 重复此循环,直到没有更多张量需要规约。

融合缓冲区大小可以通过--fusion-threshold-mb命令行参数调整horovodrun

$ horovodrun -np 4 --fusion-threshold-mb 32 python train.py

--fusion-threshold-mb 设置为零会禁用张量融合:

$ horovodrun -np 4 --fusion-threshold-mb 0 python train.py

你可以使用命令行参数--cycle-time-ms来调整周期之间的时间(以毫秒为单位):

$ horovodrun -np 4 --cycle-time-ms 3.5 python train.py