vllm.distributed.weight_transfer.base ¶
Base class for weight transfer engines.
Classes:
-
ModuleSource–WeightSourceovermodule.named_parameters()— the common case. -
ParamMeta–Name / wire dtype / full (HF) shape for one output parameter.
-
TrainerInitInfo–Base trainer-side init info: which trainer rank drives the transfer.
-
TrainerWeightTransferEngine–Trainer-side weight transfer engine.
-
VLLMWeightSyncClient–Trainer-side stub for the inference engine's weight-sync control plane.
-
WeightSource–A re-iterable source of the trainer's weights, handed to a trainer engine.
-
WeightTransferEngine–Base class for weight transfer engines that handle transport of model weights
-
WeightTransferInitInfo–Base class for backend-specific initialization info.
-
WeightTransferInitRequest–API-level weight transfer initialization request.
-
WeightTransferUpdateInfo–Base class for backend-specific weight update info.
-
WeightTransferUpdateRequest–API-level weight update request.
Functions:
-
materialize_full_tensor–Return a full, locally-materialized tensor ready to send.
ModuleSource ¶
Bases: WeightSource
WeightSource over module.named_parameters() — the common case.
Handles both plain dense modules and FSDP-sharded ones with no special casing: iteration all-gathers each DTensor via full_tensor() (a collective) and passes regular tensors through. metadata() reads the global .shape / .dtype, so it never triggers a gather.
Source code in vllm/distributed/weight_transfer/base.py
ParamMeta dataclass ¶
TrainerInitInfo dataclass ¶
Base trainer-side init info: which trainer rank drives the transfer.
rank is this trainer process's rank, provided explicitly by the caller — the engine does not read it from a global process group, which is ambiguous once several groups (FSDP / TP / PP / EP) exist. Rank 0 is always the sender: only it opens the endpoint and drives the inference-side RPCs, while every rank still runs the trainer-side collectives. Backend subclasses add their own (positional) fields; rank is keyword-only so that ordering never conflicts.
Every concrete subclass sets a class-level backend string (the same key it registers under in WeightTransferTrainerFactory). The factory reads it to dispatch, so callers pass only the init info/ It is a ClassVar (a fixed per-backend constant), so it is not an __init__ field.
Source code in vllm/distributed/weight_transfer/base.py
TrainerWeightTransferEngine ¶
Bases: ABC, Generic[TTrainerInitInfo]
Trainer-side weight transfer engine.
Symmetric to WeightTransferEngine but lives in the training process. Constructed via the trainer_init factory classmethod; carries any backend-specific state (NCCL communicators, IPC device info, transfer plans) on self.
Unlike the worker engine, the trainer side does not take a WeightTransferConfig: the backend is selected from the init info's backend ClassVar (so callers pass only the init info), and the static wire params (packed, buffer sizes) ride the backend-specific TrainerInitInfo, which the sender also propagates to the worker at the init handshake.
Multi-rank trainers: trainer_init and send_weights are called on every trainer rank. Rank 0 is the sender, resolved once at trainer_init into is_sender. Non-sender ranks still run every collective (iterating the source, metadata export, IPC handle all-gather) so the group stays aligned, but each engine explicitly guards the control-plane RPCs and the transmit on self.is_sender, so only the sender touches the client.
Subclasses should define
init_info_cls: Type of backend-specific trainer init info
Methods:
-
send_weights–Push weights to inference workers and drive the full update round
-
shutdown–Tear down communicators / process groups. Default no-op.
-
trainer_init–Rendezvous with the inference side and return a ready instance.
Source code in vllm/distributed/weight_transfer/base.py
send_weights() abstractmethod ¶
Push weights to inference workers and drive the full update round trip: start_weight_update, update_weights (run concurrently with the trainer-side broadcast when the backend requires it), then finish_weight_update. Called on every trainer rank.
Source code in vllm/distributed/weight_transfer/base.py
shutdown() ¶
trainer_init(init_info, *, client, source=None) abstractmethod classmethod ¶
Rendezvous with the inference side and return a ready instance.
Called on every trainer rank. The sender drives the full handshake via client (build the worker-side init info, call client.init_weight_transfer_engine, open the trainer-side endpoint); non-sender ranks skip the rendezvous and the RPC.
Source code in vllm/distributed/weight_transfer/base.py
VLLMWeightSyncClient ¶
Bases: Protocol
Trainer-side stub for the inference engine's weight-sync control plane.
Mirrors the weight-sync methods that the inference engine exposes (EngineClient / the HTTP RLHF routes / Ray actors). A TrainerWeightTransferEngine drives the full handshake through this protocol so trainer code never has to know the transport.
All methods are synchronous and accept plain dicts (matching what the inference side already accepts). Concurrency that some backends need (e.g. NCCL must run update_weights concurrently with the trainer-side broadcast) is the engine's responsibility, not the client's, so the protocol stays a flat four-method surface that any wrapper can implement.
The protocol is structural (PEP 544), so user implementations need only define these four methods — no import or subclassing required.
Source code in vllm/distributed/weight_transfer/base.py
WeightSource ¶
Bases: ABC
A re-iterable source of the trainer's weights, handed to a trainer engine.
Two channels:
metadata()—(name, wire dtype, full shape)for every parameter, without transferring. Cheap when shapes are known locally (FSDPDTensorglobal shape); may be expensive on first call for backends that must materialize to learn shapes (e.g. a Megatron-Bridge export), in which case it should cache.- iteration — yields fully-materialized
(name, tensor)pairs, one at a time. Materializing is typically a collective (FSDPfull_tensor(), a Megatron export), so every trainer rank must iterate the same source in the same order in lockstep, or ranks deadlock. Under pipeline parallelism a rank may not own a parameter at all — iterating still drives the collective and the yielded tensor is only meaningful on the sender.
iter(source) must yield a fresh pass each round. Backends with custom producer logic (Megatron export, RDT plans, MoE re-fusing) subclass this.
Methods:
-
metadata–Declare what iteration will yield, without transferring anything.
Source code in vllm/distributed/weight_transfer/base.py
metadata() abstractmethod ¶
Declare what iteration will yield, without transferring anything.
Must agree with iteration element for element: the same parameters, in the same order, with the same dtypes and shapes. Backends may read both channels and trust that they match (dense NCCL sizes the worker's receive buffers and its packed chunk boundaries from this, then sends the bytes from iteration), so a source that disagrees between the two splits the stream differently on each side.
Source code in vllm/distributed/weight_transfer/base.py
WeightTransferEngine ¶
Bases: ABC, Generic[TInitInfo, TUpdateInfo]
Base class for weight transfer engines that handle transport of model weights from a trainer to inference workers.
This abstraction separates weight transfer transport logic from the worker implementation, allowing different backends (NCCL, CUDA IPC, RDMA[TODO]) to be plugged in.
Each engine owns its full weight-update lifecycle: start_weight_update, update_weights, and finish_weight_update. Layerwise reloading (used by checkpoint-format engines) is opted into per engine by running it inside start_weight_update/finish_weight_update. Engines that apply weights in place (e.g. sparse patches) leave those methods as no-ops.
Subclasses should define
init_info_cls: Type of backend-specific initialization info update_info_cls: Type of backend-specific update info
Methods:
-
__init__–Initialize the weight transfer engine.
-
finish_weight_update–Finalize the current weight update.
-
init_transfer_engine–Initialize the weight transfer mechanism.
-
parse_init_info–Construct typed init info from dict with validation.
-
parse_update_info–Construct typed update info from dict with validation.
-
receive_weights–Receive weights from the trainer and load them into the model.
-
reset_weight_update_target–Restore weight updates to the engine's default target model.
-
set_weight_update_target–Set the model that will receive the active weight update.
-
shutdown–Shutdown the weight transfer engine.
-
start_weight_update–Prepare the engine for a new weight update.
-
update_weights–Receive one weight update chunk and load it into the model.
Source code in vllm/distributed/weight_transfer/base.py
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 | |
__init__(config, vllm_config, device, model) ¶
Initialize the weight transfer engine.
Parameters:
-
(config¶WeightTransferConfig) –The configuration for the weight transfer engine
-
(vllm_config¶VllmConfig) –The full vLLM config (provides parallel/model config)
-
(device¶device) –The device this worker's model lives on
-
(model¶Module) –The local model instance which will receive the weights
Source code in vllm/distributed/weight_transfer/base.py
finish_weight_update() abstractmethod ¶
Finalize the current weight update.
Checkpoint-format engines finalize layerwise reloading here; engines that apply weights in place leave this as a no-op.
Source code in vllm/distributed/weight_transfer/base.py
init_transfer_engine(init_info) abstractmethod ¶
Initialize the weight transfer mechanism. This is called once at the beginning of training.
Parameters:
-
(init_info¶TInitInfo) –Backend-specific initialization info
Source code in vllm/distributed/weight_transfer/base.py
parse_init_info(init_dict) ¶
Construct typed init info from dict with validation.
Parameters:
Returns:
-
TInitInfo–Typed backend-specific init info dataclass
Raises:
-
ValueError–If init_dict is invalid for this backend
Source code in vllm/distributed/weight_transfer/base.py
parse_update_info(update_dict) ¶
Construct typed update info from dict with validation.
Parameters:
Returns:
-
TUpdateInfo–Typed backend-specific update info dataclass
Raises:
-
ValueError–If update_dict is invalid for this backend
Source code in vllm/distributed/weight_transfer/base.py
receive_weights(update_info) abstractmethod ¶
Receive weights from the trainer and load them into the model.
Parameters:
-
(update_info¶TUpdateInfo) –Backend-specific update info containing parameter metadata and any backend-specific data
Source code in vllm/distributed/weight_transfer/base.py
reset_weight_update_target() ¶
Restore weight updates to the engine's default target model.
set_weight_update_target(model, model_config) ¶
Set the model that will receive the active weight update.
shutdown() abstractmethod ¶
Shutdown the weight transfer engine. This should be called when the worker is shutting down.
start_weight_update() abstractmethod ¶
Prepare the engine for a new weight update.
Engines that receive weights in checkpoint format initialize layerwise reloading here, else this is typically a no-op. See: https://docs.vllm.ai/en/latest/training/layerwise/ for more details.
Source code in vllm/distributed/weight_transfer/base.py
update_weights(update_info) ¶
Receive one weight update chunk and load it into the model.
Parameters:
Source code in vllm/distributed/weight_transfer/base.py
WeightTransferInitInfo dataclass ¶
WeightTransferInitRequest dataclass ¶
WeightTransferUpdateInfo dataclass ¶
WeightTransferUpdateRequest dataclass ¶
materialize_full_tensor(tensor) ¶
Return a full, locally-materialized tensor ready to send.
FSDP shards (DTensors) expose full_tensor(), a collective all-gather; regular tensors do not and are returned unchanged. Trainer engines call this at send time so the (potentially expensive) gather happens exactly once — reading .shape/.dtype for metadata does not trigger it.