MPI 执行

tnmpi 的主路径按 slice assignment 分工;它不是分布式 Light/Heavy 寻路。

本页目录

主模式:固定路径切片执行

tnmpi 通过可选 Cargo mpi feature 构建。主模式先确定一条路径,再由 rank 0 选择 sliced legs 并广播;各 rank 执行不同的连续 slice index 区间,最后用 MPI Allreduce 对输出逐元素求和。

Warning

能力边界

MPI 主模式分布的是固定路径后的切片数值执行,不拆分单个张量,也不提供 distributed Light/Heavy。每个执行 rank 仍持有完整输入数组。

普通模式与 scaling mode

模式 路径 切片计划 适合用途
普通模式 每个 rank 用 seed+rank 运行 random_greedy,再选择 objective 最好的 rank rank 0 计算;无显式目标时尝试取得至少 slices_min × P 个 slices 一般规划与执行
--scaling-mode 只由 rank 0 用固定 seed 运行 random_greedy 必须显式给出同一个 --target-size 比较不同 MPI 进程数的固定 path/slices 执行
--partition 独立的超图分区路线 不接受 --target-size 或 --scaling-mode 研究性 boundary-tensor 分区执行,不属于主切片流程

--scaling-mode 强制使用显式 --target-size,避免 slices-min × P 随进程数变化,从而让不同 P 使用不同 sliced legs。固定 path 和切片集合后,执行墙钟才具有直接的强缩放比较意义。

构建与运行

bash
cargo build --release --locked --features mpi --bin tnmpi

mpirun -n 4 ./target/release/tnmpi \
  --net network.json \
  --trials 64 --seed 1 \
  --scaling-mode --target-size 1048576 \
  --exec

正确性与归约边界

必须一致 为什么
网络、路径和 sliced legs 所有 rank 必须计算同一精确分解的不同部分
输入张量值 Allreduce 合并的是同一个收缩问题
目标与报告口径 target_size 只约束每个 slice 的二元收缩结果;单张量网络则检查最终输出

每个 rank 先独立复验广播的 path/slice plan,并计算自己的局部输出。Allreduce 的浮点归约树由 MPI 实现和 rank 数决定,因此不同 P 下结果应在数值容差内一致,但不承诺 bit-identical。

Warning

内存边界

增加 ranks 不会自动降低每个 rank 的输入内存:--exec 下每个 rank 都读取或生成完整输入。target_size 也不是每 rank RSS 上限。

每 rank 线程与时间上限

同一节点启动多个 ranks 时,tnmpi 会根据可用 CPU 并行度和本地 rank 数估计每 rank 的 Rayon 线程数。若调用者显式设置 RAYON_NUM_THREADS,则使用该值。MPI launcher 的 pinning/binding 仍应单独配置。

tnmpi 没有内部 --max-time,因为 ranks 之间还没有共同的协作式 deadline 协议。严格时间上限应由 mpirun、作业调度器或外部 watchdog 实施。

不支持的结论 实际支持的结论
P 个 ranks 就把单个张量分成 P 份 主模式只分 slice assignment 区间
MPI 提供分布式 Heavy 寻路 主模式只在 ranks 间选 random_greedy 候选,或只由 rank 0 寻路
target_size 限制集群总内存 它限制每个 slice 的二元收缩结果元素数;单张量网络则检查最终输出
Allreduce 在所有 P 下逐位相同 它精确合并全部子任务,但浮点顺序可变化