Delta Weight Sync

Delta Weight Sync#

Non-colocated weight sync that ships only changed positions + values instead of every parameter. Two transports over one wire format and one receiver-side decoder:

  • Disk (the point) — write per-flush safetensors to a shared filesystem; one HTTP push per sync. Designed for training/inference disaggregation across datacenters where bandwidth between trainer and rollout is on the order of 100s of MB/s.

  • NCCL (the baseline) — broadcast each per-flush bucket directly. Used intra-datacenter to validate that the wire encoding and apply logic are correct, separate from any shared-FS variable.

Both modes are lossless by construction (selective overwrite via NaN sentinel; no arithmetic).

Files#

  • run-glm4.7-355B-A32B-delta.sh: 16-node (8 actor + 8 rollout) GLM-4.7-355B-A32B launcher. Disk transport active by default; NCCL block commented below it.

Usage#

bash examples/delta_weight_sync/run-glm4.7-355B-A32B-delta.sh

Disk (default):

DELTA_ARGS=(
   --update-weight-mode delta
   --update-weight-transport disk
   --update-weight-encoding deltas_zstd
   --update-weight-disk-dir /shared/fs/delta-updates
)

NCCL (baseline):

DELTA_ARGS=(
   --update-weight-mode delta
   --update-weight-transport nccl
   --update-weight-encoding indices
)

Receiver-side byte cap (both transports):

--vllm-update-weight-delta-chunk-bytes $((2 * 1024 * 1024 * 1024))

See docs/en/advanced/delta-weight-sync.md for the wire protocol, encoding choice, and design.

Results#

W&B traces comparing delta sync against the full-sync baseline on GLM-4.7-355B-A32B / DAPO-Math-17k.

Raw reward

Train/rollout logprob abs diff

Update weights time

Note on the small curve-to-curve gap. RL training is inherently non-deterministic (cuBLAS reductions, FlashAttention split-K, NCCL all-reduce ordering, dynamic-batch token assignment). Two identically-configured full-sync runs would diverge the same way. Delta sync’s selective overwrite is bit-exact with full sync per step (no arithmetic, no drift); the trajectory matches, the bits don’t.

Update weights density

Per-sync change density (perf/update_weights_density) — fraction of weight positions that moved between consecutive syncs. Sync 0 is omitted: it’s the snapshot-seeding pass with density = 1.0, which would compress the y-axis.

Why these encoding defaults#

Per-sync change density during RL fine-tuning at conservative LRs sits around 2-3% (arXiv:2602.03839 reports ~1% on a related setup; we measured ~2-3% on this run). Below the 3.125% break-even point, gap-encoded positions are smaller than absolute indices — the disk default deltas_zstd adds zstd L1 on top to squeeze the gap byte stream further (~35-40%), which is the right tradeoff when shared-FS bandwidth is ≤ 300 MB/s. Intra-datacenter NCCL has no bandwidth pressure, so indices (lowest compute, biggest payload) is the cleaner default there.