Skip to main content
miles supports P2P (point-to-point) weight transfer between training and rollout engines. By using --update-weight-transfer-mode p2p, miles enables more efficient weight transfer from training ranks to rollout engine ranks. More details on the design and implementation can be found in this issue.

Usage

To enable P2P weight transfer, add the following flag to your training command:

How It Works

The default weight transfer mode in miles is broadcast: after training, updated weights are broadcast via NCCL to all rollout engine ranks. This works but does not fully utilize the available bandwidth, as redundant copies of the same weights are transferred to multiple ranks. P2P mode addresses this by having each training rank transfer only the specific weight shards required by its target rollout engine rank(s), writing them directly to remote memory without redundant copies. The key steps are:
  1. Initialization: Training ranks establish point-to-point connections (via RDMA) to their target rollout engine ranks. Including:
    • Create a transfer plan that maps each training rank to its target rollout rank(s) based on GPU counts and parallelism configuration.
    • Query remote rollout engines for their weight memory registration info (addresses and sizes for RDMA writes).
    • Query remote parallelism config and construct a local CPU model replica that mirrors the target’s sharding layout, enabling correct weight format conversion before transfer.
  2. Weight gather: Megatron TP/EP shards are all-gathered and converted to HF format, same as the broadcast path.
  3. P2P transfer: Instead of a collective broadcast, each source rank writes bucketed weight tensors directly to the destination rollout rank’s memory, in a write-only fashion.
  4. Synchronization: Once all RDMA writes are confirmed complete, rollout engines increment their weight version and resume generation for the next training step.

Architecture

Both broadcast and P2P modes share the same bucketed weight-update pipeline in miles/backends/megatron_utils/update_weight/. The diagram below shows which components are shared and which are P2P-specific.

Shared components (broadcast & P2P)

P2P-specific components

Supported Model Architectures

P2P weight transfer relies on a unified weight name mapping interface between Megatron and sglang (see sglang#17326). The following sglang model classes are supported:
Note: All the above models are tested on H100-80GB clusters. For Kimi-K2, we set training nodes = inference nodes = 32 to ensure sufficient memory. The original Kimi-K2 checkpoint uses a block-quant size of [128, 128], which will trigger errors if sglang-tp-size = 32. To work around this, we re-quantize to [64, 64] and update all affected scale tensors accordingly.

Validated Models

All models below have been validated with --check-weight-update-equal in P2P mode.
Enabling --check-weight-update-equal for Kimi-K2 is non-trivial due to several issues:
  • The user must first dequantize the Kimi-K2 model to BF16 for training, then re-quantize the parameters for weight updating. Meanwhile, the rollout side snapshots the original Kimi-K2 tensors as the reference when enabling --check-weight-update-equal. This means the rollout SGLang engine should load the checkpoints processed by the dequant-requant pipeline.
  • We use modified checkpoints with block-quant size [64, 64], so any quant/dequant code that hard-codes the block-quant size as [128, 128] will break.
  • Certain tensors that are only initialized on the rollout side (e.g., k_scale / v_scale) must be skipped during the weight-check process.
We verified P2P correctness for Kimi-K2 by enabling --check-weight-update-equal with hard-coded workarounds for the issues above. The transferred weights were confirmed correct. These hard-coded workarounds are verification-only and will not be merged into the main branch to keep the codebase maintainable.

Profiling Results

For M source ranks and N target ranks, with source pp size src_pp and target ep size sgl_ep, the benefit of P2P transfer is approximately:
  1. utilizes M // src_pp times more source transmission bandwidth.
  2. each target rank receives sgl_ep times less data.
Thus we expect our solution to scale better, especially on the MoE models. All profiling is run on H100-80GB clusters with 1GB transfer bucket. Timing measures after pause_generation call returns and before update_weight call exits to exclude request queue abortion time. Table includes steady-state steps 3–12 average. For Kimi-K2, the RDMA (ms) column includes GPU-side post-processing time (post_load_weights ~884ms) since this model requires GPU-side weight requantization after RDMA transfer. Models marked with ★ are MoE architectures, where P2P benefits are most pronounced due to expert-parallel sharding reducing per-target transfer volume. P2P vs NCCL Broadcast Scaling * Kimi-K2 RDMA time includes ~884 ms GPU-side post_load_weights requantization on rollout engines.

Examples

CI Test (single-node, Qwen3-4B)

The P2P weight transfer E2E test validates correctness on a single node using Qwen3-4B: