Slice-Shape 描述符
一个 slice 的形状,即其芯片组成的 3D(偶尔为 4D)环面以及它们在各 host 上的分布,由 tpu.TpuTopologyArgsProto 描述。每个需要按 slice 记录形状的 Megascale 运行时消息都会嵌入同一个 proto:它是 SliceInfo 的字段 3(字段解码)、xla.megascale.runtime.GetMultiSliceTopologyRequest 的字段 2,以及 TargetArgumentsProto 的字段 6;运行时还会在 TPUHostConfiguration(字段 8)和 TpuPjRtTopologyDescriptionProto (字段 1)中携带它。slice 形状会在 slice 内部 bringup 期间计算一次, 并作为这个单一且已验证的 blob 向上传播。
TpuTopologyArgsProto
message TpuTopologyArgsProto { // package tpu, editions
tpu.TpuVersionProto version = 1; // chip generation
string variant = 2; // chip variant name
tpu.TpuPlatformTypeProto platform_type = 3; // HW / GRM / ISS
string chip_config_name = 4; // tpunetd chip config
tpu.TpuDimensionsProto chips_per_host_bounds = 5; // chips per host (x,y,z,w)
tpu.TpuDimensionsProto host_bounds = 6; // hosts per slice (x,y,z,w)
tpu.TpuWrapProto wrap = 7; // per-axis torus closure
bool twist = 8; // twisted-torus
bool enhanced_barrier_enabled = 9; // per-slice capability
bool use_continuations = 11;
tpu.TpuRoutingStrategyProto routing_strategy = 12; // DEFAULT / MESH / NHOP
SubSlice sub_slice = 10; // sub-slice override
message SubSlice {
tpu.TpuDimensionsProto chips_per_host_bounds = 1;
tpu.TpuDimensionsProto host_bounds = 2;
}
}
```text
## 读取形状
slice 形状是两个 4D 边界的乘积:
```text
slice_shape = chips_per_host_bounds ⊗ host_bounds其中每个边界都是一个 TpuDimensionsProto {x, y, z, w}(w 轴通常未使用)。 系统其余部分需要两个量:
- 每个 host 的芯片数 =
product(chips_per_host_bounds) - 每个 slice 的 host 数 =
product(host_bounds),这是 DCN 层用作该 slice host 数的值,也是 coordinator 用来判断一个 slice 何时已完整注册的值。
辅助维度类型:
message TpuDimensionsProto { int32 x=1; int32 y=2; int32 z=3; int32 w=4; }
message TpuWrapProto { bool x=1; bool y=2; bool z=3; } // torus closure per axis
message TpuDegradedAxesProto { bool x=1; bool y=2; bool z=3; } // axes lost to faults
```text
`wrap` 标记哪些轴闭合成环面(相对于开放 mesh);`twist`(bool,字段 8)
选择扭转环面。具体的 twist 变体位于单独的
`superpod.routing.proto.TwistedTorusShape` enum 中
(`TWIST_SHAPE_UNSPECIFIED=0`, `TWIST_SHAPE_K_K_2K=1`,
`TWIST_SHAPE_K_2K_2K=2`, `TWIST_SHAPE_K_2K_NK=3`).
## 路由和已配置属性
`routing_strategy` 选择流量在 slice 内部如何路由:
```protobuf
enum TpuRoutingStrategyProto { ROUTING_DEFAULT=0; ROUTING_MESH=1; ROUTING_NHOP=2; }一个配套 proto 携带已配置的(故障后)属性:
message TpuConfiguredPropertiesProto {
tpu.TpuDegradedAxesProto degraded_axes = 1; // axes degraded by faults
bool is_nhop_source_relative = 2;
tpu.TpuRoutingStrategyProto routing_strategy = 3;
}
```text
`degraded_axes` 是部分故障 slice 宣告哪些轴已失去 wrap/连接性的方式,即为
routing planner 汇总的 ICI 层故障模型。
## 芯片代际和平台
```protobuf
enum TpuVersionProto {
TPU_VERSION_INVALID=0; TPU_VERSION_JELLYFISH=1; TPU_VERSION_DRAGONFISH=2;
TPU_VERSION_PUFFERFISH=3; TPU_VERSION_VIPERFISH=4; TPU_VERSION_GHOSTLITE=5;
TPU_VERSION_6acc60406=6;
}
enum TpuPlatformTypeProto {
TPU_PLATFORM_TYPE_INVALID=0; TPU_PLATFORM_TYPE_HARDWARE=1;
TPU_PLATFORM_TYPE_GRM=2; TPU_PLATFORM_TYPE_ISS=3;
}version 是硅片代际;platform_type 区分真实硬件、GRM 功能模型和 ISS 指令集模拟器(因此模拟 fleet 会携带与真实 fleet 相同的形状描述符)。
版本控制
slice 形状也是 schema 兼容性门禁。一个 slice 中的每个 host 都会报告自己的 TpuTopologyArgsProto;coordinator 使用 proto2::util::MessageDifferencer::Compare 验证同一 slice 中所有 host 报告的内容是否等价。如果一个 slice 中的 host 不一致,例如混用了两个 version 值,该 slice 会被拒绝,并记录 diff。enhanced_barrier_enabled (字段 9)和 use_continuations(字段 11)是按 slice 记录的能力位, 会随同一个 blob 一起携带。参见 Host 身份。
来源
chip_config_name、chips_per_host_bounds、host_bounds、wrap 和 twist 都派生自 slice bringup 期间拉起的 slice 内部 fabric:driver 的 全局 chip-id 分配(asic_sw::driver::deepsea::GlobalConfig::SetGlobalChipId)、 tpunetd 的 GetChipCoordinates RPC,以及 routing 层的 superpod::routing::proto::ChipLocationToCoordinate 映射共同将每个芯片放置到 该 slice 的 ToroidalTopology 中,而 slice 形状就是这些坐标的边界框。 Megascale 层将该形状作为不透明且已验证的 blob 使用,参见 ICI vs DCN。
交叉引用
- 拓扑模型 — 此形状限定的
ToroidalTopology - 字段解码 —
chips_per_host_bounds/host_bounds/chip_config_name的线缆解码 - ICI vs DCN — 为什么该形状对 DCN 层是不透明的
- Host 身份 — 此 blob 上的按 slice 一致性门禁 (
MessageDifferencer::Compare) - Twist › 概览 —
wrap/twist位如何输入扭转环面 ring 构造 - Routing › 概览 — 生成坐标的
ChipLocationToCoordinate放置层