diff --git a/python/sglang/cli/main.py b/python/sglang/cli/main.py index e8d3b7558..76f11c502 100644 --- a/python/sglang/cli/main.py +++ b/python/sglang/cli/main.py @@ -2,10 +2,19 @@ import argparse from sglang.cli.generate import generate from sglang.cli.serve import serve +from sglang.cli.utils import get_git_commit_hash +from sglang.version import __version__ + + +def version(args, extra_argv): + print(f"sglang version: {__version__}") + print(f"git revision: {get_git_commit_hash()[:7]}") def main(): parser = argparse.ArgumentParser() + + # complex sub commands subparsers = parser.add_subparsers(dest="subcommand", required=True) serve_parser = subparsers.add_parser( @@ -22,5 +31,12 @@ def main(): ) generate_parser.set_defaults(func=generate) + # simple commands + version_parser = subparsers.add_parser( + "version", + help="Show the version information.", + ) + version_parser.set_defaults(func=version) + args, extra_argv = parser.parse_known_args() args.func(args, extra_argv) diff --git a/python/sglang/cli/utils.py b/python/sglang/cli/utils.py index 57068fc42..22e927c21 100644 --- a/python/sglang/cli/utils.py +++ b/python/sglang/cli/utils.py @@ -2,7 +2,9 @@ import hashlib import json import logging import os +import subprocess import tempfile +from functools import lru_cache from typing import Optional import filelock @@ -150,3 +152,22 @@ def get_model_path(extra_argv): "Please provide the path to the model." ) return model_path + + +@lru_cache(maxsize=1) +def get_git_commit_hash() -> str: + try: + commit_hash = os.environ.get("SGLANG_GIT_COMMIT") + if not commit_hash: + commit_hash = ( + subprocess.check_output( + ["git", "rev-parse", "HEAD"], stderr=subprocess.DEVNULL + ) + .strip() + .decode("utf-8") + ) + _CACHED_COMMIT_HASH = commit_hash + return commit_hash + except (subprocess.CalledProcessError, FileNotFoundError): + _CACHED_COMMIT_HASH = "N/A" + return "N/A" diff --git a/python/sglang/multimodal_gen/runtime/loader/component_loader.py b/python/sglang/multimodal_gen/runtime/loader/component_loader.py index fde23b2a0..d29c03bf3 100644 --- a/python/sglang/multimodal_gen/runtime/loader/component_loader.py +++ b/python/sglang/multimodal_gen/runtime/loader/component_loader.py @@ -149,7 +149,7 @@ class ComponentLoader(ABC): """ gpu_mem_before_loading = current_platform.get_available_gpu_memory() logger.info( - "Loading %s. avail mem: %.2f GB", + "Loading %s from %s. avail mem: %.2f GB", module_name, component_model_path, gpu_mem_before_loading, diff --git a/python/sglang/version.py b/python/sglang/version.py index dde3cf776..b869775f0 100644 --- a/python/sglang/version.py +++ b/python/sglang/version.py @@ -1,6 +1,24 @@ try: from sglang._version import __version__, __version_tuple__ except ImportError: - # Fallback for development without build - __version__ = "0.0.0.dev0" - __version_tuple__ = (0, 0, 0, "dev0") + try: + import importlib.metadata + + __version__ = importlib.metadata.version("sglang") + __version_tuple__ = tuple(__version__.split(".")) + except Exception: + try: + import pathlib + + from setuptools_scm import get_version + + # point to the directory containing pyproject.toml. + project_root = pathlib.Path(__file__).parent.parent.parent + __version__ = get_version( + root=str(project_root), fallback_version="0.0.0.dev0" + ) + __version_tuple__ = tuple(__version__.split(".")) + except Exception: + # Fallback for development without build + __version__ = "0.0.0.dev0" + __version_tuple__ = (0, 0, 0, "dev0")