from __future__ import annotations
import logging
import torch.nn as nn
from modelexpress.tracing import tracer
from ..adapter import StrategyFailed, UnsupportedCapability
from .base import (
LoadContext,
LoadResult,
LoadStrategy,
SourceTransferError,
publish_source_if_supported,
register_tensors,
publish_metadata,
unpublish_metadata,
)
__all__ = [
"LoadContext",
"LoadResult",
"LoadStrategy",
"LoadStrategyChain",
"SourceTransferError",
"register_tensors",
"publish_metadata",
"unpublish_metadata",
]
logger = logging.getLogger("modelexpress.load_strategy")
class LoadStrategyChain:
@staticmethod
def run(model: nn.Module, ctx: LoadContext) -> nn.Module:
from .rdma_strategy import RdmaStrategy
from .server_cache_strategy import ServerCacheStrategy
from .instant_tensor_strategy import InstantTensorStrategy
from .model_streamer_strategy import ModelStreamerStrategy
from .gds_strategy import GdsStrategy
from .default_strategy import DefaultStrategy
all_strategies: list[LoadStrategy] = [
RdmaStrategy(),
ServerCacheStrategy(),
InstantTensorStrategy(),
ModelStreamerStrategy(),
GdsStrategy(),
DefaultStrategy(),
]
eligible = [s for s in all_strategies if s.is_available(ctx)]
logger.info(f"Eligible loaders: {[s.name for s in eligible]}")
result = LoadResult(value=model, model=model)
with tracer.start_as_current_span("Load model") as span:
span.set_attribute("model_name", ctx.identity.model_name)
span.set_attribute("global_rank", ctx.global_rank)
span.set_attribute("eligible_strategies", [s.name for s in eligible])
for strategy in eligible:
logger.info(f"[Worker {ctx.global_rank}] Trying strategy: {strategy.name}")
try:
result = strategy.load(result, ctx)
publish_source_if_supported(result, ctx)
span.set_attribute("weight_loading_strategy", strategy.name)
return result.value
except StrategyFailed as e:
logger.warning(
f"[Worker {ctx.global_rank}] Strategy {strategy.name} failed, "
f"trying next: {e}"
)
strategy.rollback(ctx)
if e.mutated:
result = LoadStrategyChain._reinit_for_retry(result, ctx, strategy)
continue
except Exception as e:
logger.warning(
f"[Worker {ctx.global_rank}] Strategy {strategy.name} "
f"raised unexpected error, trying next: {e}"
)
strategy.rollback(ctx)
raise RuntimeError(
f"[Worker {ctx.global_rank}] No loading strategy succeeded "
f"for model '{ctx.identity.model_name}'"
)
@staticmethod
def _reinit_for_retry(
result: LoadResult,
ctx: LoadContext,
strategy: LoadStrategy,
) -> LoadResult:
if ctx.adapter is None:
raise RuntimeError(
f"[Worker {ctx.global_rank}] Strategy '{strategy.name}' mutated "
"the model but no adapter can reinitialize it"
)
try:
return ctx.adapter.reinit_for_retry(result)
except UnsupportedCapability as exc:
raise RuntimeError(
f"[Worker {ctx.global_rank}] Strategy '{strategy.name}' mutated "
"the model but adapter does not support retry reinitialization"
) from exc