This document is relevant for: Trn2, Trn3

Collective Communication Kernels API Reference#

HBM-based collective communication kernels for cross-rank data exchange.

Example with replica_group=[[0,1]], input shape (2, 3) -> output shape (2, 3) for all_reduce_hbm_kernel:

rank0: [[1,2,3], [4,5,6]] -> [[2,4,6], [8,10,12]]
rank1: [[1,2,3], [4,5,6]] -> [[2,4,6], [8,10,12]]

Background#

This module provides a suite of HBM-based collective communication kernels for exchanging data across ranks: all_reduce_hbm_kernel (sum tensors across all ranks), all_gather_hbm_kernel (gather tensors from all ranks along dim 0), reduce_scatter_hbm_kernel (sum then scatter chunks along dim 0), all_to_all_hbm_kernel (exchange chunks across ranks along dim 0), and the rank_id_kernel / dma_copy_rank_id_kernel helpers for per-rank slice selection using rank_id as a scalar offset.

API Reference#

Source code for this kernel API can be found at: collectives.py

all_reduce_hbm_kernel#

nkilib.experimental.collectives.all_reduce_hbm_kernel(input: nl.ndarray, replica_group: ReplicaGroup) nl.ndarray#

Sum tensors across all ranks.

all_gather_hbm_kernel#

nkilib.experimental.collectives.all_gather_hbm_kernel(input: nl.ndarray, replica_group: ReplicaGroup, num_ranks: int) nl.ndarray#

Gather tensors from all ranks along dim 0.

reduce_scatter_hbm_kernel#

nkilib.experimental.collectives.reduce_scatter_hbm_kernel(input: nl.ndarray, replica_group: ReplicaGroup, num_ranks: int) nl.ndarray#

Sum then scatter chunks along dim 0. Dim 0 is split into num_ranks chunks.

all_to_all_hbm_kernel#

nkilib.experimental.collectives.all_to_all_hbm_kernel(input: nl.ndarray, replica_group: ReplicaGroup) nl.ndarray#

Exchange chunks across ranks along dim 0. Each rank sends input[i,:] to rank[i].

rank_id_kernel#

nkilib.experimental.collectives.rank_id_kernel(in_tensor: nl.ndarray) nl.ndarray#

Select per-rank slice using rank_id as scalar_offset.

dma_copy_rank_id_kernel#

nkilib.experimental.collectives.dma_copy_rank_id_kernel(in_tensor: nl.ndarray, rank_id_lookup: nl.ndarray) nl.ndarray#

Load rank_id into SBUF via lookup table, then use as scalar_offset.

This document is relevant for: Trn2, Trn3