路径指标
用六项 PathStats 分别描述算术量、中间结果、单步 footprint、逻辑读写量和存活对象峰值。
本页目录
PathStats 的六项指标
设第 s 个二元步骤的左右输入和结果元素数为 |A_s|、|B_s|、|C_s|。读写计数对原始叶张量采用原输入各轴的元素数;单步规模采用一元求和和对角处理后的逻辑大小,分别记为 |A'_s|、|B'_s|。中间结果在两种口径下大小相同。ArcTN 在完整路径重放后报告以下六项对数指标。
| 字段 | 定义 | 回答的问题 |
|---|---|---|
| log10_flops | log10(Σ_s F_s) | 整条路径需要多少标量乘法 |
| log2_max_size | log2 max_s |C_s| | 最大的二元结果张量有多少元素;单张量网络取最终输出大小 |
| log2_max_contraction_size | log2 max_s(|A'_s|+|B'_s|+|C_s|) | 最大的单步输入加输出 footprint |
| log2_total_size | log2 Σ_s |C_s| | 全部步骤写出的结果元素总量 |
| log2_read_write | log2 Σ_s(|A_s|+|B_s|+|C_s|) | 整条路径的逻辑读写复杂度 |
| log2_peak_size | log2 max 活跃元素总数 | 路径模拟中的存活对象峰值 |
Warning
模型量与实测量
这些量都是结构估计,不是规划秒数、数值执行秒数、进程 RSS、显存占用、缓存缺失或硬件性能计数器。Rust 中单张量网络的合法空路径没有二元步骤:log10_flops、log2_total_size 和 log2_read_write 用负无穷表示零工作量,log2_max_contraction_size 为 0;log2_max_size 取最终输出大小,log2_peak_size 仍计入完整输入。Python 规划报告将这种零工作量的 log10_flops、log2_total_size 显示为 0.0;满足请求目标时,sliced_log10_flops_total 也采用此显示约定。log2_read_write 和目标元数据仍保留零工作量语义。这些特殊显示值不表示工作量为 1,也不表示路径无效。
单步指标计数
本步 FLOPs 按参与二元收缩的所有指标维度之积计一次标量乘法;结果大小是本步保留腿的维度之积。ArcTN 在 log2 域累加大数,避免大型网络的线性值溢出。
本步结果保留属于 output 的指标,以及仍被这两个输入以外的张量使用的指标;其余参与本步的指标求和消去。
结构计数公式:单步规模用一元处理后的逻辑输入大小,读写量对叶张量用原输入大小
F_s = product(dim(leg) for leg in union(A_s, B_s))
result_s = product(dim(leg) for leg in C_s)
step_footprint_s = |A'_s| + |B'_s| + |C_s|
read_write = sum_s (|A_s| + |B_s| + |C_s|)
FLOPs 的口径
复数标量乘法在该结构模型中仍计为一次标量乘法。实际指令数和不同 dtype 的吞吐必须通过执行 benchmark 测量。
三个容易混淆的大小指标
| 指标 | 包含什么 | 不包含什么 |
|---|---|---|
| log2_max_size | 单个二元步骤的新结果 C;单张量网络取最终输出 |
该步的两个输入、其他存活张量、workspace |
| log2_max_contraction_size | 某个二元步骤的 \|A'\|+\|B'\|+\|C\|,其中叶张量采用一元处理后的逻辑大小 |
其他存活张量、并发 slice、allocator 与后端 workspace |
| log2_peak_size | 模拟执行中的全部存活张量;结果在输入释放前计入 | 转置临时量、allocator 开销、库 workspace 与并行任务叠加 |
target_size 限制每个 slice 的二元收缩结果元素数;单张量网络另检查最终输出,因此与 log2_max_size 的结构口径最接近。它不涵盖所有一元临时数组,不直接约束 log2_peak_size,也不等于 RSS 或显存。
Warning
并行执行的额外内存
如果数值执行同时并行多个 slice,总驻留内存可能明显高于单个 slice 的路径指标。评估内存时还要记录 dtype、线程数、并发 slice 数和实测 RSS。
统一重算再比较
let stats = arctn::simulate_path(&net, &ssa_path)?;
println!("{:?}", stats);
跨方法或跨库比较使用同一种合法路径表示,并在相同网络、维度和 evaluator 下重放。各库原生汇总字段可能采用不同的 FLOPs、读写或 unary 处理口径。
- 记录网络与维度是否完全相同。
- 记录路径是否切片,以及切片后的指标是单片还是全部 slices 的总量。
- 记录路径格式、objective、候选预算、seed/repeat 和 wall limit。
- 把 planner API 时间、外部进程 wall 和数值执行时间分开。
total write 与 read/write complexity
log2_total_size只累计每步写出的结果,log2_read_write同时累计左右输入与结果。两者不能都简称为“读写量”。