本文目录 · 16 节
- 一、Hydro 怎样重组 HPO 作业
- 二、HPO 前置:trial、搜索算法、目标与资源曲线
- 三、为什么常见 baseline 失败:大模型贵、小模型又喂不饱 GPU
- 四、MU parametrization 前置:宽度改变为何会破坏超参数迁移
- 五、MU 的公式与具体例子:为什么普通更新会爆,最大更新不会
- 六、系统架构与完整生命周期:Tuner 和 Coordinator 如何接力
- 七、Model Shrinker:trace、缩放、参数化与失败防护
- 八、Inter-trial fusion:把许多模型变成一个批量模型
- 九、Intra-trial fusion:为什么编译优化必须懒触发
- 十、Adaptive fusion 与 Eager Transfer:调度规则和伪代码
- 十一、Bubble Squeezer:把流水线空泡变成可暂停的调优时间
- 十二、异构分配与弹性执行:旧卡、释放资源、拆分优先
- 十三、实现、接口与一个可操作的复现流程
- 十四、端到端实验:工作负载、准确数字与正确解读
- 十五、消融、开销与 Coordinator 实验告诉了什么
- 十六、局限、适用边界与复现检查表
一、Hydro 怎样重组 HPO 作业
Hydro 面向数据中心里的超参数优化(hyperparameter optimization,HPO)作业。一个 HPO 作业不是一次训练,而是同一模型架构在许多超参数配置下的多次训练;每一次训练称为一个 trial。传统服务把 trial 当互不相关的普通训练任务:目标模型有多大,每个 trial 就训练多大的模型;申请了多少 GPU,调优期间就一直占着多少 GPU。Hydro 看到两个被浪费的结构。第一,同一 HPO 作业中的模型结构几乎相同,只是学习率、批大小、动量等参数不同。第二,多保真算法会持续淘汰差的 trial,作业的并行需求天然递减,却被集群调度器当成固定资源黑盒。
Hydro 的回答是一条相互补缺的链。它先把目标模型按宽度缩成代理模型,用 MU parametrization(最大更新参数化)维持超参数排序的可迁移性;缩小后单个 trial 太轻,GPU 反而更空,于是把许多同形 trial 沿新增维度融合成一个大执行单元;trial 被淘汰后,再动态重组 fusion,提前把当前最优配置迁回目标模型。集群层还从流水线大模型的 bubble 借临时算力,把低利用率任务放到旧 GPU,并在资源变化时优先拆分融合 trial,而不是盲目增加分布式通信。
只缩模型在端到端消融中几乎没有收益。Hydro 依靠一组连续动作取得效果:缩放降低每个 trial 的工作量,跨 trial 融合恢复设备利用率,生命周期调度处理递减并行度,Coordinator 再利用数据中心的异构和短暂资源。论文在六个工作负载上,相对 Ray 的单保真 makespan 缩短 8.7~78.5 倍,多保真缩短 5.8~33.4 倍,同时最终模型质量没有下降。
二、HPO 前置:trial、搜索算法、目标与资源曲线
监督训练可写成:给定模型参数 θ、训练数据和超参数配置 h,训练过程产生 θ*(h),验证函数返回质量 Q(h)。HPO 求的是 h* = argmax_h Q(h)(若指标是 loss 或 perplexity 则取最小)。h 可以包含学习率、批大小、动量、学习率衰减因子和调度器。模型权重 θ 在每个 trial 内通过梯度下降学习;超参数 h 通常由外层搜索器选择,两者不能混为一谈。
单保真算法让每个配置训练到相同预算。论文用 Random:随机生成配置并完整评估,简单、并行性高,但昂贵。多保真算法给差配置较少预算、好配置更多预算。论文用 ASHA(异步逐次减半):trial 到达里程碑后与同 rung 的结果比较,差者提前停止,优者晋级。它节约总计算,却造成一条明显的资源曲线:开头有大量 trial,随后越来越少。固定申请 GPU 会在后半程留下空卡;一开始只申请少量 GPU 又拖慢探索。
论文引用的生产观察是,约 90% 的模型需要 HPO,每个 tuning job 的 trial 数中位数为 75。作者集群与 Alibaba trace 中,GPU 利用率超过 50% 的 GPU 分别只占 35% 与 16%。这里有两类低效:单 trial 不一定能吃满卡,作业内活跃 trial 数还会下降。Ray+ES 代表传统增强方案:用 MPS 在一张卡共置多个进程,有空卡时给领先 trial 增加资源。它仍没有利用“所有 trial 结构相同”和“超参数可在不同宽度间迁移”这两个语义。
Hydro 优化的主要时间指标是 tuning makespan,即从调优开始到得到并训练出最终目标模型的墙钟时间。它不是只计算搜索器停止的时刻:论文明确把目标模型训练时间计入 Hydro。质量指标则是语言模型 perplexity(越低越好)或分类 accuracy(越高越好)。因此,一个系统若很快筛完小模型,却迟迟没有训练目标模型,并不能算完成。
三、为什么常见 baseline 失败:大模型贵、小模型又喂不饱 GPU
最直接的 baseline 是在完整目标模型上跑 Ray Tune。它保持语义简单,却把相同架构的权重、激活、梯度、优化器状态和框架上下文复制数百次。大模型的单 trial 甚至需要分布式训练,HPO 成本近似“单次训练成本乘以 trial 数”。当 GPT-3 XL 有 100 个配置时,完整实跑 Ray 的代价高到论文只能用模拟估计其时间,并用官方超参数训练结果作为质量基线。
第二个 baseline 是 GPU sharing。MPS 允许多个 CUDA 进程共享 GPU,但每个 trial 仍有独立 Python/深度学习框架上下文、数据加载路径和 kernel launch。它减少空闲,却没有合并相同算子,也没有减少模型本身的状态。MIG 性能相近且切分更不灵活,因此论文未采用。Ray+ES 再给表现好的 trial 弹性增卡,但对小型单卡模型,共享带来的收益有限;对大模型,后半程增加数据并行也只覆盖生命周期的一小段。
第三个看似合理的 baseline 是只缩小模型。设宽度缩放比为 S = w_target / w_surrogate。许多全连接或卷积计算同时依赖输入与输出宽度,所以 FLOPs 近似降到 1/S²;显存里参数相关部分会缩小,但框架、固定张量和部分激活不同比例变化,论文用 M(S) ≈ c₁/S + c₂ 描述。结果是每个代理模型计算得极快、占用较少,却发射许多小 kernel,现代 A100 的 SM 吃不满。消融验证了这一点:S=8 但关闭 inter-trial fusion 时,整体相对 Ray 只得到很有限的改善。
Hydro 的设计约束由此产生:代理模型必须显著减少每个 trial 的计算,且多个代理 trial 必须共享框架、输入和 kernel;搜索后半程还要把释放的资源转化成目标模型验证,而不能任其空闲。任何只满足其中一项的方案都会把瓶颈推到下一层。
四、MU parametrization 前置:宽度改变为何会破坏超参数迁移
普通参数化并不保证同一个学习率在不同宽度上含义相同。网络变宽后,一层包含更多坐标;若仍沿用 Xavier 初始化和统一学习率,某些层的输出或更新会随宽度放大,另一些层却趋近于零。于是窄模型上最好的学习率、动量未必在宽模型上仍最好。Hydro 依赖的 MU parametrization 基于 Tensor Programs,覆盖 MLP、RNN/LSTM、残差连接、卷积、图卷积、池化、批归一化、层归一化与 attention 等常见组件。
其核心目标是:在宽度趋于无穷的极限下,训练任意时刻的激活向量坐标仍保持大致独立同分布,并让不同层的更新幅度在改变宽度后处于同一量级。它按层区分输入权重、隐藏权重、输出权重和 bias,分别调整初始化方差与优化器学习率。输出层更新通常比输入层快,因此需要按宽度抑制;SGD 是线性 tensor update,Adam 会逐坐标归一化梯度,两者的缩放规则也不同。
Hydro 把理论变成相对于目标模型的缩放规则。设代理宽度是目标的 1/S。输出层采用零方差初始化,在输出层前插入 Multiply(S);隐藏层初始化方差乘 S,SGD 与 Adam 的学习率都乘 S;输入层初始化方差乘 S,若用 SGD,学习率除以 S;输出层若用 SGD,学习率也除以 S。所有 bias 零初始化。prepare_optimizer 根据层类型生成对应的 hydro_optimizer,避免用户手工为每个参数组写规则。
迁移的真正对象是配置的相对优劣,而不是保证窄模型和宽模型得到相同准确率。HPO 本质是排序:只要窄模型把优秀配置排在前面,最终在目标模型上验证即可。论文在 ResNet-18 上随机选十组 [batchsize, lr, momentum],比较 S=1,2,4,8。G 与 H 在 S≥4 时交换,但它们本来都较差;顶部配置排序保持一致。同一配置下宽模型通常质量更高,这不妨碍用窄模型筛选。
五、MU 的公式与具体例子:为什么普通更新会爆,最大更新不会
论文用一隐藏层线性模型说明宽度缩放。令标量输入输出模型为 f(x)=VᵀUx,隐藏宽度为 w,且 U,V∈R^(w×1)。常规初始化取 V~N(0,1/w)、U~N(0,1),初始输出保持 Θ(|x|)。若学习率为 1,一步 SGD 可抽象成 V'=V+θU、U'=U+θV,其中 θ=Θ(1) 由样本、标签与损失决定。
更新后的输出展开为:
f'(x) = V'ᵀU'x
= (VᵀU + θUᵀU + θVᵀV + θ²UᵀV)x
由大数定律,UᵀU=Θ(w),所以第二项随宽度增长,极限下爆掉。普通参数化只能把学习率降到 O(1/w) 才保持数值有界,但这样宽度增大时学习率趋零,网络接近固定随机特征的 kernel limit,无法进行充分的 feature learning。
MU 改为 V~N(0,1/w²)、U~N(0,1),并设两组学习率 ηV=1/w、ηU=w。一步后的对应展开为:
f'(x) = (VᵀU + θw⁻¹UᵀU + θwVᵀV + θ²UᵀV)x
此时 w⁻¹UᵀU=Θ(1),其余项也保持有界,参数又能以不导致溢出的最大尺度更新。这就是“maximal update”的含义。Hydro 不要求用户推导任意网络的闭式解,而是将输入、隐藏、输出层归类后自动应用规则,并对特殊组件做启发式适配。
Transformer 需要额外处理:attention logit 使用 1/d_k 而不是常见的 1/√d_k,query 层零初始化;论文还经验性发现更长 sequence length 的迁移效果更好。这些规则表明理论不是任意架构的无条件保证。MoE 等特殊结构可能需要单独分析。Hydro 的正确姿势是先用自动检查拦住明显失配,再在目标模型上验证当前最好配置,而不是把代理排名当证明。
六、系统架构与完整生命周期:Tuner 和 Coordinator 如何接力
Hydro 分成两个边界清楚的组件。Hydro Tuner 是用户与 HPO 框架一侧的接口,负责生成代理模型、融合 trial、调用搜索算法并规划目标模型验证。Hydro Coordinator 是数据中心调度器一侧的接口,负责临时 bubble 资源、异构 GPU、资源释放和弹性执行。前者即使没有特殊集群也能独立使用;Bubble Squeezer 与异构分配器只有在对应资源存在时才启用。
一次作业的完整状态流如下。用户像 Ray Tune 一样给出训练函数和 search space,再用 Hydro API 包装 model、dataloader、optimizer,并指定 S。Model Shrinker 通过 HydroTracer 把目标模型变成规范图,缩放层宽并执行 Hydro 参数化;开头用少量 profiling step 检查激活幅度。搜索器生成配置,Trial Planner 按算子 shape 分组,测量显存并确定每组最大 fusion count。Trial Binder 把各组变成 HydroTrial,Elastic Executor 放到已分配 GPU 或临时 bubble 上。
训练过程中,Random 会让所有 trial 完成,ASHA 则不断停止落后者。Planner 收到结束、暂停或晋级事件后重组 HydroTrial:某个融合容器里不再需要的 submodel 被 defuse,剩余 trial 可重新打包。完成比例达到默认 50% 且有空闲资源时,Eager Transfer 用当前最佳配置创建完整宽度的 TargetTrial。后续找到更好配置时,系统依利用率决定终止旧 TargetTrial,或保留旧实例并并行启动新的验证。
资源变化贯穿整个流程。Coordinator 可把流水线 bubble 标成 ephemeral GPU time;旧 GPU 适合低 SM activity 的单独 TargetTrial;空闲 bundle 超过一分钟便归还集群。新 GPU 到来时,融合 trial 先拆成更多独立 HydroTrial,避免数据并行通信;无法融合的大代理模型才用分布式训练,目标模型则可自动扩大 worker 数。最终搜索器不再产生候选,系统等待最优 TargetTrial 完成,返回目标宽度模型及其超参数。
七、Model Shrinker:trace、缩放、参数化与失败防护
PyTorch 模型写法多样,同一种线性层既可能是 torch.nn.Linear,也可能通过 functional API 出现在图里。HydroTracer 基于 torch.fx,先把 call_function 节点替换成对应 call_module 节点,使后续缩放和 fusion 都面对统一模块。遇到依赖数据的控制流,则使用 proxy node 和开发者给出的 concrete value 固定实际执行分支。
缩放不是把每个数字机械除以 S。隐藏层的 in_features 与 out_features 都除以 S;输入层只缩 out_features,因为外部输入维度不变;输出层只缩 in_features,类别数或词表输出维度也不能变。之后按上一节的输入、隐藏、输出规则重初始化,插入输出前乘法,并建立按层参数组。默认 S=8,端到端 XL 工作负载使用 S=16。
Hydro 对 TorchVision 的 ResNet、MobileNet、VGG,以及 HuggingFace Transformers 的 BERT、GPT、Swin 做过 trace 与 scaling,无需修改模型源码。但“能 trace”不等于“超参数一定可迁移”。系统先做逐层宽度检查,避免 Linear 被缩到只有一个 neuron;随后在 HPO 开始时跑极少 profiling step,检查每个 activation vector 的平均 L1 大小是否有界。它类似 gradient check:不能证明所有训练阶段正确,却能在耗费大量 GPU 前发现明显的参数化失败。
可迁移范围主要是初始化与训练动态相关的超参数,例如 learning rate、batch size、lr scheduler、momentum。Weight decay 和 dropout 同时依赖模型规模与数据规模,不能可靠迁移;Hydro 建议先用代理模型调其余维度,必要时再在目标模型的小空间内调正则项。实验 search space 主动排除了 weight decay。用户也不能提供自定义初始化,因为 Hydro 必须接管逐层重新初始化。
八、Inter-trial fusion:把许多模型变成一个批量模型
Trial Binder 利用同一 HPO 作业的结构一致性,把多个代理模型沿额外的 trial 维融合。设 fusion count 为 F。普通 torch.nn.Linear 对一个模型做矩阵乘加;hydro.nn.Linear 用 torch.baddbmm 执行批量矩阵乘加,让权重多出大小为 F 的第一维。卷积等支持算子也有数学等价的 grouped 实现。每个 submodel 有独立权重、初始化、优化器状态与学习率调度器,所以不同学习率的配置不会互相混合。
这种融合不同于把样本 batch 变大。样本 batch 中的样本共同更新一套权重;trial 维中的每个切片更新自己的权重。也不同于 MPS:MPS 只是让多个进程并存,Hydro 共用框架上下文、数据加载和较大的 kernel launch,减少固定显存与 I/O 重复。hydro_optimizer 和 hydro_lr_scheduler 同时支持 MU 参数组与 trial 独立状态。每个 grouped operator 还实现 defusion,可抽取指定 submodel 的权重和状态,供淘汰、迁移或拆分。
具体例子:假设有 32 个 ResNet-18 代理 trial,结构和 batch size 都相同,只是学习率、动量不同。Planner 可令 F=8,形成 4 个 HydroTrial。每个执行一次 fused Linear/Conv,相当于并行推进 8 套独立模型;ASHA 淘汰其中三个后,Binder 抽出其余五套状态,下一轮可同别组存活者重新融合。训练语义不变,执行形态随 trial 集合变化。
在 A100 上以 S=8 训练 ResNet-18/CIFAR-10、batch size 256,单卡最多融合 676 个模型。相对 MPS,Hydro 的训练吞吐超过 10 倍,显存节省超过 20 倍。若不缩放,直接融合完整目标模型,吞吐提升有限;这再次说明 scaling 与 fusion 互为条件。论文还比较了三组只在学习率上不同的 trial,融合与独立训练的 loss 曲线重合,验证了算子变换的数学等价性。
九、Intra-trial fusion:为什么编译优化必须懒触发
Inter-trial fusion 是跨模型向量化;intra-trial fusion 是模型内部的算子融合。后者由 nvFuser JIT 编译,把相邻 memory-bound 操作合成 kernel,减少中间张量读写与 launch。两者名称接近,却解决不同开销:前者扩大一次执行的并行工作量,后者改善一个 fused 模型内部的内存局部性。
编译并非免费。论文测得 nvFuser 编译 ResNet-18 约耗费 2 个 epoch 的时间,之后每个 epoch 只快约 10%。粗略回本条件是:若原来每 epoch 时间为 T,编译花 2T,每轮省约 0.1T,至少运行约 20 epochs 才抵消编译成本。ASHA 中多数差 trial 几个 epoch 就会停止,若一开始全部编译,优化反而使作业变慢。
Hydro 因而采用 lazy intra-trial fusion,只对训练步数确定且足够长的执行启用。单保真算法中的 HydroTrial 会完整训练,可以编译;用迁移超参数训练完整目标模型的 TargetTrial 也适合编译。多保真早期 rung 的短命 trial 不值得编译。消融显示 intra-trial fusion 对小模型的增益有限,远小于 inter-trial fusion;系统没有为了“所有 trial 都编译”牺牲实际 makespan。
十、Adaptive fusion 与 Eager Transfer:调度规则和伪代码
不同 batch size 会改变算子 shape,不能放进同一个 grouped operator。Planner 先按 batch size 分成 trial group。对每组只 profile F=1 与 F=2,利用显存随 F 近似线性增长来估计不 OOM 的 Fmax。组权重定义为 Wg = Bg × Ng,其中 Bg 是 batch size,Ng 是该组 trial 数;可用 GPU 按权重分配,再在组内均匀打包,尽量使用所有 GPU 并提高全局吞吐。
输入:搜索器 A,可用 GPU 集合 G,缩放比 S
configs ← A.generate()
groups ← 按 operator shape(主要是 batch size)划分 configs
for each group g:
测量 M(g,1), M(g,2)
由近似线性显存增长估计 Fmax[g]
weight[g] ← batch_size[g] × trial_count[g]
按 weight 将 G 分给各组
for each group g:
均匀切分 trial,每份大小不超过 Fmax[g]
Binder.bind(每份) → HydroTrial
while 存在未完成 trial:
执行 HydroTrial,并把指标报告给 A
淘汰/完成时 defuse,按存活集合重新打包
if 完成比例 ≥ 50% and 有空闲资源:
best ← 当前最好配置
启动完整宽度 TargetTrial(best)
if 出现更好配置:
若资源紧张则终止旧 TargetTrial,否则并行验证
返回已验证的最佳目标模型
默认 50% 阈值可配置。Eager Transfer 的目的不是提前宣告搜索结束,而是把目标模型训练隐藏在后半段搜索之中。假设 100 个 ASHA trial 已有 50 个结束,剩余并行度下降并空出一张 GPU;系统立即用当前第一名训练目标模型。到第 70 个结束时出现新第一名:若 GPU 忙,停止旧目标验证以免浪费;若仍有空卡,则并行保留两个候选。15 分钟 deadline 实验的优势正来自这种重叠。
十一、Bubble Squeezer:把流水线空泡变成可暂停的调优时间
同步 pipeline parallel 把大模型切成多个 stage,1F1B 调度交替执行一个 forward 与一个 backward。由于 stage 之间存在依赖,worker 不能始终计算。例如第一个 worker 做完最后一个 microbatch 的 forward 后,要等待第一个 microbatch 的 backward 返回;等待区间就是 bubble。不同 stage 保存的 activation 数量还不一样,造成峰值显存不均。长期大模型预训练占据大量 GPU 数天或数周,这些 bubble 中的 SM 与剩余显存是短暂、分散且周期性的资源。
HydroTrial 适合填泡有三个原因。HPO 对个别 trial 变慢较宽容;Hydro 已 profile 每个 fused trial 的显存与资源模式,能降低共置 OOM 风险;代理模型很小,fusion count 又能按剩余显存调整,通常无需把权重换出 GPU。Coordinator 向集群调度器取得流水线作业的 GPU,并标记为 ephemeral resource。它在 Hydro 的规范化模块上注册逐层 hook,在 DeepSpeed 大模型侧也注册 hook,报告训练进度和资源占用。
实现上,Hydro 检查 NCCL kernel 的 CUDA stream 状态,确认大模型处在通信/等待 bubble 才允许 HydroTrial resume;bubble 起止由 Linux signal 控制 trial 恢复与暂停。细粒度控制的意义在于不让两边的计算 kernel 同时争 SM。普通直接 colocation 没有这层同步,实验中使 GPT 吞吐下降约 12%;Bubble Squeezer 则未观察到明显 GPT slowdown。
论文图示在四 stage、四 microbatch 的 1F1B 中穿插四个不同大小 HydroTrial。实际效果取决于条件:多保真算法更好,因为短命 trial 可用临时资源完成,领先 trial 再转独占卡;层数少的代理模型更容易在一个 bubble 内完成 iteration;流水线 stage 和服务器越多,bubble 比例与临时卡越多。若代理模型即使缩放后仍放不进剩余显存,Hydro 不采用 offload,因为换入换出太贵,此时 Bubble Squeezer 不能工作。
十二、异构分配与弹性执行:旧卡、释放资源、拆分优先
Heterogeneity-Aware Allocator 同时做 autoscaling 与设备代际匹配。若节点或 GPU 连续空闲超过 1 分钟(阈值可配),Hydro 与集群调度器交互,连同 CPU 等附属资源一起释放 bundle。这样后半程不会继续占住开头为高并行探索申请的规模。若队列里还有其他 HPO 作业,低利用率的代理 trial 也可降级到旧设备。
Eager Transfer 产生的 TargetTrial 通常独立运行,无法从 inter-trial fusion 获益。如果 DCGM 测得其 SM Activity 低于 50%(可配置),Hydro 优先放到 V100 等旧 GPU,把 A100 留给能发挥新卡吞吐的工作。规则依据利用率而非“目标模型一定上新卡”的直觉,优化的是全局效率,同时避免明显延长当前作业。
Elastic Executor 收到新 GPU 时先判断执行形态。对 fused HydroTrial,最好的扩展往往是均匀 defuse 成多个 HydroTrial,各占一张卡,无需梯度同步。假设 F=16 的容器原在一张卡,新来三张卡,可拆成四个 F=4 的容器;相比让一个融合模型做四卡数据并行,这种方式没有跨卡通信。对因模型过大而无法融合的代理 trial,有“平均分配”和“performance-aware”两种策略,默认把空闲 GPU 给当前表现最好者。对完整 TargetTrial,系统才自动增加 worker,使用分布式训练。
这一组规则体现了 Hydro 与普通弹性训练的差别:资源变化时先利用 trial 之间天然独立的并行,再使用模型内部数据并行。前者通信为零,后者需要同步梯度。只有当 trial 不能再拆,或目标模型本身太大时,Ray Train 与 PyTorch FSDP 才接管。
十三、实现、接口与一个可操作的复现流程
Hydro 基于 Ray 实现,约 12K 行代码。Model Shrinker 使用 torch.fx 与 mup;Trial Binder 建在 HFTA 与 nvFuser 上;Coordinator 修改 DeepSpeed,以原型形式支持 bubble interleaving;Elastic Executor 使用 Ray Train 和 PyTorch FSDP。用户保留 Ray Tune 风格的 search space 与 training function,只需把模型、dataloader、optimizer 换成 Hydro 包装,并给出 scaling ratio。论文评测把 Tuner 与 Coordinator 分开,以免把临时集群资源混进 Tuner 对 Ray 的固定资源比较。
测试节点每台有 8 张 A100 80GB、两颗 AMD EPYC 7742(合计 128 cores)和 1TB 内存;节点内为 NVLink/NVSwitch,节点间为 200Gbps HDR InfiniBand。除明确的异构实验外均使用 A100。复现时先固定硬件、数据预处理、随机种子、混合精度和每个 trial 的训练预算,否则 makespan 与最大 fusion count 不可比。
建议按下列可验证顺序复现机制,而不是一开始就搭完整数据中心:
- 在 ResNet-18/CIFAR-10 上选十组
[batchsize, lr, momentum],固定 seed 和 100 epochs,分别跑S=1,2,4,8,比较排序而非绝对准确率。 - 挑选 shape 相同、只在学习率上不同的配置,分别独立与 fused 训练,核对 loss 曲线和最终权重指标;验证 defusion 后状态可继续训练。
- 测
F=1,2的显存,验证线性外推的Fmax不 OOM;扫描F、S和 AMP,记录吞吐、显存与 SM Activity。 - 固定 GPU 数运行 Random 与 ASHA,对比 Ray、Ray+ES、Hydro;计时必须包含目标模型训练,并单列 profiling 与 defusion 开销。
- 最后才复现 Coordinator:先验证直接共置的干扰,再接入 DeepSpeed 1F1B hook,记录大模型吞吐、bubble 内 SM Activity 与 HydroTrial 相对独占吞吐。
伪接口可理解为:HydroTracer(target, S) 生成代理图,prepare_optimizer 应用分层规则,Planner 从搜索器接收 trial,Binder 用 hydro.nn 打包,Executor 执行并将指标回报搜索器。真实 API 名称以存档实现为准;复现的关键不是照抄一段调用,而是逐层确认“排序可迁移、融合语义等价、调度确实利用递减需求”。
十四、端到端实验:工作负载、准确数字与正确解读
六个工作负载覆盖语言模型与视觉模型:GPT-3 XL/OpenWebText、Transformer/WikiText-103、WideResNet-50/ImageNet、MobileNetV3-Large/Flowers102、VGG-11/CIFAR-100、ResNet-18/CIFAR-10。优化器包括 SGD、Adam、AdamW,所有任务使用 StepLR,每个固定步长按 gamma 衰减学习率。视觉搜索空间包含量化对数均匀学习率、动量、[128,256,512] 批大小与 gamma;MobileNetV3-Large 使用 Adam,排除不兼容的 momentum。WideResNet 与两个语言任务启用混合精度。
| 模型 | 单保真 GPU / trials | 相对 Ray makespan | 最终质量差异 | 多保真 GPU | 多保真加速 / 质量差异 |
|---|---|---|---|---|---|
| GPT-3 XL | 128 / 100 | 78.5× | -0.48 ppl | 64 | 33.4× / -0.43 ppl |
| Transformer | 8 / 200 | 8.7× | -0.15 ppl | 4 | 5.8× / -0.09 ppl |
| WideResNet-50 | 32 / 200 | 20.3× | +1.18% acc | 16 | 9.7× / +0.87% acc |
| MobileNetV3-Large | 16 / 500 | 12.3× | +0.05% acc | 8 | 8.0× / +0.08% acc |
| VGG-11 | 8 / 500 | 10.8× | +0.09% acc | 4 | 9.4× / +0.19% acc |
| ResNet-18 | 8 / 1000 | 16.2× | +0.02% acc | 4 | 14.5× / +0.05% acc |
单保真用 Random,每项重复两次并报告平均;XL 用 S=16,其余默认 S=8。语言模型 ppl 降低与视觉 accuracy 增加都表示 Hydro 更好。最大 78.5 倍不能脱离脚注:GPT-3 XL 的 Ray 时间来自模拟,质量 baseline 是官方超参数,不是完整 Ray HPO 实跑。Hydro 的时间包含目标模型训练。大模型收益更高,因为缩放可让原本分布式的代理 trial 变成单卡任务;小模型主要靠 fusion 提高并发与利用率。
多保真使用一半 GPU,ASHA 参数为 bracket=1、grace=3、reduction=3,加速为表中 5.8~33.4 倍。更高并发也减少 ASHA 因候选到达不足而错误晋级的问题。最终质量略优,论文将其主要归因于 Hydro 初始化与更平衡的逐层训练速度,而不是声称代理模型总能提高泛化。
deadline 场景为 900 秒、4 GPU。VGG-11 的准确率从 Ray 65.42%、Ray+ES 66.39% 提升到 Hydro 68.68%;ResNet-18 从 89.66%、90.71% 提升到 91.32%。这里衡量固定时间内能交付多好的完整模型,Eager Transfer 把目标训练与代理搜索重叠,因此尤其有效。
十五、消融、开销与 Coordinator 实验告诉了什么
融合消融是整篇论文最关键的因果证据。关闭 inter-trial fusion,即使代理宽度已缩小 8 倍,Hydro 相对 Ray 也只有有限改善,因为小模型无法利用 GPU;恢复 inter-trial fusion 后才出现主要收益。关闭 intra-trial fusion 的影响较小,尤其在小模型上。这与设计预期一致:跨 trial 向量化解决的是主瓶颈,编译器优化只是长 trial 的附加收益。
缩放比敏感性实验扫描 S=1,2,4,8,16。随着 S 增大,累计 fused trial 峰值吞吐近似线性增加,整体 tuning time 持续下降,最终准确率保持稳定。AMP 又进一步提高峰值吞吐,并把最大 fusion count 近似提高 2 倍。不能据此无限增大 S:层宽检查、排序迁移与特殊架构仍构成上限,论文默认值停在 8。
ResNet-18 多保真工作负载的开销分解中,profiling 占 0.8%,defusion(含 trial restart)占 3.3%。DCGM 的 300 秒轨迹显示 Hydro 的 SM Activity 明显高于 Ray 与 Ray+ES。数字说明动态打包不是零成本,但相对于端到端加速较小;复现时应把这两项计入,而不能只报 steady-state kernel throughput。
Bubble Squeezer 在 4 个节点、32 张 A100、4 个 pipeline stages 的 GPT 工作负载上评测。原 GPT 的 bubble 里只有 NCCL 通信 kernel,SM Activity 约 2%;加入 F=16 的 ResNet-18 HydroTrial 后约 50%,trial 获得约其独占吞吐的 15%,未观察到明显 GPT slowdown。直接共置却使 GPT 慢约 12%。在 HPO 只能申请 1 张独占 GPU 的模拟里,bubble 资源把 makespan 缩短 2.7 倍。
异构实验使用 2 个 A100 节点与 2 个 V100 节点,共 32 张 GPU,从多保真表中的中型工作负载均匀抽取 20 个 HPO 作业,并在一小时内随机生成到达时间。与资源无感知分配相比,Heterogeneity-Aware Allocator 将平均 job completion time 缩短约 1.3 倍。这个结果是小型合成到达实验,不等同于长期生产 trace。
十六、局限、适用边界与复现检查表
Hydro 的代理调优有三条论文明确列出的硬限制。第一,weight decay、dropout 等正则超参数不能迁移,必要时要在目标模型上追加小范围搜索。第二,不允许自定义初始化,因为逐层自动重初始化是参数化成立的一部分。第三,MU 的数据假设是同一数据集上的 i.i.d. samples,因此 Hydro 不支持 fine-tuning。不能把它扩展解释成“用小基础模型搜索任意下游微调配置”。
系统层也有边界。Inter-trial fusion 要求 operator shape 相同;不同 batch size 必须分组,有少量层增删改的架构目前不能部分融合。MoE 等特殊组件可能需要专用参数化。Bubble Squeezer 依赖长期 pipeline-parallel 预训练、足够长的 bubble 和剩余显存;层太多、iteration 跨出 bubble、代理仍太大时不适用。Hydro 不做显存 offload。异构规则只显式观测 GPU/SM,CPU、网络带宽和数据加载争用尚未进入统一分配模型。
实验解释也要克制。Tuner 与 Coordinator 独立评测,没有给出所有机制同时开启的完整生产 trace;最大加速包含模拟 baseline;端到端结果每项只重复两次;论文证明的是所测模型和搜索空间中顶部排序足够稳定,不是任意网络的理论保证。最终质量略升不应被概括成普遍的精度增益。
复现或审阅实现时,可用下面的检查表收口:
- 确认 CJK 解释中的
S是目标宽度除以代理宽度,FLOPs 与显存近似式没有互换;输入、隐藏、输出层的缩放边界正确。 - 确认优化器按 SGD/Adam 和层类型应用不同规则,bias、输出层与 Multiply 层处理完整;正则项未被错误宣称可迁移。
- 确认 fused trial 的权重、优化器和 scheduler 独立,融合前后 loss 一致,defusion 可恢复;不同 shape 不被强行融合。
- 确认 Planner 的 GPU 权重是
batch size × trial count,Fmax来自F=1,2profile;ASHA 停止事件会触发重组。 - 确认 makespan 包含 TargetTrial,Eager Transfer 默认在 50% 完成且有闲置资源时启动;新最优配置的替换策略按利用率执行。
- 确认 bubble 内 resume、边界 pause,大模型 kernel 不与 trial 计算重叠;同时报告大模型 slowdown、trial 相对吞吐和 SM Activity。
- 按 Random、ASHA、deadline 分开报告,标清 GPU 数、trial 数、
S、AMP、模拟项和质量方向;不要把 78.5 倍推广到全部工作负载。
把这些条件放在一起,Hydro 的适用画像很清楚:同一数据分布、模型宽度可缩、trial 架构高度同构、搜索规模大,且集群有异构卡或流水线空泡时收益最大。它把 HPO 从“一堆彼此独立的固定训练作业”改造成可缩放、可融合、可拆分、可暂停并能向调度器暴露阶段状态的工作负载。这个工作负载重塑,才是论文可迁移到其他系统设计中的核心。