| import argparse |
| import json |
|
|
|
|
| DEFAULT_APP_NAME = "virtual-characters-vllm-gemma" |
| DEFAULT_FUNCTION_NAME = "serve" |
|
|
|
|
| def require_modal(): |
| try: |
| import modal |
| except Exception as exc: |
| raise SystemExit( |
| "Modal Python package is not installed. Install with `python -m pip install -r requirements.txt`, " |
| "then run `modal setup` to log in." |
| ) from exc |
| return modal |
|
|
|
|
| def update_autoscaler(args) -> int: |
| modal = require_modal() |
| fn = modal.Function.from_name( |
| args.app_name, |
| args.function_name, |
| environment_name=args.environment_name, |
| ) |
| fn.update_autoscaler( |
| min_containers=args.min_containers, |
| buffer_containers=args.buffer_containers, |
| scaledown_window=args.scaledown_window, |
| ) |
| print( |
| json.dumps( |
| { |
| "app": args.app_name, |
| "function": args.function_name, |
| "environment": args.environment_name, |
| "min_containers": args.min_containers, |
| "buffer_containers": args.buffer_containers, |
| "scaledown_window": args.scaledown_window, |
| "note": "Autoscaler overrides reset on the next deploy of this app.", |
| }, |
| ensure_ascii=False, |
| indent=2, |
| ) |
| ) |
| return 0 |
|
|
|
|
| def main() -> int: |
| parser = argparse.ArgumentParser(description="Update the deployed Modal vLLM autoscaler.") |
| parser.add_argument( |
| "mode", |
| choices=["on", "off"], |
| help="on keeps one vLLM container warm; off allows the deployment to scale to zero.", |
| ) |
| parser.add_argument("--app-name", default=DEFAULT_APP_NAME) |
| parser.add_argument("--function-name", default=DEFAULT_FUNCTION_NAME) |
| parser.add_argument("--environment-name") |
| parser.add_argument("--min-containers", type=int) |
| parser.add_argument("--buffer-containers", type=int) |
| parser.add_argument("--scaledown-window", type=int) |
| args = parser.parse_args() |
|
|
| if args.mode == "on": |
| args.min_containers = 1 if args.min_containers is None else args.min_containers |
| args.buffer_containers = 0 if args.buffer_containers is None else args.buffer_containers |
| args.scaledown_window = 20 * 60 if args.scaledown_window is None else args.scaledown_window |
| else: |
| args.min_containers = 0 if args.min_containers is None else args.min_containers |
| args.buffer_containers = 0 if args.buffer_containers is None else args.buffer_containers |
| args.scaledown_window = 5 * 60 if args.scaledown_window is None else args.scaledown_window |
|
|
| return update_autoscaler(args) |
|
|
|
|
| if __name__ == "__main__": |
| raise SystemExit(main()) |
|
|