Echo Training Simulator

导言

Echo 是一个面向大规模分布式训练的混合性能模拟器:它先在少量真实 NVIDIA GPU 上逐 Rank 执行和计时,再用 NCCL 白盒公式、离散事件时间线以及 XGBoost 重叠减速模型,预测目标集群的单步时间。它模拟的是执行时序,不是张量数值、loss 或收敛过程。

截至本文固定的公开版本,Echo 已公开 workload tracer 与 slowdown predictor,但论文中的集成通信估算器和 timeline composer 尚未在仓库中找到;代码明显绑定 CUDA、NCCL 和 Nsight,没有开箱即用的 Ascend 支持。论文在 NVIDIA 测试域内给出 91.4% 平均预测准确率,以及 GPT-175B、96 张 H800 上约 8% 的单步时间误差,但这些数字不能直接外推到 Ascend。

先给结论

如果只关心问题的答案,可以先看下面六点。

  1. Echo 是什么:一个 trace-driven、profile-guided 的分布式训练性能模拟器。输入模型、并行组、GPU/网络拓扑和 NCCL 参数,输出各 Rank 时间线与预测 step time。[^echo_repo][^echo_paper]
  2. 是不是仿真:是,但不是训练数值仿真。计算图和局部算子来自真实 PyTorch 执行;集合通信来自解析模型;计算通信重叠来自学习模型;目标规模执行由离散事件回放完成。
  3. 架构亮点:用 ex-situ tracing 把“目标集群 N 个 Rank 同时占用 N 张卡”改成“在一张卡上依次追踪 N 个局部 Rank”,再把记录的图放回虚拟集群合成时间线。
  4. 公开到什么程度:固定在 Echo 15f0d12c、tracer 8fb57b6c、slowdown 7d698a77 后,公开树能审阅 tracer 和 slowdown predictor;没有找到论文所述通信估算器、timeline composer、数据库和代理的集成源码。
  5. Ascend 支持如何:当前没有。tracer 使用 .cuda()、CUDA Event/synchronize、NVTX 和 backend='nccl';slowdown 模块依赖 Nsight Systems/Compute。README 的未来 backend 也只写了 NVIDIA/AMD,没有写 Ascend。
  6. 精度如何:在论文的 NVIDIA 环境中,端到端通常是个位数到约 11% 的误差,但不同组件并不都这么准。91.4% 是论文汇总口径,不是任意模型、集群和硬件上的保证。
