core.inference.moe.batch_invariant#
Batch-invariant inference MoE helpers.
Module Contents#
Functions#
Return whether global batch-invariant mode is active. |
|
Batch-invariant BF16 grouped GEMM used by inference fused MoE. |
|
Per-expert row alignment required by the batch-invariant grouped GEMM. |
|
Apply squared ReLU and router probabilities in training order. |
|
Apply gated SiLU (SwiGLU) and router probabilities in training order. |
|
Gated-SiLU counterpart of squared_relu_with_probs (SwiGLU models). |
|
Device-bounded weighted SwiGLU with training-parity rounding. |
|
SwiGLU with routing weights applied at the activation (training parity). |
|
Match training’s BF16 squared-ReLU rounding before the FP32 probability multiply. |
|
Reduce peer rows with an explicit rank-order FP32 sum. |
|
Reduce-scatter variable token rows with a fixed FP32 rank order. |
|
Token-local batch-invariant unpermute. |
|
Reduce local expert contributions token-by-token in fixed expert order. |
API#
- core.inference.moe.batch_invariant.enabled() bool#
Return whether global batch-invariant mode is active.
- core.inference.moe.batch_invariant.grouped_mm(
- x_bf16: torch.Tensor,
- weight: torch.Tensor,
- offs: torch.Tensor,
Batch-invariant BF16 grouped GEMM used by inference fused MoE.
- core.inference.moe.batch_invariant.grouped_mm_alignment() int#
Per-expert row alignment required by the batch-invariant grouped GEMM.
- core.inference.moe.batch_invariant._squared_relu_with_probs_kernel(
- input_ptr,
- output_ptr,
- permutation_map_ptr,
- n_used_ptr,
- probs_ptr,
- hidden_size,
- max_rows,
- clamp_scale,
- CLAMP: triton.language.constexpr,
- ZERO_PADDING: triton.language.constexpr,
- BLOCK_SIZE: triton.language.constexpr,
- NUM_BLOCKS: triton.language.constexpr,
Apply squared ReLU and router probabilities in training order.
With CLAMP set this reproduces training’s fused
weighted_clamped_squared_relubit for bit: the soft-clamped pre-activation and the square both stay in FP32, and the only BF16 round is the final one after the FP32 routing probability is applied.Without CLAMP the square is materialized in BF16 first, matching the unclamped
weighted_squared_relu, which squares a BF16 ReLU output.
- core.inference.moe.batch_invariant._swiglu_with_probs_kernel(
- input_ptr,
- output_ptr,
- permutation_map_ptr,
- n_used_ptr,
- probs_ptr,
- ffn_size,
- max_rows,
- ZERO_PADDING: triton.language.constexpr,
- BLOCK_SIZE: triton.language.constexpr,
- NUM_BLOCKS: triton.language.constexpr,
Apply gated SiLU (SwiGLU) and router probabilities in training order.
Matches the training fused weighted-swiglu rounding: SiLU(gate)upprob is computed in FP32 with a single BF16 round at the end. Input row width is 2*ffn_size: gate = first half, up = second half (megatron chunk convention). Fixed NUM_BLOCKS CTAs iterating rows -> CUDA-graph safe.
- core.inference.moe.batch_invariant.swiglu_with_probs(
- x: torch.Tensor,
- permutation_map: torch.Tensor,
- n_used: torch.Tensor,
- probs: torch.Tensor,
- zero_padding: bool = False,
Gated-SiLU counterpart of squared_relu_with_probs (SwiGLU models).
zero_paddinginitializes aligned dummy rows because MXFP8 quantization and grouped GEMM have no permutation map with which to skip them.
- core.inference.moe.batch_invariant._weighted_silu_mul_bounded_kernel(
- in_ptr0,
- in_ptr1,
- out_ptr0,
- bound_ptr,
- xnumel,
- HALF_N: triton.language.constexpr,
- XBLOCK: triton.language.constexpr,
Device-bounded weighted SwiGLU with training-parity rounding.
The per-element instruction sequence is copied VERBATIM from Inductor’s emitted Triton for the training fused weighted-swiglu (bf16 -> fp32 silu(gate) * up * prob -> bf16, single final rounding), so a token’s activation bits match the training forward exactly. Elementwise kernels have no cross-element reduction, so only the per-element sequence determines bits; the schedule below is a persistent 1D grid (static launch, CUDA-graph-safe) striding while xoffset < a DEVICE element bound (= valid_tokens * topk * HALF_N — the live prefix of the flat token-major layout). Rows beyond the bound are neither read nor written.
- core.inference.moe.batch_invariant.weighted_silu_mul_bounded(
- y: torch.Tensor,
- weights_flat: torch.Tensor,
- bound_elems: torch.Tensor,
- num_programs: Optional[int] = None,
- xblock: int = 1024,
SwiGLU with routing weights applied at the activation (training parity).
y: [rows, 2*half_n] bf16 (gate | up); weights_flat: [rows] fp32 routing probabilities; bound_elems: device scalar = live_rows * half_n. Returns [rows, half_n] bf16; rows beyond the live bound are untouched.
num_programs defaults to SMs * 8 waves (Inductor’s persistent-grid sizing; 1184 on the B200 this was captured from). Grid size cannot affect bits: the kernel is elementwise with each program owning a disjoint strided index range, so it is an occupancy knob only.
- core.inference.moe.batch_invariant.squared_relu_with_probs(
- x: torch.Tensor,
- permutation_map: torch.Tensor,
- n_used: torch.Tensor,
- probs: torch.Tensor,
- clamp_scale: Optional[float] = None,
- zero_padding: bool = False,
Match training’s BF16 squared-ReLU rounding before the FP32 probability multiply.
- Parameters:
clamp_scale – config.activation_func_tanh_clamp_scale. If set, precondition the input with the tanh soft clamp
s * tanh(x / s).zero_padding – initialize aligned dummy rows because MXFP8 quantization and grouped GEMM have no permutation map with which to skip them.
- core.inference.moe.batch_invariant._ordered_reduce_scatter_v_kernel(
- local_ptr,
- buffer_ptrs_dev,
- signal_pad_ptrs,
- local_tokens,
- rank_token_offset_ptr,
- ep_max_tokens_ptr,
- input_byte_offset,
- HIDDEN_SIZE: triton.language.constexpr,
- BLOCK_SIZE: triton.language.constexpr,
- RANK: triton.language.constexpr,
- WORLD_SIZE: triton.language.constexpr,
Reduce peer rows with an explicit rank-order FP32 sum.
- core.inference.moe.batch_invariant.ordered_reduce_scatter_v(
- output_tensor: torch.Tensor,
- input_tensor: torch.Tensor,
- symm_mem_hdl: torch._C._distributed_c10d._SymmetricMemory,
- rank_token_offset: torch.Tensor,
- ep_max_tokens: torch.Tensor,
- per_rank_max_tokens: int,
- input_byte_offset: int = 0,
- **kwargs,
Reduce-scatter variable token rows with a fixed FP32 rank order.
- core.inference.moe.batch_invariant._unpermute_tokens_in_expert_order_kernel(
- expert_out_ptr,
- inverse_map_ptr,
- valid_tokens_ptr,
- output_ptr,
- hidden_dim,
- num_local_experts: triton.language.constexpr,
- BLOCK_H: triton.language.constexpr,
Token-local batch-invariant unpermute.
Each program owns one output token and one hidden tile. Contributions are accumulated in fp32 by increasing local expert id, avoiding atomic-add order.
- core.inference.moe.batch_invariant.unpermute_tokens_in_expert_order(
- expert_output: torch.Tensor,
- inverse_map: torch.Tensor,
- valid_tokens: torch.Tensor,
- out: Optional[torch.Tensor],
Reduce local expert contributions token-by-token in fixed expert order.