@浙大疏锦行
1. 隐式同步开销占主导
在典型的训练循环中,即使没有显式地记录损失,每个迭代也可能存在隐式同步。例如,优化器的 step() 操作可能涉及参数更新,这需要 CPU 参与并等待 GPU 完成梯度计算,从而引发一次 GPU-CPU 同步。因此,整个训练过程的同步开销主要来自于这些必要的隐式同步,而记录损失(通过 loss.item())带来的显式同步只增加很少的额外时间,甚至可能因为与隐式同步重叠而几乎不增加开销。
2. 同步时间的非累加性
由于 GPU 计算和 CPU 操作可以部分并行,同步操作的时间并不严格累加。当记录间隔较小时,频繁的显式同步可能会被隐式同步掩盖;当记录间隔较大时,显式同步次数减少,但每次同步可能等待更长的时间(因为 GPU 可能正在执行其他计算),但总体来看,由于隐式同步的存在,总同步时间变化不大。
3. 实验数据的支持
实验数据显示,记录次数从 10 次增加到 200 次(20 倍),剩余时长仅在 9.74 秒到 10.43 秒之间波动,变化幅度很小。这表明剩余时长主要由固定开销(如隐式同步)决定,而记录操作的影响相对较小,因此没有呈现出线性关系。