2026-09-10 06:54:22 +08:00
|
|
|
__all__ = ['build_model']
|
|
|
|
|
|
2026-09-10 13:20:54 +08:00
|
|
|
import importlib
|
|
|
|
|
|
2026-09-10 06:54:22 +08:00
|
|
|
from utils import Registry
|
|
|
|
|
|
|
|
|
|
META_ARCHITECTURES = Registry()
|
2026-09-10 13:20:54 +08:00
|
|
|
_MAMBA_MODELS = frozenset({"Mamba", "MambaA"})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _load_optional_architecture(model_name):
|
|
|
|
|
if model_name not in _MAMBA_MODELS or model_name in META_ARCHITECTURES:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
importlib.import_module(".mamba", package=__package__)
|
|
|
|
|
except ModuleNotFoundError as error:
|
|
|
|
|
missing_package = error.name or "mamba_ssm"
|
|
|
|
|
raise ModuleNotFoundError(
|
|
|
|
|
f"Model {model_name!r} requires the optional Mamba backend "
|
|
|
|
|
f"(missing package: {missing_package!r}). Install "
|
|
|
|
|
"requirements-mamba.txt, or use MiniROAD/MiniROADA without it."
|
|
|
|
|
) from error
|
|
|
|
|
|
2026-09-10 06:54:22 +08:00
|
|
|
|
|
|
|
|
def build_model(cfg, device=None):
|
2026-09-10 13:20:54 +08:00
|
|
|
model_name = cfg["model"]
|
|
|
|
|
_load_optional_architecture(model_name)
|
|
|
|
|
|
|
|
|
|
if model_name not in META_ARCHITECTURES:
|
|
|
|
|
available = ", ".join(sorted(META_ARCHITECTURES))
|
|
|
|
|
raise KeyError(
|
|
|
|
|
f"Unknown model {model_name!r}. Available architectures: {available}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
model = META_ARCHITECTURES[model_name](cfg)
|
|
|
|
|
return model.to(device)
|