Adding solo_only option to the recipe
This commit is contained in:
@@ -68,6 +68,7 @@ RECIPE YAML SCHEMA:
|
|||||||
env: dict # Optional: Environment variables
|
env: dict # Optional: Environment variables
|
||||||
build_args: list[str] # Optional: Args for build-and-copy.sh
|
build_args: list[str] # Optional: Args for build-and-copy.sh
|
||||||
cluster_only: bool # Optional: Require cluster mode (default: false)
|
cluster_only: bool # Optional: Require cluster mode (default: false)
|
||||||
|
solo_only: bool # Optional: Require solo mode (default: false)
|
||||||
|
|
||||||
RECIPE VERSION HISTORY:
|
RECIPE VERSION HISTORY:
|
||||||
Version 1 (default): Initial schema with all fields above supported.
|
Version 1 (default): Initial schema with all fields above supported.
|
||||||
@@ -132,6 +133,7 @@ def load_recipe(recipe_path: Path) -> dict[str, Any]:
|
|||||||
env (dict, optional): Environment variables to export before running
|
env (dict, optional): Environment variables to export before running
|
||||||
build_args (list[str], optional): Extra args for build-and-copy.sh (e.g., ['-f', 'Dockerfile.mxfp4'])
|
build_args (list[str], optional): Extra args for build-and-copy.sh (e.g., ['-f', 'Dockerfile.mxfp4'])
|
||||||
cluster_only (bool, optional): If True, recipe cannot run in solo mode
|
cluster_only (bool, optional): If True, recipe cannot run in solo mode
|
||||||
|
solo_only (bool, optional): If True, recipe cannot run in cluster mode
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
recipe_path: Path object pointing to YAML file or just recipe name
|
recipe_path: Path object pointing to YAML file or just recipe name
|
||||||
@@ -175,6 +177,8 @@ def load_recipe(recipe_path: Path) -> dict[str, Any]:
|
|||||||
recipe.setdefault("mods", [])
|
recipe.setdefault("mods", [])
|
||||||
recipe.setdefault("defaults", {})
|
recipe.setdefault("defaults", {})
|
||||||
recipe.setdefault("env", {})
|
recipe.setdefault("env", {})
|
||||||
|
recipe.setdefault("cluster_only", False)
|
||||||
|
recipe.setdefault("solo_only", False)
|
||||||
|
|
||||||
# Validate recipe version compatibility
|
# Validate recipe version compatibility
|
||||||
# EXTENSIBILITY: When adding new schema versions, update SUPPORTED_VERSIONS
|
# EXTENSIBILITY: When adding new schema versions, update SUPPORTED_VERSIONS
|
||||||
@@ -221,6 +225,7 @@ def list_recipes() -> None:
|
|||||||
model = recipe.get("model", "")
|
model = recipe.get("model", "")
|
||||||
mods = recipe.get("mods", [])
|
mods = recipe.get("mods", [])
|
||||||
cluster_only = recipe.get("cluster_only", False)
|
cluster_only = recipe.get("cluster_only", False)
|
||||||
|
solo_only = recipe.get("solo_only", False)
|
||||||
|
|
||||||
print(f" {recipe_path.name}")
|
print(f" {recipe_path.name}")
|
||||||
print(f" Name: {name}")
|
print(f" Name: {name}")
|
||||||
@@ -229,7 +234,9 @@ def list_recipes() -> None:
|
|||||||
if model:
|
if model:
|
||||||
print(f" Model: {model}")
|
print(f" Model: {model}")
|
||||||
if cluster_only:
|
if cluster_only:
|
||||||
print(f" Cluster only: Yes")
|
print(" Cluster only: Yes")
|
||||||
|
if solo_only:
|
||||||
|
print(" Solo only: Yes")
|
||||||
print(f" Container: {container}")
|
print(f" Container: {container}")
|
||||||
if build_args:
|
if build_args:
|
||||||
print(f" Build args: {' '.join(build_args)}")
|
print(f" Build args: {' '.join(build_args)}")
|
||||||
@@ -921,6 +928,7 @@ Examples:
|
|||||||
|
|
||||||
# Check if recipe requires cluster mode
|
# Check if recipe requires cluster mode
|
||||||
cluster_only = recipe.get("cluster_only", False)
|
cluster_only = recipe.get("cluster_only", False)
|
||||||
|
solo_only = recipe.get("solo_only", False)
|
||||||
is_solo = args.solo or not is_cluster
|
is_solo = args.solo or not is_cluster
|
||||||
|
|
||||||
if cluster_only and is_solo:
|
if cluster_only and is_solo:
|
||||||
@@ -932,6 +940,14 @@ Examples:
|
|||||||
print(f" 2. Auto-discover and save: {sys.argv[0]} --discover")
|
print(f" 2. Auto-discover and save: {sys.argv[0]} --discover")
|
||||||
print(f" Then run: {sys.argv[0]} {args.recipe}")
|
print(f" Then run: {sys.argv[0]} {args.recipe}")
|
||||||
return 1
|
return 1
|
||||||
|
if solo_only and not is_solo:
|
||||||
|
print(f"Error: Recipe '{recipe['name']}' requires solo mode.")
|
||||||
|
print("This recipe is intended to run on a single node only.")
|
||||||
|
print()
|
||||||
|
print("Options:")
|
||||||
|
print(f" 1. Run solo: {sys.argv[0]} {args.recipe} --solo")
|
||||||
|
print(f" 2. Remove nodes from .env: {sys.argv[0]} --show-env")
|
||||||
|
return 1
|
||||||
|
|
||||||
# Determine copy targets for cluster deployments
|
# Determine copy targets for cluster deployments
|
||||||
copy_targets = worker_nodes if is_cluster else None
|
copy_targets = worker_nodes if is_cluster else None
|
||||||
@@ -944,7 +960,9 @@ Examples:
|
|||||||
if model:
|
if model:
|
||||||
print(f"Model: {model}")
|
print(f"Model: {model}")
|
||||||
if cluster_only:
|
if cluster_only:
|
||||||
print(f"Cluster only: Yes (model too large for single node)")
|
print("Cluster only: Yes (model too large for single node)")
|
||||||
|
if solo_only:
|
||||||
|
print("Solo only: Yes (single node only)")
|
||||||
if nodes:
|
if nodes:
|
||||||
source = "(from .env)" if nodes_from_env else ""
|
source = "(from .env)" if nodes_from_env else ""
|
||||||
print(f"Nodes: {', '.join(nodes)} {source}".strip())
|
print(f"Nodes: {', '.join(nodes)} {source}".strip())
|
||||||
|
|||||||
Reference in New Issue
Block a user