PP支持动态形状

背景与挑战

在深度学习模型训练中,尤其是涉及多模态任务时,输入数据的序列长度往往不是固定的。对于采用流水线并行(Pipeline Parallelism,PP)策略的模型,处理不同长度的序列通常需要将所有序列调整为统一长度,一般通过填充或截断来实现。这种做法虽然简化了数据处理和模型设计,但会导致计算资源和内存的浪费,特别是在处理较短序列时,需要大量的填充。面临的主要挑战有如下两点:
  • 内存效率低下:可能存在大量填充导致内存利用率低。
  • 计算效率低下:对填充部分进行不必要的计算。

解决方案

为了应对上述挑战,我们引入了对动态形状的支持,允许每个微批次中的序列保持其原始长度。在发送张量之前,提前通信张量的形状信息,使得各流水线之间即将接收的数据形状得到同步,确保内存分配和预处理的准确性。

使用场景

使用方法

在训练脚本中设置如下参数即启用该特性。
--pipeline-model-parallel-size  N    # 开启流水线并行, N大于等于2
--variable-seq-lengths    # 开启PP支持动态形状
  • 当采用流水线并行策略且序列长度固定时,启用该特性将增加不必要的通信开销,因此不建议使用。
  • 密切监控训练过程中的内存消耗,避免因序列长度变动引起的溢出问题。

使用效果

PP支持动态形状是针对特定应用场景的一种有效优化手段,它能够在保证模型性能的同时,显著改善资源利用率和数据处理的灵活性。用户应根据实际情况权衡利弊,决定是否启用这一特性。