import sys
from contextlib import contextmanager
from types import ModuleType
import pytest
import torch
from torch import nn
from modelexpress.refit.reshard.types import IncompleteRefit
from modelexpress_rl.inference.engines.vllm.installer import (
_update_mla_absorbed_weights,
_VllmInstaller,
)
def _install_fake_vllm(monkeypatch, initialize):
@contextmanager
def current_config(_config):
yield
class QuantizeMethodBase:
pass
modules = {
"vllm": ModuleType("vllm"),
"vllm.config": ModuleType("vllm.config"),
"vllm.model_executor": ModuleType("vllm.model_executor"),
"vllm.model_executor.layers": ModuleType("vllm.model_executor.layers"),
"vllm.model_executor.layers.quantization": ModuleType(
"vllm.model_executor.layers.quantization"
),
"vllm.model_executor.layers.quantization.base_config": ModuleType(
"vllm.model_executor.layers.quantization.base_config"
),
"vllm.model_executor.model_loader": ModuleType(
"vllm.model_executor.model_loader"
),
"vllm.model_executor.model_loader.reload": ModuleType(
"vllm.model_executor.model_loader.reload"
),
"vllm.model_executor.model_loader.reload.layerwise": ModuleType(
"vllm.model_executor.model_loader.reload.layerwise"
),
}
modules["vllm.config"].set_current_vllm_config = current_config
modules[
"vllm.model_executor.layers.quantization.base_config"
].QuantizeMethodBase = QuantizeMethodBase
layerwise = modules["vllm.model_executor.model_loader.reload.layerwise"]
layerwise.LAYERWISE_INFO = {}
layerwise.initialize_layerwise_reload = initialize
layerwise.finalize_layerwise_reload = lambda _model, _config: None
layerwise._copy_and_restore_kernel_tensors = lambda _layer, _info: None
for name, module in modules.items():
monkeypatch.setitem(sys.modules, name, module)
def test_installer_resolves_load_time_parameters_after_layerwise_reload(monkeypatch):
model = nn.Module()
model.register_parameter("packed", nn.Parameter(torch.zeros(1)))
def initialize(target):
del target._parameters["packed"]
target.register_parameter("weight", nn.Parameter(torch.empty(1, device="meta")))
_install_fake_vllm(monkeypatch, initialize)
installer = _VllmInstaller(
model=model,
vllm_config=object(),
model_config=object(),
device=torch.device("cpu"),
)
installer._process_and_commit({"weight": torch.tensor([7.0])})
assert model.weight.item() == 7.0
def test_installer_rejects_parameters_left_on_meta(monkeypatch):
model = nn.Module()
def initialize(target):
target.register_parameter("weight", nn.Parameter(torch.empty(1, device="meta")))
target.register_parameter("orphan", nn.Parameter(torch.empty(1, device="meta")))
_install_fake_vllm(monkeypatch, initialize)
installer = _VllmInstaller(
model=model,
vllm_config=object(),
model_config=object(),
device=torch.device("cpu"),
)
with pytest.raises(IncompleteRefit, match="left parameters on the meta device"):
installer._process_and_commit({"weight": torch.tensor([7.0])})
def test_installer_caches_parameter_layout():
twin = nn.Module()
twin.register_parameter(
"weight",
nn.Parameter(torch.empty((2, 3), dtype=torch.float16)),
)
calls = []
installer = object.__new__(_VllmInstaller)
installer._parameter_layout = None
def build_meta_twin():
calls.append("build")
return twin
installer._build_meta_twin = build_meta_twin
first = installer.parameter_layout()
second = installer.parameter_layout()
assert first == {"weight": ((2, 3), torch.float16)}
assert second is first
assert calls == ["build"]
def test_installer_rejects_quantized_mla_derived_weight_refresh():
model = nn.Module()
mla = nn.Module()
mla.kv_b_proj = nn.Linear(1, 1, bias=False)
mla.W_UV = torch.zeros(1)
model.add_module("mla", mla)
with pytest.raises(IncompleteRefit, match="quantized kv_b_proj"):
_update_mla_absorbed_weights(model, quantized=True)