![Echo 混合性能模拟器认知图](https://pic.shaojiemike.top/shaojiemike/2026/08/f44597a150fecdf0b021a278cdba78a5.png){ width=95% }
原创认知图:左侧用真实 GPU 取得计算画像,中间结合通信公式与重叠修正,右侧回放许多虚拟 Rank 并求出 Step Time。

项目定位

直接在 64、96 甚至几千张 GPU 上试一个新模型或并行方案,代价很高;只拿 FLOPs 除以峰值算力,又会漏掉集合通信、pipeline 依赖、memcpy 和计算通信重叠。Echo 想解决的就是两者之间的空档:保留真实框架与算子行为,同时不实际占用目标规模集群。

论文给出的输入可以归为三组:

  • 工作负载:训练框架、模型结构、超参数与前后向计算图。
  • 并行语义:DP、TP、PP 的通信组、collective 和点对点依赖。
  • 目标环境:GPU 类型、服务器数量、机内/机间拓扑和 NCCL 参数。

输出不是一个“预计吞吐数字”这么简单,而是每个 Rank 上 compute、communication、memcpy 的合成时间线。step time 是这些事件满足全部资源与依赖约束后的关键路径终点

论文架构不等于当前开源完整度

项目 README 写的是逐步公开核心组件。当前仓库的两个主要子模块分别是 Echo Tracer v0.5 和 Echo Slowdown v1.0;tracer README 还把 DeepSpeed、Megatron tracer 标为开发中。因此,本文会把“可由固定源码验证的实现”和“只能由论文验证的机制”分开描述。

架构总览

论文的主链可以写成:

1
2
3
4
5
6
7
模型与并行配置
→ Ex-situ workload tracing
→ 每个虚拟 Rank 的依赖图与计算耗时
→ 白盒 collective communication estimation
→ 事件驱动 timeline composition
→ overlap slowdown correction
→ 每 Rank 时间线与预测 Step Time
![Echo 论文架构图](https://pic.shaojiemike.top/shaojiemike/2026/08/220311674d9030109b014f11aa702347.png){ width=90% }
Echo 论文 Figure 4:workload tracer、collective communication estimator、timeline composer 和 validator/slowdown predictor 共同构成模拟链。

这条链不是“全解析”或“全机器学习”,而是一个分层混合模型:

主要方法 真实测量 预测对象
工作负载 Ex-situ 真实框架追踪 Rank 图、compute/memcpy 时长
集合通信 NCCL 白盒解析模型 系数需离线标定 collective 时长
全局调度 离散事件合成 资源线、依赖、关键路径
重叠干扰 XGBoost 训练数据来自真实重叠运行 compute slowdown

四个核心机制

虚拟 Rank 追踪

普通 tracing 会初始化全部 Rank,因而仍需要目标规模的设备和显存。Echo 的 ex-situ 方法改为:在一个物理进程/设备上选择虚拟 Rank r,由 Echo MPU 构造该 Rank 的局部子模型,真实执行其计算算子;遇到集合通信时不等待不存在的远端 Rank,而是记录 collective 类型、通信组、字节数和依赖。完成后释放局部模型,再追踪下一个 Rank。

![Echo ex-situ tracing 五视图](https://pic.shaojiemike.top/shaojiemike/2026/08/5f3ddae789459325dd919ae63c6001d1.png){ width=95% }
原创机制图:一张物理 GPU 依次承载虚拟 Rank;计算节点来自真实计时,通信节点只保留语义占位。

一个简化但完整的伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def trace_all_virtual_ranks(model_spec, parallel_plan, world_size):
graphs = []
for rank in range(world_size):
local_model = echo_mpu_build_local_model(
model_spec=model_spec,
parallel_plan=parallel_plan,
virtual_rank=rank,
)
graph = WorkloadGraph(rank=rank)

for op in run_real_forward_backward(local_model):
if op.is_collective_or_p2p():
graph.add_communication_placeholder(
kind=op.kind,
group=op.rank_group,
payload_bytes=op.payload_bytes,
dependencies=op.dependencies,
)
else:
synchronize_device()
duration = profile_real_operator(op)
graph.add_compute_or_memcpy(
kind=op.kind,
duration=duration,
dependencies=op.dependencies,
)

graphs.append(graph)
release(local_model)

return graphs

这种方法节省的是同时占用的设备与显存,不是把 tracing 本身变成零成本。虚拟 Rank 越多、各 Rank 结构差异越大,依次追踪的累计时间越长。

白盒通信模型

Echo 没有把 collective 当成一个简单的 bytes / bandwidth。论文把 NCCL kernel 时间拆成四段:

1
2
3
4
T_comm = T_conn_setup
+ T_intra_transfer
+ T_data_reduction
+ T_inter_transfer

进一步的 Equations 2–5 使用设备数 N、服务器数 M、每机设备数 K=N/M、张量大小 S、chunk/轮次 η,以及离线标定的连接、机内传输、机间传输和归约系数 α、β、γ、δ。NCCL 会随 collective、消息大小、拓扑和运行环境选择 protocol、algorithm 与 chunk,因此这些系数不能跨 GPU、网络或 NCCL 版本盲目复用。

![Echo 白盒通信模型五视图](https://pic.shaojiemike.top/shaojiemike/2026/08/8d849e94458a7169821d4fe2820e9fd3.png){ width=95% }
原创机制图:collective 被拆成连接、机内传输、归约和机间传输,并由固定环境的 NCCL 画像参数求时。

不是包级网络模拟

这是一种解析/经验白盒模型。它显式利用 NCCL 的 chunk-based 行为,但论文也把 network topology、traffic contention 的更细粒度建模列为不足。因此不要把 Echo 理解为会逐包模拟交换机队列、ECN 或拥塞控制的网络模拟器。

时间线合成

拿到每个 Rank 的图和每个节点的 duration 后,Echo 仍不能把所有时间简单相加。计算、通信和 memcpy 可以占用不同资源并行推进;同一 stream 上的事件需要串行;collective 或 PP send/recv 还要等待其他 Rank 的匹配事件。

时间线合成器使用离散事件方法:只推进模拟时钟,不真正等待 wall-clock time。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def compose_timeline(rank_graphs, comm_model, slowdown_model):
state = initialize_resource_state(rank_graphs)
ready = priority_queue_by_finish_time()

for node in initially_ready_nodes(rank_graphs):
ready.push(schedule(node, state, comm_model))

while ready:
event = ready.pop_earliest_finish()
mark_complete(event.node, at=event.finish_time)
update_resource_state(state, event)

for node in newly_ready_successors(event.node):
if node.needs_cross_rank_match() and not peers_ready(node):
continue
candidate = schedule(node, state, comm_model)
if candidate.overlaps_communication():
candidate.duration = slowdown_model.correct(candidate)
ready.push(candidate)

return max(node.finish_time for node in all_nodes(rank_graphs))
![Echo timeline composer 五视图](https://pic.shaojiemike.top/shaojiemike/2026/08/9c67e7a4a0719bb97d6c7830b0a42fce.png){ width=95% }
原创机制图:事件队列按最早完成时间推进,解锁后继并处理跨 Rank 匹配,最终最大完成时间就是预测 Step Time。

这一步最接近通常所说的“仿真”:运行的是虚拟事件与逻辑时间,不是目标规模的真实训练。

重叠减速修正

独立运行一个 GEMM 测得 T_base=1 ms,不代表它与 NCCL 同时运行时仍是 1 ms。通信 kernel 可能争用 SM、HBM 带宽、cache 和调度资源。Echo 因此收集约 5000 个 kernel 的重叠样本,用 XGBoost 预测 slowdown。

特征分成两组:

  • NCCL 元数据:protocol、algorithm、collective、bucket size、channel number。
  • 计算 kernel 指标:runtime、SM throughput、DRAM/memory throughput、achieved occupancy/active warps、L1/L2 hit rate 等。

训练脚本使用 80/20 划分、StandardScaler 和 5-fold 验证,固定源码中的 XGBoost max_depth=12。模拟时可以用概念式表示修正:

1
T_overlap = T_base × (1 + r_slowdown)
![Echo overlap slowdown predictor 五视图](https://pic.shaojiemike.top/shaojiemike/2026/08/3cd6e45ddc6d9657accbf210c0514979.png){ width=95% }
原创机制图:NCCL 行为和 Nsight kernel 指标共同决定资源争用特征,XGBoost 把孤立 compute duration 修正成重叠后的 duration。

这也解释了为什么 Echo 不能“只改一个设备名称”就支持 Ascend:slowdown predictor 的输入空间本身就是 NVIDIA SM、DRAM、NVTX 与 Nsight 语义。

建模到底有多真实

回答“Echo 是不是仿真”,最好不要只回答是或否,而是看它的四种事实来源:

  1. 真实执行:局部子模型和计算算子真的在一张 GPU 上运行,得到 Rank 图与孤立 kernel duration。
  2. 解析估计:目标规模 collective 不真实执行,而由 NCCL 白盒公式和离线画像参数预测。
  3. 学习修正:计算通信重叠的 slowdown 由真实样本训练出的 XGBoost 推断。
  4. 离散事件回放:所有 Rank、资源线和依赖在逻辑时间内合成,得到目标规模关键路径。

所以更准确的名称是真实画像驱动的混合时序仿真。它不是以下三类东西:

  • 不是数值训练模拟器:不会计算真实 activation、gradient、loss 或最终模型精度。
  • 不是 GPU cycle simulator:不会逐指令、逐 warp 或逐周期模拟微架构。
  • 不是完整 packet-level 网络模拟器:论文的通信层主要是 NCCL 白盒时间模型。

论文精度

先区分五类指标

“准确率 91.4%”容易掩盖组件差异。论文实际评估至少有五层:

评估层 论文结果 应如何解释
计算预测 overall maximum error 8.31% 固定模型、框架与 NVIDIA 环境中的计算侧结果
机内通信 A800 8.43%,H800 7.24% 平均误差 选定 collective、消息大小与单机拓扑
H800 机间通信 2/4/8 机为 11.36%/12.59%/13.75% 平均误差 规模增长后误差并未保持在个位数
slowdown 单样本 within-15% 命中率 57.73%–76.52% 学习修正有效,但不是每个 kernel 都很准
端到端 step time Figure 13 的点约 7%–11% 误差 多个误差可能在关键路径上叠加或抵消

论文还在 FSDP 模型级 slowdown 评估中报告 Echo 平均误差 4.67%,对比 Proteus 的 18.83%;这说明特定模型级汇总能较准,但不能替代单 kernel 分布。

![Echo 端到端精度](https://pic.shaojiemike.top/shaojiemike/2026/08/96e8509caa810f147eea978912689052.png){ width=75% }
Echo 论文 Figure 13:纵轴是模拟与实测的归一化 Step Time。96 张 H800 上,GPT-70B 约为 0.93、GPT-175B 约为 0.92,对应约 7% 和 8% 误差。

64 张 H800 的 GPT-13B、30B、40B 点大约对应 9%、11%、8% 误差;96 张 H800 的 GPT-70B、175B 则约为 7%、8%。论文摘要强调 GPT-175B/96-H800 在 2 分钟内得到约 8% 误差,并称相较真实集群扩容实验降低约 3 倍成本。

不要把 91.4% 写成 SLA

论文环境包括 RTX 3090、8 张 A800 和最多 96 张 H800,软件栈为 CUDA 12.1、PyTorch 2.1、DeepSpeed 0.13.1、特定 Megatron/NCCL 版本,并使用 FP32 对齐基线。模型、dtype、kernel、网络、并行计划、warmup 与计时窗口变化后都需要重新校准。

仿真本身也有成本

Echo 的目标是避免目标规模真机,但并非常数时间。论文 Table 8 的 GPT 3D-parallel 模拟耗时随规模上升:64、128、256、1024、4096、8192 张 GPU 分别约为 42.4、83.4、167.6、718.7、3457.7、4976.9 秒。8192 张卡点约为 1.38 小时

同表中 128 张 GPU 配置约 83 秒,对比 SimAI 约 7655 秒,论文计算为 91.8 倍加速。但这个比较是特定配置下的 simulator runtime,不是训练 step time,也不表示所有 workload 都有相同加速比。

Ascend 支持

当前结论

固定公开版本没有开箱即用的 Ascend 支持,也没有 Ascend 精度数据。 证据不是简单的 README 没写,而是实现路径的组合约束:

  • tracer README 明确要求 NVIDIA GPU with CUDA。
  • utils.py、timer 与 initializer 使用 .cuda()torch.cuda.Eventtorch.cuda.synchronize、NVTX 和 torch.cuda.get_device_name()
  • DDP graph 路径硬编码 backend='nccl'
  • slowdown README 和脚本要求 nsysncu,采集 CUDA/NVTX 与 NVIDIA kernel metrics。
  • 固定树的 50 个 Python 文件中,源代码审计得到 22 个 CUDA 匹配、6 个 NCCL 匹配、0 个 Ascend 匹配。
  • 论文实验全部是 RTX 3090、A800、H800;没有 Ascend/HCCL 结果。

需要改哪些层

Ascend 官方 torch_npu 已提供 PyTorch NPU 适配、集合通信和 profiler 基础能力;CANN/TorchNPU profiler 也能采集 AI Core 指标以及 HCCL 通信 JSON/matrix。[^torch_npu][^ascend_profiler] 但“平台有这些能力”不等于“Echo 已经支持”。一个可信移植至少包含四个工作包:

工作包 NVIDIA 当前路径 Ascend 需要建立的路径 验收证据
Device abstraction CUDA device/Event/sync/NVTX torch_npu device、event、stream、profiler tracer 在单卡 NPU 输出等价 Rank 图
Collective model NCCL protocol/algo/chunk 与画像 HCCL collective、算法、rank table、HCCS/RoCE 拓扑画像 单机/跨机、消息大小 sweep 误差曲线
Overlap features Nsight SM/DRAM/cache CANN AI Core/HBM/cache/HCCL 并发指标 重新训练后的 holdout 与跨模型误差
End-to-end validation H800/A800 论文基线 固定 SoC/CANN/HCCL/模型/并行计划 真实 NPU step time 与模拟值同窗对比

不能直接复用的东西包括 NCCL 的 α、β、γ、δ、NVIDIA 的 XGBoost 模型,以及 91.4% 这个汇总精度。HCCL 的算法选择、通信域、拓扑层级和 kernel 资源占用不同,必须重新画像。

最小 Ascend 穿刺

先不要从 64 卡和复杂 3D parallel 开始。更稳妥的顺序是:单卡 operator duration → 8 卡单机 HCCL collective sweep → 两机相同 rank table 的跨机 sweep → 一个固定 DDP/FSDP 模型的真实/模拟 step time 对比 → 最后再引入 TP、PP 和 overlap predictor。每一层都保存 SoC、CANN、torch_npu、HCCL、dtype、shape、拓扑和计时窗口。

适用边界

Echo 最适合的是:目标配置昂贵、需要比较多种并行计划、又能拿到少量同代 GPU 与网络画像的训练系统设计阶段。它不适合被当作无需校准的通用性能 oracle。

论文与公开代码仍有几项重要边界:

  • 网络细节:论文承认未显式覆盖更复杂的 topology 与 traffic contention。
  • 并行方法:论文主要围绕 DP/TP/PP;MoE/EP、SP/CP 与 ZeRO 等没有形成同等完整的公开验证闭环。
  • 软件漂移:compiler、fused kernel、NCCL 算法、驱动和框架版本变化都会让画像失效。
  • 开源完整度:当前无法仅凭公开仓库端到端复现论文全部模拟链。
  • 发表状态:截至本文研究时,DBLP 将其记录为 CoRR/arXiv 预印本,未找到正式会议版本。[^dblp]

总结

Echo 的核心价值不在“把训练过程做成假的”,而在于把昂贵的目标规模实验拆成四层:真实局部追踪、白盒通信估算、离散事件合成、学习式重叠修正。这种设计比纯 FLOPs/带宽公式更接近框架行为,又比真实占用目标集群便宜得多。

对精度的合理判断是:在论文的 NVIDIA 测试域内有较好的系统级参考价值,但组件误差并不均匀,且结果依赖环境画像。 对 Ascend 的合理判断则更直接:当前没有现成支持;可以移植,但需要重做 device abstraction、HCCL 模型、CANN 特征和实机校准,完成前不能借用 H800 的精度数字。

参考文献

[^echo_repo]: NetX-lab/Echo, fixed revision 15f0d12c.
[^echo_paper]: Yicheng Feng et al., Echo: Simulating Distributed Training At Scale, arXiv:2412.12487v1, 2024.
[^torch_npu]: Ascend/pytorch, official PyTorch adaptation for Ascend NPU.
[^ascend_profiler]: Ascend PyTorch Profiler 性能数据采集说明.
[^dblp]: DBLP record for Echo.

Author

Shaojie Tan

Posted on

2026-08-10

Updated on

2026-08-10

Licensed under