mirror of
https://github.com/pytorch/pytorch.git
synced 2025-11-03 07:24:58 +08:00
# set up vllm build logic - dockerfile: please notice the dockfile introduced here is only temporary, once we migrate this file to vllm, we will fetch it directly from there - VllmBuildRunner: - implement logic to prepare and run vllm build with dockerfile - Pull Request resolved: https://github.com/pytorch/pytorch/pull/160089 Approved by: https://github.com/huydhn ghstack dependencies: #160043
111 lines
2.8 KiB
Python
111 lines
2.8 KiB
Python
"""
|
|
Environment Variables and Dataclasses Utility helpers for CLI tasks.
|
|
"""
|
|
|
|
import os
|
|
from dataclasses import field, fields, is_dataclass, MISSING
|
|
from pathlib import Path
|
|
from textwrap import indent
|
|
from typing import Optional, Union
|
|
|
|
from cli.lib.common.utils import str2bool
|
|
|
|
|
|
def get_env(name: str, default: str = "") -> str:
|
|
"""Get environment variable with default fallback."""
|
|
return os.environ.get(name) or default
|
|
|
|
|
|
def env_path_optional(
|
|
name: str,
|
|
default: Optional[Union[str, Path]] = None,
|
|
resolve: bool = True,
|
|
) -> Optional[Path]:
|
|
"""Get environment variable as optional Path."""
|
|
val = get_env(name) or default
|
|
if not val:
|
|
return None
|
|
|
|
path = Path(val)
|
|
return path.resolve() if resolve else path
|
|
|
|
|
|
def env_path(
|
|
name: str,
|
|
default: Optional[Union[str, Path]] = None,
|
|
resolve: bool = True,
|
|
) -> Path:
|
|
"""Get environment variable as Path, raise if missing."""
|
|
path = env_path_optional(name, default, resolve)
|
|
if not path:
|
|
raise ValueError(f"Missing path value for {name}")
|
|
return path
|
|
|
|
|
|
def env_bool(
|
|
name: str,
|
|
default: bool = False,
|
|
) -> bool:
|
|
val = get_env(name)
|
|
if not val:
|
|
return default
|
|
return str2bool(val)
|
|
|
|
|
|
def env_bool_field(
|
|
name: str,
|
|
default: bool = False,
|
|
):
|
|
return field(default_factory=lambda: env_bool(name, default))
|
|
|
|
|
|
def env_path_field(
|
|
name: str,
|
|
default: Union[str, Path] = "",
|
|
*,
|
|
resolve: bool = True,
|
|
) -> Path:
|
|
return field(default_factory=lambda: env_path(name, default, resolve=resolve))
|
|
|
|
|
|
def env_str_field(
|
|
name: str,
|
|
default: str = "",
|
|
) -> str:
|
|
return field(default_factory=lambda: get_env(name, default))
|
|
|
|
|
|
def generate_dataclass_help(cls) -> str:
|
|
"""Auto-generate help text for dataclass fields."""
|
|
if not is_dataclass(cls):
|
|
raise TypeError(f"{cls} is not a dataclass")
|
|
|
|
def get_value(f):
|
|
if f.default is not MISSING:
|
|
return f.default
|
|
if f.default_factory is not MISSING:
|
|
try:
|
|
return f.default_factory()
|
|
except Exception as e:
|
|
return f"<error: {e}>"
|
|
return "<required>"
|
|
|
|
lines = [f"{f.name:<22} = {repr(get_value(f))}" for f in fields(cls)]
|
|
return indent("\n".join(lines), " ")
|
|
|
|
|
|
def with_params_help(params_cls: type, title: str = "Parameter defaults"):
|
|
"""
|
|
Class decorator that appends a help table generated from another dataclass
|
|
(e.g., VllmParameters) to the decorated class's docstring.
|
|
"""
|
|
if not is_dataclass(params_cls):
|
|
raise TypeError(f"{params_cls} must be a dataclass")
|
|
|
|
def _decorator(cls: type) -> type:
|
|
block = generate_dataclass_help(params_cls)
|
|
cls.__doc__ = (cls.__doc__ or "") + f"\n\n{title}:\n{block}"
|
|
return cls
|
|
|
|
return _decorator
|