Fix /model_info serialization when a config value is a class (#39237)
Co-authored-by: Lianmin Zheng <lianminzheng@gmail.com>
This commit is contained in:
co-authored by
Lianmin Zheng
parent
276663a79d
commit
c0b8725f5a
@@ -785,7 +785,7 @@ async def model_info():
|
|||||||
config=resolving_view(_global_state.tokenizer_manager.server_args),
|
config=resolving_view(_global_state.tokenizer_manager.server_args),
|
||||||
model_config=model_config,
|
model_config=model_config,
|
||||||
)
|
)
|
||||||
return result
|
return msgspec_to_builtins(result)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/get_weight_version")
|
@app.get("/get_weight_version")
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ def msgspec_to_builtins(obj: Any) -> Any:
|
|||||||
for f in dataclasses.fields(obj)
|
for f in dataclasses.fields(obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if isinstance(obj, type):
|
||||||
|
return f"{obj.__module__}.{obj.__qualname__}"
|
||||||
|
|
||||||
if isinstance(obj, dict):
|
if isinstance(obj, dict):
|
||||||
return {key: msgspec_to_builtins(value) for key, value in obj.items()}
|
return {key: msgspec_to_builtins(value) for key, value in obj.items()}
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,10 @@ from sglang.test.test_utils import CustomTestCase
|
|||||||
register_cpu_ci(est_time=13, suite="base-a-test-cpu")
|
register_cpu_ci(est_time=13, suite="base-a-test-cpu")
|
||||||
|
|
||||||
|
|
||||||
|
class _CustomModelLoader:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def _stub_tokenizer_manager(
|
def _stub_tokenizer_manager(
|
||||||
server_args: ServerArgs, get_internal_state=None
|
server_args: ServerArgs, get_internal_state=None
|
||||||
) -> TokenizerManager:
|
) -> TokenizerManager:
|
||||||
@@ -57,6 +61,45 @@ def _stub_tokenizer_manager(
|
|||||||
return tokenizer_manager
|
return tokenizer_manager
|
||||||
|
|
||||||
|
|
||||||
|
class TestModelInfoSerialization(CustomTestCase):
|
||||||
|
def test_model_info_serializes_custom_loader_class(self):
|
||||||
|
server_args = ServerArgs(model_path="dummy")
|
||||||
|
values = {
|
||||||
|
"weight_version": None,
|
||||||
|
"load_format": _CustomModelLoader,
|
||||||
|
"reasoning_parser": None,
|
||||||
|
"tool_call_parser": None,
|
||||||
|
}
|
||||||
|
tokenizer_manager = SimpleNamespace(
|
||||||
|
model_config=SimpleNamespace(
|
||||||
|
is_image_understandable_model=False,
|
||||||
|
is_audio_understandable_model=False,
|
||||||
|
hf_config=SimpleNamespace(
|
||||||
|
model_type="test", architectures=["TestModel"]
|
||||||
|
),
|
||||||
|
embedding_model_spec=None,
|
||||||
|
),
|
||||||
|
model_path="dummy",
|
||||||
|
served_model_name="dummy",
|
||||||
|
server_args=server_args,
|
||||||
|
is_generation=True,
|
||||||
|
config_value=values.__getitem__,
|
||||||
|
)
|
||||||
|
prior_state = http_server.get_global_state()
|
||||||
|
http_server.set_global_state(
|
||||||
|
SimpleNamespace(tokenizer_manager=tokenizer_manager)
|
||||||
|
)
|
||||||
|
publish(server_args, role="tokenizer")
|
||||||
|
try:
|
||||||
|
payload = asyncio.run(http_server.model_info())
|
||||||
|
finally:
|
||||||
|
http_server._global_state = prior_state
|
||||||
|
reset_context()
|
||||||
|
|
||||||
|
self.assertEqual(payload["load_format"], f"{__name__}._CustomModelLoader")
|
||||||
|
json.dumps(payload)
|
||||||
|
|
||||||
|
|
||||||
def _call_server_info_with(
|
def _call_server_info_with(
|
||||||
server_args: ServerArgs,
|
server_args: ServerArgs,
|
||||||
internal_states: list[dict] | None = None,
|
internal_states: list[dict] | None = None,
|
||||||
|
|||||||
Reference in New Issue
Block a user