|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| """
|
| Utilities to check if packages are available.
|
| We assume package availability won't change during runtime.
|
| """
|
|
|
| import importlib.util
|
| from functools import cache
|
| from typing import List, Optional
|
|
|
|
|
| @cache
|
| def is_megatron_core_available():
|
| try:
|
| mcore_spec = importlib.util.find_spec("megatron.core")
|
| except ModuleNotFoundError:
|
| mcore_spec = None
|
| return mcore_spec is not None
|
|
|
|
|
| @cache
|
| def is_vllm_available():
|
| try:
|
| vllm_spec = importlib.util.find_spec("vllm")
|
| except ModuleNotFoundError:
|
| vllm_spec = None
|
| return vllm_spec is not None
|
|
|
|
|
| @cache
|
| def is_sglang_available():
|
| try:
|
| sglang_spec = importlib.util.find_spec("sglang")
|
| except ModuleNotFoundError:
|
| sglang_spec = None
|
| return sglang_spec is not None
|
|
|
|
|
| def import_external_libs(external_libs=None):
|
| if external_libs is None:
|
| return
|
| if not isinstance(external_libs, List):
|
| external_libs = [external_libs]
|
| import importlib
|
|
|
| for external_lib in external_libs:
|
| importlib.import_module(external_lib)
|
|
|
|
|
| def load_extern_type(file_path: Optional[str], type_name: Optional[str]):
|
| """Load a external data type based on the file path and type name"""
|
| import importlib.util
|
| import os
|
|
|
| if not file_path:
|
| return None
|
|
|
| if not os.path.exists(file_path):
|
| raise FileNotFoundError(f"Custom type file '{file_path}' not found.")
|
|
|
| spec = importlib.util.spec_from_file_location("custom_module", file_path)
|
| module = importlib.util.module_from_spec(spec)
|
| try:
|
| spec.loader.exec_module(module)
|
| except Exception as e:
|
| raise RuntimeError(f"Error loading module from '{file_path}'") from e
|
|
|
| if not hasattr(module, type_name):
|
| raise AttributeError(f"Custom type '{type_name}' not found in '{file_path}'.")
|
|
|
| return getattr(module, type_name)
|
|
|
|
|
| def _get_qualified_name(func):
|
| """Get full qualified name including module and class (if any)."""
|
| module = func.__module__
|
| qualname = func.__qualname__
|
| return f"{module}.{qualname}"
|
|
|
| def deprecated(replacement: str = ""):
|
| """Decorator to mark APIs as deprecated."""
|
| import warnings
|
| import functools
|
|
|
| def decorator(func):
|
| qualified_name = _get_qualified_name(func)
|
| @functools.wraps(func)
|
| def wrapped(*args, **kwargs):
|
| msg = f"Warning: API '{qualified_name}' is deprecated."
|
| if replacement:
|
| msg += f" Please use '{replacement}' instead."
|
| warnings.warn(msg, category=DeprecationWarning, stacklevel=2)
|
| return func(*args, **kwargs)
|
| return wrapped
|
| return decorator |