每主机和每 Slice 身份
主机加入舰队时会声明一个三元组以及一个每 slice 的形状 blob。cross-slice 层中的所有内容都以前两个组件作为键。
身份元组
| 组件 | 类型 | 范围 | 含义 |
|---|---|---|---|
slice_id | int32 | fleet | 此主机所属的 slice |
host_id | int32 | slice | slice 内的主机索引 |
incarnation_id | int64 | process | 每进程的 generation token |
tpu_topology_args | tpu.TpuTopologyArgsProto | slice | slice 的 3D 形状(各主机之间必须匹配) |
(slice_id, host_id) 是通用主机键。它出现为:
NetworkAddressMapping的字段 1 和 2(endpoint 表 —slice_id字段 1 int32,host_id字段 2 int32),- barrier 的
BarrierRequest的字段 2 和 3(slice_id字段 2 int32,host_id字段 3 int32),coordinator 用它们对照num_participants(字段 4)跟踪到达情况, - error aggregator 的每 worker 键,携带在
MegascaleErrorAggregator::WorkerAndCoreInfo结构中, - Communicator 的 endpoint map 键
flat_hash_map<tuple<int,int>, NetworkAddressMapping>(已在Communicator::Communicator构造函数签名 @0x1cca9700 中确认)。
不存在单独的“node id”或“rank”字段。需要扁平 rank 时,会根据已知的每 slice 主机数量对 (slice_id, host_id) 进行扁平化来派生;元数据本身只存储这对值。
身份的来源
slice_id是进程的MEGASCALE_SLICE_ID(--megascale_slice_id),会传入DiscoverTopologyAndAddressBindings。host_id是主机在 slice 内的索引,在 slice 内 tpunetd bringup 期间计算。incarnation_id通过util::random::NewGlobalID()为每个进程生成。tpu_topology_args是 tpunetd 的 slice 内 fabric 设置期间计算出的 slice 形状(见 ICI vs DCN)。
自定位 proto
当组装好的舰队视图被序列化为 MultiSliceTopologyAndLocationProto 时,它会在 local_slice_id(字段 1)和 local_host_id(字段 2)中嵌入接收进程自身的身份。因此,接收方无需任何额外上下文,就知道列表中的哪个 SliceInfo 是自己的 slice;当同一个序列化 blob 广播给每台主机时,这一点很有用。
incarnation_id 和重启检测
incarnation_id 是 generation token,让 coordinator 能够检测 worker 重启或拓扑 re-key。它存在于三层:
GetMultiSliceTopologyRequest.incarnation_id(字段 3)— 主机发布的内容,MultiSliceTopologyInfo.incarnation_id(字段 3)— 组装后的视图,MultiSliceTopologyAndLocationProto.incarnation_id(字段 4)— 序列化后的舰队对象。
re-key 检测器是匿名命名空间 helper LogUniqueIds(int, int, MultiSliceTopologyAndLocation const&),内联到 Communicator::Create 中。它在 unique_id_mutex 保护下的静态 last_ids[3] 数组中缓存上一次注册的 (slice_id, host_id, incarnation_id) 三元组,并在该三元组变化时重新记录 communicator 实例(communication_backend.cc 的 "Created communicator." 日志)。这是 operator 在询问“为什么舰队的地址表在时间 T 发生变化”时查看的信号。re-key 细节见 bootstrap 文档。
每 Slice 一致性
tpu_topology_args blob 是每 slice 的,而不是每主机的:同一 slice 中的每台主机都必须报告等价的 blob。coordinator 使用 proto2::util::MessageDifferencer::Compare 验证这一点;如果某个 slice 中主机报告的形状不匹配(例如一个是 v4 芯片世代,另一个是 v5 芯片世代),该 slice 会被拒绝,并记录 diff。这就是 Slice Shape 下描述的 schema 兼容性门禁。
交叉引用
- 舰队元数据 › 概览 — 主机身份在舰队模型中的位置
- Slice 形状 — 每台主机都必须等价报告的每 slice blob
- 全局寻址 — 主机的
(slice_id, host_id)如何映射到全局 core/chip ids - Bootstrap › Worker 注册 — 向 coordinator 声明此身份的请求