
1. 项目概述与核心价值在训练千亿乃至万亿参数规模的大模型时我们这些一线的工程师和研究员最头疼的问题是什么不是算力不够而是内存墙。你手头可能有8张、16张甚至更多的A100/H100但模型的一个权重矩阵可能就塞满了一张卡。传统的并行策略无论是数据并行DP还是模型并行MP都不可避免地引入了内存冗余——每张卡上都存着一份完整的参数副本或者为了同步梯度而缓存了大量中间状态。这直接限制了你能跑的批量大小Batch Size或模型隐藏层维度成为扩展模型规模的瓶颈。现有的自动并行框架如Alpa、TensorOpt其优化目标大多是最小化通信开销。这当然重要通信往往是性能瓶颈。但在内存成为硬约束的场景下一个通信最优的策略可能导致内存使用爆炸根本无法启动训练。这就好比规划一条最快的物流路线却忽略了货车的载重限制结果车根本装不下货路线再快也无用。因此我们团队将目光转向了一个更根本的优化目标最小化内存冗余。我们提出了一种基于整数线性规划ILP的自动并行策略生成方法。其核心思想不是去猜哪种并行组合好而是将整个策略搜索空间和内存成本精确地建模成一个数学优化问题然后丢给成熟的ILP求解器如COPT、Gurobi去算出那个在给定硬件约束下内存占用绝对最小的方案。实验证明相比Megatron-LM等SOTA方法我们的策略能减少高达67%的内存占用而吞吐损失微乎其微。这对于在有限显存下探索更大模型或更大批量训练具有直接的工程价值。2. 核心思路从经验搜索到数学优化2.1 为何选择整数线性规划ILP自动并行策略搜索的本质是一个组合优化问题。对于一个计算图中的每个算子如矩阵乘、卷积我们都有多种并行策略候选如DP按批次切分、Row-MP按行切分权重、Column-MP按列切分权重。整个图的策略是所有算子策略选择的一个组合其组合空间随算子数量和策略选项呈指数级增长。传统方法如动态规划如OptCNN或启发式搜索虽然能快速找到可行解但无法保证在复杂约束下尤其是多维度并行组合时找到全局最优解。而ILP恰恰擅长解决这类“从大量离散选择中挑出一个组合使其在满足一系列线性约束的前提下线性目标函数最优”的问题。我们的思路很直接定义决策变量为计算图中每个算子的每个候选策略定义一个0-1变量。选它为1不选为0。建立目标函数目标是最小化总内存冗余。我们将每个策略选择带来的内存开销后文详述量化为一个系数目标函数就是这些系数与对应决策变量的线性组合。添加约束条件唯一性约束每个算子必须且只能选择一个并行策略。数据流约束相邻算子间的策略选择必须兼容即前一个算子的输出张量分布格式必须能通过通信Resharding转换为后一个算子输入所需的分布格式。这可以转化为决策变量间的线性关系。硬件约束每张设备上的总内存占用量不能超过其物理显存。这需要对每个设备上的内存使用进行建模并添加不等式约束。这样一来寻找“最小内存冗余策略”这个模糊的工程问题就被转化成了一个精确的、可被高效求解器处理的整数线性规划问题。求解器返回的解就是理论上的内存最优策略。2.2 冗余内存成本模型量化每一份冗余要建立目标函数我们必须能精确计算任意一个并行策略在单个算子上的内存开销。关键在于识别并量化“冗余”。以最基本的矩阵乘法Y X W为例在反向传播中还需要计算对W和X的梯度。假设我们在一个由N个设备组成的并行组内进行训练。数据并行DP沿批次维度切分输入X和输出Y。但是模型权重W会在每个设备上完整复制一份。因此权重W带来的内存冗余是(N-1) * size(W)。size(W)表示W的元素数量。行模型并行Row-MP沿W的行输出神经元维度切分权重W和输出Y。此时输入X需要在设备间广播因此X是冗余的。冗余内存为(N-1) * size(X)。列模型并行Column-MP沿W的列输入神经元维度切分权重W和输入X。此时输出Y是冗余的。冗余内存为(N-1) * size(Y)。在实际的多维并行中例如同时使用DP、Row-MP、Column-MP假设并行维度分别为d,r,c满足d * r * c N那么一个矩阵乘法算子带来的总冗余内存M可以建模为M 1/(d*r*c) * [ d*(d-1)*size(W) r*(r-1)*size(Y) c*(c-1)*size(X) ]这个公式的直观解释是将总冗余按并行维度分摊到每个设备上。我们为Transformer中的各类算子如LayerNorm, Attention, GeLU都建立了类似但更精细的成本模型考虑了激活值、优化器状态采用ZeRO阶段2等内存占用。这个模型是我们ILP目标函数中系数的计算依据。2.3 辅助计算图将策略搜索转化为路径选择直接在整个计算图的原节点上定义ILP问题比较混乱。我们引入了一个精妙的转换构建辅助计算图。原始计算图节点是算子如MatMul, LayerNorm边是张量数据流。生成候选策略对于原始图中的每个算子节点枚举其在当前设备拓扑下所有可行的并行策略如DP-2, Row-MP-4等。每个策略成为辅助图中的一个节点。例如算子A有3种策略那么在辅助图中就对应A1, A2, A3三个节点。构建辅助图边如果原始图中算子A到算子B有一条边那么在辅助图中A的所有策略节点与B的所有策略节点之间都建立一条边。这条边的权重就是前一个算子选择某种策略输出、后一个算子选择另一种策略输入时所需要进行的数据重排Resharding带来的通信开销。同时每个辅助图节点即一个具体的策略选择本身也带有一个权重即执行该策略算子本身产生的通信开销如All-Reduce。经过这样的转换在原始计算图中为每个算子选择一个策略等价于在辅助计算图中为每个原始算子节点从其对应的策略节点集合中恰好选中一个节点。并且选中的所有节点必须构成一条从输入到输出的连通路径。这样策略搜索问题就变成了在辅助图中寻找一条路径使得路径上所有节点权重算子通信和边权重重排通信之和最小。而我们的目标是在此基础上同时最小化这条路径对应的内存冗余总和。3. 方法实现构建并求解ILP问题3.1 问题形式化基于辅助图GA (VA, EA)我们定义X_v: 二进制决策变量。当辅助节点v代表某个算子的某个策略被选中时为1否则为0。B_ij: 二进制决策变量。当辅助边(i, j)被选中即策略i到策略j的转换被采用时为1否则为0。M_ij: 边(i, j)所关联的内存冗余成本主要取决于目标算子。C_v: 选择节点v即采用该策略执行算子产生的通信体积。C_ij: 选择边(i, j)即进行策略间转换产生的重排通信体积。我们的整数线性规划问题如下目标函数最小化Minimize Σ_{(i,j) ∈ EA} (B_ij * M_ij) α * [ Σ_{v ∈ VA} (X_v * C_v) Σ_{(i,j) ∈ EA} (B_ij * C_ij) ]这里包含两部分第一部分是总内存冗余第二部分是总通信体积。α是一个超参数用于平衡内存优化和通信优化的权重。当α0时我们只优化内存α增大通信优化的权重增加。约束条件唯一选择约束对于原始图中的每个算子u其对应的所有辅助节点集合S_u中必须恰好选中一个策略。Σ_{v ∈ S_u} X_v 1 对每个原始算子u成立。流平衡约束对于每个辅助节点v如果它被选中X_v 1那么流入它的被选中的边数必须等于其原始算子的入度流出亦然。如果它未被选中X_v 0则流入流出它的边都不能被选中。这确保了被选中的策略节点构成一条合法数据流路径。Σ_{(i,v) ∈ EA} B_iv X_v * in_degree(original(v))Σ_{(v,j) ∈ EA} B_vj X_v * out_degree(original(v))内存约束对于每个物理设备k其上所有被选中的算子策略所分配的张量、激活、参数等内存总和必须小于设备显存容量Mem_k。这需要根据每个策略节点v对设备k的内存贡献mem_vk来建立线性不等式。Σ_{v ∈ VA} (X_v * mem_vk) ≤ Mem_k 对每个设备k成立。3.2 求解与策略生成我们将上述ILP模型输入到商用或开源的ILP求解器实验中使用了Cardinal Optimizer - COPT。求解器会返回一组使目标函数最小化的X_v和B_ij的值0或1。后处理根据X_v 1的节点我们就知道每个原始算子应该采用哪个并行策略。根据B_ij 1的边我们就知道算子间数据重排所需的通信操作如All-Gather, Reduce-Scatter, All-to-All等。这些信息共同构成了一个完整的、内存最优的并行执行计划。实操心得超参数α的调优α的选择是一个权衡艺术。在我们的实验中α1通常能取得内存和吞吐的良好平衡。如果你想在内存极其受限的环境下例如想尝试更大的批量大小挤出每一分显存可以将α设为0.1甚至0.01让求解器极度偏向内存优化。反之如果你对吞吐更敏感可以适当增大α如5或10。一个实用的技巧是进行小规模如2-4卡的网格搜索快速测试几个α值如0.01, 0.1, 1, 10下的策略和实际运行性能再扩展到大规模任务。4. 实验验证与结果分析我们在一个8卡A100每卡80GB的服务器上进行了验证对比了我们的方法ILP-MinMem与三个主流基线Megatron-LM手动设计并行策略的标杆通常采用专家经验配置数据、张量和流水线并行。Alpa以最小化通信为目标的自动并行框架同样使用ILP但优化目标不同。Colossal-Auto另一个自动并行系统集成了多种并行模式和优化。测试模型为不同规模的Transformer编码层BERT-Large, 1.7B, 3.6B, 7.5B参数。4.1 内存节省效果下表展示了在4卡配置下运行单层Transformer前向与反向传播的峰值内存占用对比单位MB模型Megatron-LMAlpaColossal-AutoILP-MinMem (Ours)内存节省 vs MegatronBERT-Large219.22158.90331.64148.7032.2%1.7B31,043.4627,606.4615,708.4210,575.9065.9%3.6B41,419.4235,070.5416,136.2413,568.8767.2%7.5B43,822.8035,633.6341,862.8618,219.2658.4%关键发现显著的内存削减我们的方法在几乎所有场景下都实现了最低的内存占用相对于Megatron-LM最高节省了67.2%的显存。这意味着在同样的8卡A100上原本只能跑批量大小为16的3.6B模型现在可能可以尝试批量大小32甚至64这对于训练稳定性至关重要。与通信优化目标的差异Alpa以通信最小化为目标其内存占用通常介于Megatron和我们的方法之间有时甚至更高如7.5B模型。这验证了通信最优不等于内存最优。在某些模型结构下为减少通信而选择的策略可能导致更高的内存冗余。Colossal-Auto的波动Colossal-Auto的结果波动较大在1.7B和3.6B模型上表现极好甚至优于我们但在其他场景下又较差。这可能与其集成的更复杂的策略搜索和内存优化如激活检查点的交互有关也说明了自动并行问题的复杂性。4.2 吞吐性能对比内存省了那速度会不会慢下图对比了归一化后的训练吞吐以Megatron-LM为基准1.0[图示四个模型在4卡下的吞吐对比我们的方法Ours的柱状图高度在0.97到1.23之间与Megatron-LM互有胜负但差距均在±25%以内。]结论令人振奋在实现大幅内存节省的同时我们的方法在吞吐上并未落后甚至在一些场景下如1.7B模型还有所提升。这是因为内存减少间接降低通信更少的内存冗余意味着需要跨设备同步的数据量也相应减少。例如ZeRO阶段2通过切分优化器状态和梯度在减少内存的同时用Reduce-Scatter/All-Gather替代了All-Reduce有时通信量更优。负载更均衡ILP求解器在考虑内存约束的同时实际上也促使计算和通信负载在设备间分布得更加均衡避免了某些设备因内存过载而成为瓶颈。4.3 策略生成效率有人可能担心ILP求解耗时。实测表明对于单层Transformer的计算图在2、4、8卡设备拓扑下生成策略的时间分别仅为0.02秒、0.05秒和0.23秒。这相对于动辄数天甚至数周的模型训练时间来说完全是微不足道的开销。ILP求解是一次性的、离线进行的其带来的内存收益却是贯穿整个训练过程的。5. 实操指南与避坑要点如果你想在自己的项目或研究中使用这种思路以下是一些关键步骤和注意事项5.1 实施步骤计算图提取使用PyTorch的fx.symbolic_trace、JAX的jax.jit后分析或直接解析模型定义获取静态前向计算图。需要包含每个算子的输入/输出张量形状、类型信息。策略枚举根据你的硬件拓扑如4机x8卡为每个算子枚举可行的多维并行策略DP, TP, PP的组合。注意流水线并行PP作为算子间并行需要特殊处理通常先划分流水线阶段再在每个阶段内应用我们的ILP方法进行算子内并行策略搜索。成本模型实现为你关心的每种算子类型MatMul, Convolution, LayerNorm, AllReduce等实现冗余内存成本函数和通信成本函数。通信成本需要估算不同通信原语All-Reduce, All-Gather等在特定张量形状和网络带宽下的体积或时间。构建ILP模型使用Python的ortools、python-mip或商业求解器的API根据第3部分的形式化描述构建模型。这一步代码量最大需要仔细处理约束的构建。求解与部署调用求解器获取策略然后将策略转换为具体框架如PyTorch DeepSpeed的并行配置。可能需要编写一些包装代码将抽象的“策略”映射到具体的DistributedDataParallel、TensorParallel模块的初始化参数上。5.2 常见问题与排查求解器返回“无可行解”原因通常是约束过紧特别是设备内存约束。可能枚举的策略中即使是最省内存的组合也超过了单卡容量。排查首先检查内存成本模型是否准确高估。其次考虑启用更激进的内存优化技术作为基础例如激活检查点Gradient Checkpointing大幅减少激活值内存但会增加一次重计算。混合精度训练AMP使用FP16/BF16将参数和激活内存减半。ZeRO阶段3进一步切分模型参数几乎消除参数冗余但增加通信。解决在构建ILP模型前先将这些优化技术应用后的“基础内存占用”计入成本模型或者放宽内存约束如果允许使用CPU卸载等更高级技术。生成的策略吞吐极差原因α值设置过小导致求解器完全不顾通信选择了通信量巨大但内存稍省的策略例如过度使用需要大量All-to-All通信的复杂张量并行。排查分析ILP结果中通信成本部分的贡献。使用性能分析工具如PyTorch Profiler, NSight Systems定位通信瓶颈算子。解决调大α值在内存和通信间重新权衡。也可以为通信成本添加更精细的模型例如考虑网络拓扑NVLink vs PCIe和通信延迟而不仅仅是体积。策略在动态控制流模型中失效原因我们的方法基于静态计算图。如果模型有复杂的条件判断或循环如Transformer解码器的自回归生成静态图无法准确描述其执行路径。解决对于这类模型需要将动态控制流展开为可能的静态子图或采用动态编译/运行时优化技术。这是一个前沿挑战通常需要框架层面的深度支持。5.3 进阶优化方向分层优化对于超大规模模型直接对整个计算图进行ILP求解可能变量太多。可以采用分层方法先进行流水线并行PP的切分将模型分成几个大的阶段然后在每个阶段内部使用我们的ILP方法优化数据并行DP和张量并行TP的组合。集成学习成本可以将实际运行一次迭代的耗时包括计算和通信作为反馈用于迭代修正成本模型中的系数尤其是通信时间估计使模型预测更接近真实硬件。多目标优化除了内存和通信还可以将目标函数扩展为包括计算负载均衡、能耗等多个指标通过加权和或帕累托前沿搜索来获得更全面的最优策略。6. 总结与展望将自动并行策略搜索形式化为一个整数线性规划问题并专注于最小化内存冗余为我们打开了一扇新的大门。它不再依赖于启发式规则或昂贵的强化学习试错而是通过严谨的数学模型直接逼近给定硬件约束下的理论最优解。我们的实验充分证明了其在节省显存方面的巨大潜力而这正是当前大模型训练中最稀缺的资源。当然这套方法并非银弹。它对成本模型的准确性依赖很高而精确建模现代GPU内存 hierarchy如HBM、L2 Cache和复杂通信拓扑下的性能并非易事。此外对于极端动态的模型或异构计算环境还需要更多的扩展。但无论如何这条基于优化理论的路径给出了一个清晰的方向将复杂的系统级调优问题转化为可计算、可求解的数学问题。对于工程师而言这意味着我们可以从无尽的“调参-跑实验-崩溃”循环中部分解放出来让求解器帮我们算出那个在内存红线内“最优”的并行方案。在模型规模不断冲击硬件极限的今天这种确定性的优化手段其价值会愈发凸显。我们下一步计划是将该算法集成到更通用的训练框架中并探索在千卡集群上的扩展性让更多团队能更容易地训练起自己的“大模型”。