From 3037f9a1cbe476bffe60554c5c9b9255129b1ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=93=E9=9B=B7?= Date: Thu, 9 Oct 2025 17:36:35 +0800 Subject: [PATCH 1/8] add skypilot launcher and examples --- areal/api/cli_args.py | 156 ++++++ areal/launcher/skypilot.py | 672 ++++++++++++++++++++++++++ docs/generate_cli_docs.py | 11 +- docs/tutorial/installation.md | 48 ++ examples/skypilot/README.md | 149 ++++++ examples/skypilot/gsm8k_grpo_ray.yaml | 153 ++++++ examples/skypilot/ray_cluster.yaml | 0 7 files changed, 1187 insertions(+), 2 deletions(-) create mode 100644 areal/launcher/skypilot.py create mode 100644 examples/skypilot/README.md create mode 100644 examples/skypilot/gsm8k_grpo_ray.yaml create mode 100644 examples/skypilot/ray_cluster.yaml diff --git a/areal/api/cli_args.py b/areal/api/cli_args.py index 5d42d042c..215bd0932 100644 --- a/areal/api/cli_args.py +++ b/areal/api/cli_args.py @@ -989,6 +989,158 @@ class SlurmLauncherConfig: ) +@dataclass +class SkyPilotLauncherConfig: + """Configuration for launching the training jobs with SkyPilot.""" + + # Basic task metadata + name: str | None = field( + default=None, + metadata={"help": "Optional task name displayed in SkyPilot."}, + ) + workdir: str | None = field( + default=None, + metadata={ + "help": "Local path or git repo spec to sync as working directory (mirrors SkyPilot YAML workdir)." + }, + ) + + # Core resource specification (subset of SkyPilot resources.* fields) + infra: str | None = field( + default=None, + metadata={ + "help": "Infrastructure spec // or k8s[/context] (resources.infra).", + }, + ) + accelerators: str | None = field( + default=None, + metadata={ + "help": "Accelerator request, e.g. 'H100:8'. Currently only single-type requests supported (resources.accelerators).", + }, + ) + accelerator_args: str | None = field( + default=None, + metadata={ + "help": "Additional accelerator args (YAML/JSON string) (resources.accelerator_args).", + }, + ) + cpus: str | None = field( + default=None, + metadata={"help": "vCPU spec per node, e.g. '4+', '16' (resources.cpus)."}, + ) + memory: str | None = field( + default=None, + metadata={ + "help": "Memory spec per node, e.g. '32+', '64GB' (resources.memory)." + }, + ) + instance_type: str | None = field( + default=None, + metadata={"help": "Explicit instance type (resources.instance_type)."}, + ) + use_spot: bool = field( + default=False, + metadata={ + "help": "Whether to use spot/preemptible instances (resources.use_spot)." + }, + ) + disk_size: str | None = field( + default=None, + metadata={ + "help": "Boot disk size with optional unit, e.g. '256', '256GB' (resources.disk_size)." + }, + ) + disk_tier: str = field( + default="medium", + metadata={ + "help": "Disk performance tier (resources.disk_tier).", + "choices": ["low", "medium", "high", "ultra", "best"], + }, + ) + network_tier: str = field( + default="standard", + metadata={ + "help": "Network tier (resources.network_tier).", + "choices": ["standard", "best"], + }, + ) + ports: str | None = field( + default=None, + metadata={ + "help": "Ports to expose, supports single '8080', range '10052-10100', or comma list (resources.ports)." + }, + ) + image_id: str | None = field( + default=None, + metadata={"help": "Custom base or docker image id (resources.image_id)."}, + ) + labels: str | None = field( + default=None, + metadata={ + "help": "Instance/pod labels as key=value pairs joined by commas (resources.labels)." + }, + ) + + any_of: str | None = field( + default=None, + metadata={ + "help": "YAML/JSON string list of candidate resource dicts (resources.any_of)." + }, + ) + ordered: str | None = field( + default=None, + metadata={ + "help": "YAML/JSON string list of ordered resource dicts (resources.ordered)." + }, + ) + job_recovery: str | None = field( + default=None, + metadata={ + "help": "Job recovery strategy spec (resources.job_recovery). Provide JSON/YAML." + }, + ) + + # Autostop: store flexible spec as raw string + autostop: str | None = field( + default=None, + metadata={ + "help": "Autostop configuration: true/false/10/10h or JSON object (resources.autostop)." + }, + ) + + # Environment & secret injection + envs: str | None = field( + default=None, + metadata={ + "help": "Environment variables (envs) as KEY=VAL pairs joined by commas." + }, + ) + secrets: str | None = field( + default=None, + metadata={ + "help": "Secrets usable in setup/run as KEY=VAL pairs joined by commas (will be redacted)." + }, + ) + + volumes: str | None = field( + default=None, + metadata={ + "help": "Kubernetes volume mappings (volumes) as YAML/JSON string or shorthand mount spec." + }, + ) + file_mounts: str | None = field( + default=None, + metadata={ + "help": "File mounts mapping remote_path:local_path lines or JSON/YAML string (file_mounts)." + }, + ) + + config: str | None = field( + default=None, + metadata={"help": "Advanced config overrides (config.*) as YAML/JSON string."}, + ) + + @dataclass class LauncherConfig: """Configuration for launching the LLM server and trainer processes.""" @@ -1027,6 +1179,10 @@ class LauncherConfig: default_factory=SlurmLauncherConfig, metadata={"help": "Slurm launcher configuration."}, ) + skypilot: SkyPilotLauncherConfig = field( + default_factory=SkyPilotLauncherConfig, + metadata={"help": "SkyPilot launcher configuration."}, + ) @dataclass diff --git a/areal/launcher/skypilot.py b/areal/launcher/skypilot.py new file mode 100644 index 000000000..c8c95446b --- /dev/null +++ b/areal/launcher/skypilot.py @@ -0,0 +1,672 @@ +"""Launch AReaL experiments on SkyPilot-managed clusters. + +This launcher mirrors the semantics of the Ray and Slurm launchers while +delegating provisioning and task execution to the SkyPilot Python SDK. +""" + +from __future__ import annotations + +import re +import shlex +import sys +import time +from pathlib import Path +from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Union + +import yaml + +from areal.api.alloc_mode import AllocationMode, AllocationType +from areal.api.cli_args import ( + ClusterSpecConfig, + LauncherConfig, + RecoverConfig, + SGLangConfig, + SkyPilotLauncherConfig, + parse_cli_args, + to_structured_cfg, + vLLMConfig, +) +from areal.utils import logging, name_resolve, names +from areal.utils.launcher import ( + JobException, + JobInfo, + JobState, + get_env_vars, + validate_config_for_distributed_launcher, + wait_llm_server_addrs, +) +from areal.utils.recover import check_if_recover + +logger = logging.getLogger("SkyPilotLauncher") + + +try: + import sky + from sky import JobStatus as SkyJobStatus +except ImportError as exc: # pragma: no cover - handled at runtime + raise ImportError( + "SkyPilot launcher requires the `skypilot` package. " + "Install it via `pip install -U skypilot`." + ) from exc + + +SKY_TO_JOB_STATE: Dict[SkyJobStatus, JobState] = { + SkyJobStatus.INIT: JobState.PENDING, + SkyJobStatus.PENDING: JobState.PENDING, + SkyJobStatus.SETTING_UP: JobState.PENDING, + SkyJobStatus.RUNNING: JobState.RUNNING, + SkyJobStatus.SUCCEEDED: JobState.COMPLETED, + SkyJobStatus.FAILED: JobState.FAILED, + SkyJobStatus.FAILED_SETUP: JobState.FAILED, + SkyJobStatus.FAILED_DRIVER: JobState.FAILED, + SkyJobStatus.CANCELLED: JobState.CANCELLED, +} + + +SKY_WAIT_CHECK_TIME_INTERVAL = 5 # seconds + + +def _readable_cluster_name(experiment_name: str, trial_name: str) -> str: + slug = f"areal-{experiment_name}-{trial_name}" + return re.sub(r"[^a-zA-Z0-9-]", "-", slug).lower() + + +def _parse_key_value_pairs(value: Optional[str]) -> Dict[str, str]: + if not value: + return {} + result = {} + for chunk in value.split(","): + if not chunk: + continue + if "=" not in chunk: + raise ValueError( + f"Environment/secret entry '{chunk}' must be in KEY=VALUE format." + ) + key, val = chunk.split("=", 1) + result[key.strip()] = val.strip() + return result + + +def _parse_yaml_like(value: Optional[str]) -> Any: + if not value: + return None + return yaml.safe_load(value) + + +def _default_workdir(skypilot_cfg: SkyPilotLauncherConfig) -> str: + if skypilot_cfg.workdir: + return skypilot_cfg.workdir + return str(Path.cwd()) + + +RunSpec = Union[str, Callable[[int, List[str]], str]] + + +class SkyPilotLauncher: + def __init__( + self, + experiment_name: str, + trial_name: str, + total_nodes: int, + skypilot_cfg: SkyPilotLauncherConfig, + ): + self.experiment_name = experiment_name + self.trial_name = trial_name + self.total_nodes = total_nodes + self.skypilot_cfg = skypilot_cfg + self.cluster_name = skypilot_cfg.name or _readable_cluster_name( + experiment_name, trial_name + ) + self._cluster_ready = False + self.jobs: Dict[int, JobInfo] = {} + self._job_meta: Dict[int, Dict[str, Any]] = {} + self._job_groups: Dict[str, set[int]] = {} + self.ensure_cluster() + + @staticmethod + def _build_resources(cfg: SkyPilotLauncherConfig) -> sky.Resources: + kwargs: Dict[str, Any] = {} + if cfg.infra: + kwargs["infra"] = cfg.infra + if cfg.accelerators: + kwargs["accelerators"] = cfg.accelerators + if cfg.accelerator_args: + kwargs["accelerator_args"] = _parse_yaml_like(cfg.accelerator_args) + if cfg.cpus: + kwargs["cpus"] = cfg.cpus + if cfg.memory: + kwargs["memory"] = cfg.memory + if cfg.instance_type: + kwargs["instance_type"] = cfg.instance_type + if cfg.use_spot is not None: + kwargs["use_spot"] = cfg.use_spot + if cfg.disk_size: + kwargs["disk_size"] = cfg.disk_size + if cfg.disk_tier: + kwargs["disk_tier"] = cfg.disk_tier + if cfg.network_tier: + kwargs["network_tier"] = cfg.network_tier + if cfg.ports: + kwargs["ports"] = cfg.ports + if cfg.image_id: + kwargs["image_id"] = _parse_yaml_like(cfg.image_id) or cfg.image_id + if cfg.labels: + kwargs["labels"] = _parse_key_value_pairs(cfg.labels) + if cfg.any_of: + kwargs["any_of"] = _parse_yaml_like(cfg.any_of) + if cfg.ordered: + kwargs["ordered"] = _parse_yaml_like(cfg.ordered) + if cfg.job_recovery: + kwargs["job_recovery"] = _parse_yaml_like(cfg.job_recovery) + if cfg.autostop: + kwargs["autostop"] = _parse_yaml_like(cfg.autostop) or cfg.autostop + if cfg.volumes: + kwargs["volumes"] = _parse_yaml_like(cfg.volumes) + return sky.Resources(**kwargs) + + def _base_task( + self, + name: str, + num_nodes: int, + run: RunSpec, + extra_envs: Optional[Dict[str, str]] = None, + ) -> sky.Task: + base_envs = _parse_key_value_pairs(self.skypilot_cfg.envs) + secrets = _parse_key_value_pairs(self.skypilot_cfg.secrets) + if secrets: + base_envs.update(secrets) + if extra_envs: + base_envs.update(extra_envs) + workdir = _default_workdir(self.skypilot_cfg) + file_mounts = None + if self.skypilot_cfg.file_mounts: + file_mounts = _parse_yaml_like(self.skypilot_cfg.file_mounts) + resources = self._build_resources(self.skypilot_cfg) + task_kwargs: Dict[str, Any] = { + "name": name, + "num_nodes": num_nodes, + "run": run, + "workdir": workdir, + } + if base_envs: + task_kwargs["envs"] = base_envs + if file_mounts: + task_kwargs["file_mounts"] = file_mounts + task = sky.Task(**task_kwargs) + task.set_resources(resources) + return task + + def ensure_cluster(self) -> None: + if self._cluster_ready: + return + provision_task = self._base_task( + name=f"{self.cluster_name}-provision", + num_nodes=self.total_nodes, + run="echo '[SkyPilot] Cluster ready for AReaL launching.'", # noqa: E501 + ) + logger.info( + "Launching/repairing SkyPilot cluster '%s' with %d node(s).", + self.cluster_name, + self.total_nodes, + ) + req_id = sky.launch(provision_task, cluster_name=self.cluster_name) + sky.stream_and_get(req_id) + self._cluster_ready = True + + @property + def run_name(self) -> str: + return f"{self.experiment_name}_{self.trial_name}" + + def submit(self, job_name: str, task: sky.Task) -> int: + job_ids = self.submit_array(job_name, [task]) + return job_ids[0] + + def submit_array(self, job_name: str, tasks: List[sky.Task]) -> List[int]: + assert tasks, "Tasks list cannot be empty." + job_ids: List[int] = [] + for idx, task in enumerate(tasks): + derived_name = job_name if len(tasks) == 1 else f"{job_name}:{idx}" + task.name = derived_name + logger.info("Submitting SkyPilot task '%s'", derived_name) + request_id = sky.exec(task, cluster_name=self.cluster_name) + job_id, _ = sky.get(request_id) + self._register_job(job_id, derived_name) + job_ids.append(job_id) + return job_ids + + def stop(self, job_name: str, force: bool = False) -> None: + job_ids = list(self._job_groups.get(job_name, set())) + if not job_ids: + return + logger.info("Stopping jobs %s (ids=%s)", job_name, job_ids) + sky.cancel(self.cluster_name, job_ids=job_ids) + for job_id in job_ids: + self._remove_job(job_id) + + def stop_all(self, force: bool = False) -> None: + job_ids = list(self.jobs.keys()) + if not job_ids: + return + logger.info("Stopping all SkyPilot jobs: %s", job_ids) + sky.cancel(self.cluster_name, job_ids=job_ids) + for job_id in job_ids: + self._remove_job(job_id) + + def find(self, job_name: str) -> Optional[JobInfo]: + self._update_all() + job_ids = list(self._job_groups.get(job_name, set())) + if not job_ids: + return None + return self.jobs[job_ids[0]] + + def find_all(self, job_name_regex: str = ".*") -> List[JobInfo]: + self._update_all() + pattern = re.compile(job_name_regex) + results: List[JobInfo] = [] + for job_id, info in self.jobs.items(): + base = self._job_meta[job_id]["base"] + if pattern.fullmatch(base): + results.append(info) + return results + + def wait( + self, + timeout: Optional[int] = None, + check_status: Tuple[JobState, ...] = ( + JobState.CANCELLED, + JobState.FAILED, + JobState.NOT_FOUND, + ), + remove_status: Tuple[JobState, ...] = (JobState.COMPLETED,), + update: bool = False, + job_names: Optional[Iterable[str]] = None, + ) -> None: + deadline = None if timeout is None else time.time() + timeout + target_ids = self._select_job_ids(job_names) + pending = set(target_ids) + if not pending: + return + logger.info("Waiting for jobs %s", sorted(pending)) + while pending: + if deadline is not None and time.time() > deadline: + raise TimeoutError( + f"Timeout waiting for jobs {sorted(pending)} to finish." + ) + self._update_all() + for job_id in list(pending): + info = self.jobs.get(job_id) + if info is None: + pending.discard(job_id) + continue + state = info.state + base = self._job_meta[job_id]["base"] + if state in check_status: + raise JobException( + run_name=self.run_name, + worker_type=base, + host=self.cluster_name, + reason=state, + ) + if state in remove_status: + logger.info( + "Job %s (id=%s) reached %s", info.name, job_id, state.name + ) + pending.discard(job_id) + if update: + self._remove_job(job_id) + if pending: + time.sleep(SKY_WAIT_CHECK_TIME_INTERVAL) + + def _register_job(self, job_id: int, job_name: str) -> None: + base = job_name.split(":", maxsplit=1)[0] + self.jobs[job_id] = JobInfo( + name=job_name, + state=JobState.PENDING, + host=self.cluster_name, + ) + self._job_meta[job_id] = {"name": job_name, "base": base} + self._job_groups.setdefault(base, set()).add(job_id) + + def _remove_job(self, job_id: int) -> None: + info = self._job_meta.pop(job_id, None) + self.jobs.pop(job_id, None) + if info is None: + return + base = info["base"] + group = self._job_groups.get(base) + if group and job_id in group: + group.remove(job_id) + if not group: + self._job_groups.pop(base, None) + + def _select_job_ids(self, job_names: Optional[Iterable[str]]) -> List[int]: + if job_names is None: + return list(self.jobs.keys()) + selected: List[int] = [] + for base in job_names: + selected.extend(list(self._job_groups.get(base, set()))) + return selected + + def _update_all(self) -> None: + if not self.jobs: + return + job_ids = list(self.jobs.keys()) + try: + status_request = sky.job_status(self.cluster_name, job_ids=job_ids) + statuses = sky.get(status_request) + except Exception as exc: # pragma: no cover - best effort logging + logger.warning("Failed to query SkyPilot job status: %s", exc) + return + for job_id in job_ids: + info = self.jobs.get(job_id) + if info is None: + continue + status = statuses.get(job_id) + if status is None: + info.state = JobState.NOT_FOUND + else: + info.state = SKY_TO_JOB_STATE.get(status, JobState.NOT_FOUND) + + +def _quoted_cmd(parts: List[str]) -> str: + return " ".join(shlex.quote(p) for p in parts) + + +def _build_sglang_task( + launcher: SkyPilotLauncher, + job_name: str, + config_args: List[str], + allocation: AllocationMode, + sglang_cfg: SGLangConfig, + n_nodes: int, + gpus_per_node: int, + env_vars: Dict[str, str], +) -> sky.Task: + assert allocation.gen_backend == "sglang" + base_seed = sglang_cfg.random_seed + n_sglang_servers = allocation.gen.dp_size + n_servers_per_node = max(n_sglang_servers // max(n_nodes, 1), 1) + cross_nodes = allocation.gen_instance_size > gpus_per_node + + def run_generator(node_rank: int, host_ips: List[str]) -> str: + args = list(config_args) + args.append(f"sglang.random_seed={base_seed + node_rank * n_servers_per_node}") + cmd = _quoted_cmd(["python", "-m", "areal.launcher.sglang_server", *args]) + exports: List[str] = [] + if cross_nodes: + exports.append(f"export AREAL_SGLANG_MULTI_NODE_RANK={node_rank}") + exports.append(f"export AREAL_SGLANG_MULTI_NODE_MASTER_ADDR={host_ips[0]}") + # TODO: find free port + exports.append("export AREAL_SGLANG_MULTI_NODE_MASTER_PORT=17901") + if exports: + return " && ".join(exports + [cmd]) + return cmd + + return launcher._base_task( # pylint: disable=protected-access + name=job_name, + num_nodes=n_nodes, + run=run_generator, + extra_envs=env_vars, + ) + + +def _build_vllm_task( + launcher: SkyPilotLauncher, + job_name: str, + config_args: List[str], + allocation: AllocationMode, + vllm_cfg: vLLMConfig, + n_nodes: int, + env_vars: Dict[str, str], +) -> sky.Task: + assert allocation.gen_backend == "vllm" + base_seed = vllm_cfg.seed + + def run_generator(node_rank: int, _host_ips: List[str]) -> str: + args = list(config_args) + args.append(f"vllm.seed={base_seed + node_rank}") + cmd = _quoted_cmd(["python", "-m", "areal.launcher.vllm_server", *args]) + return cmd + + return launcher._base_task( # pylint: disable=protected-access + name=job_name, + num_nodes=n_nodes, + run=run_generator, + extra_envs=env_vars, + ) + + +def _build_trainer_task( + launcher: SkyPilotLauncher, + job_name: str, + trainer_entry: str, + trainer_args: List[str], + allocation: AllocationMode, + n_nodes: int, + gpus_per_node: int, + env_vars: Dict[str, str], + is_eval_only: bool, +) -> sky.Task: + + if is_eval_only: + + cmd = _quoted_cmd(["python", trainer_entry, *trainer_args]) + return launcher._base_task( + job_name, + num_nodes=1, + run=cmd, + extra_envs=env_vars, + ) + + # TODO: find free port + rendezvous_port = 29501 + + def run_generator(node_rank: int, host_ips: List[str]) -> str: + master_addr = host_ips[0] + torchrun_cmd = [ + "torchrun", + "--nnodes", + str(n_nodes), + "--nproc-per-node", + str(gpus_per_node), + "--rdzv_backend", + "c10d", + "--rdzv_endpoint", + f"{master_addr}:{rendezvous_port}", + "--node_rank", + str(node_rank), + trainer_entry, + *trainer_args, + ] + cmd = _quoted_cmd(torchrun_cmd) + return cmd + + return launcher._base_task( + job_name, + num_nodes=n_nodes, + run=run_generator, + extra_envs=env_vars, + ) + + +def skypilot_main(config, run_id: int = 0): + config.launcher = to_structured_cfg(config.launcher, LauncherConfig) + config.recover = to_structured_cfg(config.recover, RecoverConfig) + config.cluster = to_structured_cfg(config.cluster, ClusterSpecConfig) + config.launcher.skypilot = to_structured_cfg( + config.launcher.skypilot, SkyPilotLauncherConfig + ) + + is_recover_run = check_if_recover(config.recover, run_id) + validate_config_for_distributed_launcher(config) + + name_resolve.reconfigure(config.cluster.name_resolve) + name_resolve.clear_subtree( + names.trial_root( + experiment_name=config.experiment_name, trial_name=config.trial_name + ) + ) + + allocation_mode = AllocationMode.from_str(config.allocation_mode) + launcher = SkyPilotLauncher( + experiment_name=config.experiment_name, + trial_name=config.trial_name, + total_nodes=config.cluster.n_nodes, + skypilot_cfg=config.launcher.skypilot, + ) + launcher.ensure_cluster() + + trainer_entry = sys.argv[1] + trainer_args = sys.argv[2:] + + llm_job_name: Optional[str] = None + llm_addrs: List[str] = [] + + try: + gpus_per_node = config.cluster.n_gpus_per_node + llm_backend = allocation_mode.gen_backend + if llm_backend == "sglang": + llm_job_name = f"{launcher.cluster_name}-sglang" + config.sglang = to_structured_cfg(config.sglang, SGLangConfig) + n_llm_nodes = max( + (allocation_mode.gen.world_size + gpus_per_node - 1) + // max(gpus_per_node, 1), + 1, + ) + llm_env = get_env_vars( + config.cluster.cluster_name, + config.launcher.inference_server_env_vars, + ) + task = _build_sglang_task( + launcher=launcher, + job_name=llm_job_name, + config_args=list(trainer_args), + allocation=allocation_mode, + sglang_cfg=config.sglang, + n_nodes=n_llm_nodes, + gpus_per_node=gpus_per_node, + env_vars=llm_env, + ) + launcher.submit(llm_job_name, task) + elif llm_backend == "vllm": + llm_job_name = f"{launcher.cluster_name}-vllm" + config.vllm = to_structured_cfg(config.vllm, vLLMConfig) + n_llm_nodes = max( + (allocation_mode.gen.world_size + gpus_per_node - 1) + // max(gpus_per_node, 1), + 1, + ) + llm_env = get_env_vars( + config.cluster.cluster_name, + config.launcher.inference_server_env_vars, + ) + task = _build_vllm_task( + launcher=launcher, + job_name=llm_job_name, + config_args=list(trainer_args), + allocation=allocation_mode, + vllm_cfg=config.vllm, + n_nodes=n_llm_nodes, + env_vars=llm_env, + ) + launcher.submit(llm_job_name, task) + + if llm_job_name is not None: + llm_addrs = wait_llm_server_addrs( + experiment_name=config.experiment_name, + trial_name=config.trial_name, + n_rollout_servers=allocation_mode.gen.dp_size, + ) + + if allocation_mode.type_ == AllocationType.LLM_SERVER_ONLY: + if llm_job_name is None: + logger.warning( + "Allocation mode is LLM_SERVER_ONLY but no LLM job launched." + ) + else: + launcher.wait( + job_names=[llm_job_name], + check_status=( + JobState.FAILED, + JobState.CANCELLED, + JobState.NOT_FOUND, + ), + remove_status=(JobState.COMPLETED,), + update=False, + ) + return + + trainer_env = dict( + **get_env_vars( + config.cluster.cluster_name, + config.launcher.trainer_env_vars, + ), + AREAL_RECOVER_RUN=str(int(is_recover_run)), + ) + if llm_addrs: + trainer_env["AREAL_LLM_SERVER_ADDRS"] = ",".join(llm_addrs) + + if allocation_mode.type_ == AllocationType.DECOUPLED_EVAL: + trainer_nodes = 1 + gpus_per_node = 0 + else: + trainer_nodes = max( + config.cluster.n_nodes + - (allocation_mode.gen.world_size // config.cluster.n_gpus_per_node), + 1, + ) + gpus_per_node = config.cluster.n_gpus_per_node + + trainer_job_name = f"{launcher.cluster_name}-trainer" + trainer_task = _build_trainer_task( + launcher=launcher, + job_name=trainer_job_name, + trainer_entry=trainer_entry, + trainer_args=trainer_args, + allocation=allocation_mode, + n_nodes=trainer_nodes, + gpus_per_node=gpus_per_node, + env_vars=trainer_env, + is_eval_only=allocation_mode.type_ == AllocationType.DECOUPLED_EVAL, + ) + launcher.submit(trainer_job_name, trainer_task) + + launcher.wait( + job_names=[trainer_job_name], + check_status=( + JobState.FAILED, + JobState.CANCELLED, + JobState.NOT_FOUND, + ), + remove_status=(JobState.COMPLETED,), + update=True, + ) + except (KeyboardInterrupt, TimeoutError, JobException) as exc: + logger.error("SkyPilot launcher encountered an error: %s", exc) + launcher.stop_all() + recoverable_states = {JobState.FAILED} + if ( + isinstance(exc, JobException) + and exc.reason in recoverable_states + and run_id < config.recover.retries + and config.recover.mode in ("auto", "fault") + ): + time.sleep(10) + skypilot_main(config, run_id=run_id + 1) + else: + raise + finally: + if llm_job_name is not None: + try: + launcher.stop(llm_job_name) + except Exception as cancel_exc: # pragma: no cover + logger.warning("Failed to cancel LLM server job: %s", cancel_exc) + + +def main(): + config, _ = parse_cli_args(sys.argv[1:]) + skypilot_main(config, run_id=0) + + +if __name__ == "__main__": + main() diff --git a/docs/generate_cli_docs.py b/docs/generate_cli_docs.py index 2929e6afc..c893237a5 100644 --- a/docs/generate_cli_docs.py +++ b/docs/generate_cli_docs.py @@ -8,6 +8,7 @@ """ import inspect +import platform import sys import types from dataclasses import MISSING as DATACLASSES_MISSING @@ -22,8 +23,11 @@ project_root = Path(__file__).parent.parent sys.path.insert(0, str(project_root)) -# Import the entire module to discover all dataclasses -import areal.api.cli_args as cli_args_module +try: + # Import the entire module to discover all dataclasses + import areal.api.cli_args as cli_args_module +except ImportError as e: + cli_args_module = None def discover_dataclasses() -> Dict[str, Any]: @@ -368,5 +372,8 @@ def main(): if __name__ == "__main__": + if platform.system() == "Windows": + print("Detected Windows OS, skipping.") + sys.exit(0) success = main() sys.exit(0 if success else 1) diff --git a/docs/tutorial/installation.md b/docs/tutorial/installation.md index 01ece031f..db617114d 100644 --- a/docs/tutorial/installation.md +++ b/docs/tutorial/installation.md @@ -77,6 +77,54 @@ bash examples/env/setup-pip-deps.sh > The SGLang patch is applied via `examples/env/setup-container-deps.sh` or `examples/env/setup-pip-deps.sh`. To confirm whether it has been applied, run `git status` in the `/sglang` directory (for Docker) or `AReaL/sglang` (for custom setups). --> +## (Optional) Install SkyPilot + +SkyPilot helps you run AReaL easily on cloud or Kubernetes infrastructures. Below shows +the minimal steps to setup skypilot on GCP or Kubernetes. + +### Install SkyPilot + +```bash +# In your conda environment +# NOTE: SkyPilot requires 3.7 <= python <= 3.13 +pip install -U "skypilot[gcp,kubernetes]" +``` + +### GCP setup + +```bash +# Install Google Cloud SDK +conda install -y -c conda-forge google-cloud-sdk + +# Initialize gcloud and select your account/project +gcloud init + +# (Optional) choose a project explicitly +gcloud config set project + +# Create Application Default Credentials +gcloud auth application-default login +``` + +### Kubernetes setup + +```bash +# Ensure your kubeconfig is at ~/.kube/config +mkdir -p ~/.kube +cp /path/to/kubeconfig ~/.kube/config +``` + +### Verify + +```bash +sky check +``` + +If `GCP: enabled` or `Kubernetes: enabled` are shown, you're ready to use SkyPilot with +AReaL. Check [here](../examples/skypilot.md) for a detailed example to run AReaL with +SkyPilot. For more options and details for SkyPilot, see the official +[SkyPilot installation guide](https://docs.skypilot.co/en/latest/getting-started/installation.html). + ## (Optional) Launch Ray Cluster for Distributed Training On the first node, start the Ray Head: diff --git a/examples/skypilot/README.md b/examples/skypilot/README.md new file mode 100644 index 000000000..4453a5bff --- /dev/null +++ b/examples/skypilot/README.md @@ -0,0 +1,149 @@ +# Running AReaL with SkyPilot + +This README includes examples and guidelines to running AReaL experiments with SkyPilot. +Make sure you have SkyPilot properly installed following +[our installation guide](../../docs/tutorial/installation.md#optional-install-skypilot) +before running this example. + +## Setup Shared Storage + +AReaL requires a shared file system (such as NFS) for basic functionalities such as name +resolve and distributed checkpointing. The following guideline shows how to use SkyPilot +volumes to setup a high-performance shared storage. + +1. **Define the volume.** Create a YAML file describing the volume you want SkyPilot to + manage. The example below provisions a 100 GiB ReadWriteMany Persistent Volume Claim + on a Kubernetes cluster. Adjust the storage class, namespace, or size to match your + environment. + +```yaml +# storage-volume.yaml +name: areal-shared-storage +type: k8s-pvc +infra: kubernetes # or k8s/context if you manage contexts manually +size: 100Gi # requested capacity +labels: + project: areal +config: + storage_class_name: csi-mounted-fs-path-sc + access_mode: ReadWriteMany +``` + +2. **Create the volume.** Apply the definition once; SkyPilot will reuse the volume for + future launches. + +```bash +sky volumes apply storage-volume.yaml +sky volumes ls -v # optional: confirm status and mount info +``` + +3. **Mount the volume in your tasks.** Add a `volumes` section to your SkyPilot YAML so + every node in the cluster sees the shared path. + +```yaml +volumes: + /storage: areal-shared-storage +``` + +Then in your AReaL yaml file, you could use the shared storage by configuring fileroot +and NFS record root used by NFS name resolve: + +```yaml +cluster: + # ... + fileroot: /storage/experiments + name_resolve: + # If you use a ray cluster, you can use KV store implemented in Ray + # by setting `type: ray`. + type: nfs + nfs_record_root: /tmp/areal/name_resolve +``` + +To remove the volume when you no longer need it, run +`sky volumes delete areal-shared-storage`. For more information, checkout +[SkyPilot Volume Documentation](https://docs.skypilot.co/en/latest/reference/volumes.html). + +## Option 1: Running AReaL with Ray Launcher + +The following example shows how to setup a ray cluster with SkyPilot and then use AReaL +to run GRPO with GSM8K dataset on 2 8xH100 nodes. + +### Example SkyPilot Cluster Spec + +First, prepare your SkyPilot yaml: + +```yaml +resources: + accelerators: H100:8 + image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.3 + memory: 256+ + cpus: 32+ + +num_nodes: 2 + +workdir: . + +volumes: + # shared storage setup by SkyPilot Volume + /storage: areal-shared-storage + +setup: | + pip3 install -e . + +run: | + # Get the Head node's IP and total number of nodes (environment variables injected by SkyPilot). + head_ip=$(echo "$SKYPILOT_NODE_IPS" | head -n1) + num_nodes=$(echo "$SKYPILOT_NODE_IPS" | wc -l) + + if [ "$SKYPILOT_NODE_RANK" = "0" ]; then + echo "Starting Ray head node..." + ray start --head --port=6379 + + while [ $(ray nodes | grep NODE_ID | wc -l) -lt $num_nodes ]; do + echo "Waiting for all nodes to join..." + sleep 5 + done + + echo "Executing training script on head node..." + python3 -m areal.launcher.ray examples/math/gsm8k_grpo.py \ + --config examples/skypilot/gsm8k_grpo_ray.yaml \ + experiment_name= \ + trial_name= \ + trainer_env_vars="WANDB_API_KEY=$WANDB_API_KEY" + else + sleep 10 + echo "Starting Ray worker node..." + ray start --address $head_ip:6379 + sleep 5 + fi + + echo "Node setup complete for rank $SKYPILOT_NODE_RANK." +``` + +### Launch the Ray Cluster and AReaL + +Then you are ready to run AReaL with command line: + +```bash +export WANDB_API_KEY= +sky launch -c areal --secret WANDB_API_KEY examples/skypilot/ray_cluster.yaml +``` + +You should be able to see your AReaL running and producing training logs in your +terminal. + + + +## Option 2: Running AReaL with SkyPilot Launcher + + + +You could also run a multi-node AReaL experiment in a single command, without having to +launch the Ray cluster: + +```bash +python3 -m areal.launcher.skypilot examples/math/gsm8k_grpo.py \ + --config examples/skypilot/gsm8k_grpo_skypilot.yaml \ + experiment_name= \ + trial_name= +``` diff --git a/examples/skypilot/gsm8k_grpo_ray.yaml b/examples/skypilot/gsm8k_grpo_ray.yaml new file mode 100644 index 000000000..8ae02a2cd --- /dev/null +++ b/examples/skypilot/gsm8k_grpo_ray.yaml @@ -0,0 +1,153 @@ +experiment_name: gsm8k-grpo-on-ray +trial_name: trial0 + +seed: 1 +total_train_epochs: 10 +tokenizer_path: ${actor.path} +async_training: true + +cluster: + n_nodes: 2 + n_gpus_per_node: 8 + fileroot: /storage/experiments + name_resolve: + type: ray + ray_actor_name: ray_kv_store + +allocation_mode: sglang.d8p1t1+d8p1t1 + +rollout: + experiment_name: ${experiment_name} + trial_name: ${trial_name} + max_concurrent_rollouts: 256 + queue_size: null + consumer_batch_size: ${train_dataset.batch_size} + max_head_offpolicyness: 2 + enable_rollout_tracing: false + +gconfig: + n_samples: 4 + min_new_tokens: 0 + max_new_tokens: 1024 + greedy: false + temperature: 1.0 + +actor: + experiment_name: ${experiment_name} + trial_name: ${trial_name} + path: Qwen/Qwen2.5-1.5B-Instruct + init_from_scratch: false + disable_dropout: true + gradient_checkpointing: false + dtype: bfloat16 + mb_spec: + max_tokens_per_mb: 10240 + optimizer: + type: adam + lr: 1.70e-5 + weight_decay: 0.017 + beta1: 0.9 + beta2: 0.999 + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 + warmup_steps_proportion: 0.001 + backend: fsdp + group_size: ${gconfig.n_samples} + eps_clip: 0.4 + temperature: ${gconfig.temperature} + reward_scaling: 10.0 + reward_bias: -0.5 + kl_ctl: 0.0 + ppo_n_minibatches: 1 + recompute_logprob: true + use_decoupled_loss: true + behav_imp_weight_cap: 5.0 + dynamic_sampling: false + reward_norm: + mean_level: group + std_level: group + group_size: ${gconfig.n_samples} + adv_norm: + mean_level: batch + std_level: batch + max_new_tokens: ${gconfig.max_new_tokens} + +ref: + experiment_name: ${experiment_name} + trial_name: ${trial_name} + path: ${actor.path} + init_from_scratch: false + disable_dropout: true + dtype: ${actor.dtype} + mb_spec: + max_tokens_per_mb: 10240 + optimizer: null + backend: fsdp + +# SGLang +sglang: + model_path: ${actor.path} + random_seed: ${seed} + skip_tokenizer_init: true + dtype: ${actor.dtype} + max_running_requests: null + context_length: 32768 + mem_fraction_static: 0.8 + +# datasets +train_dataset: + batch_size: 512 + shuffle: true + pin_memory: true + num_workers: 4 + path: openai/gsm8k + type: rl + max_length: 1024 + +valid_dataset: + batch_size: 512 + shuffle: true + pin_memory: true + num_workers: 4 + path: openai/gsm8k + type: rl + +# Utilities +saver: + experiment_name: ${experiment_name} + trial_name: ${trial_name} + fileroot: ${cluster.fileroot} + freq_epochs: 1 + freq_steps: null + freq_secs: null + +recover: + mode: disabled + experiment_name: ${experiment_name} + trial_name: ${trial_name} + fileroot: ${cluster.fileroot} + freq_epochs: 1 + freq_steps: null + freq_secs: 3600 + +evaluator: + experiment_name: ${experiment_name} + trial_name: ${trial_name} + fileroot: ${cluster.fileroot} + freq_epochs: 1 + freq_steps: null + freq_secs: null + +stats_logger: + experiment_name: ${experiment_name} + trial_name: ${trial_name} + fileroot: ${cluster.fileroot} + wandb: + mode: disabled + +launcher: + inference_server_cpus_per_gpu: 4 + inference_server_mem_per_gpu: 32768 + trainer_cpus_per_gpu: 4 + trainer_mem_per_gpu: 32768 diff --git a/examples/skypilot/ray_cluster.yaml b/examples/skypilot/ray_cluster.yaml new file mode 100644 index 000000000..e69de29bb From c30f5b06e9f8274611fb005e07a34fd22255fc30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=93=E9=9B=B7?= Date: Thu, 9 Oct 2025 17:48:53 +0800 Subject: [PATCH 2/8] add ray cluster yaml --- examples/skypilot/README.md | 50 +++++++++++++++--------------- examples/skypilot/ray_cluster.yaml | 45 +++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 25 deletions(-) diff --git a/examples/skypilot/README.md b/examples/skypilot/README.md index 4453a5bff..46123435f 100644 --- a/examples/skypilot/README.md +++ b/examples/skypilot/README.md @@ -74,10 +74,10 @@ First, prepare your SkyPilot yaml: ```yaml resources: - accelerators: H100:8 - image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.3 - memory: 256+ - cpus: 32+ + accelerators: H100:8 + image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.3 + memory: 256+ + cpus: 32+ num_nodes: 2 @@ -88,36 +88,36 @@ volumes: /storage: areal-shared-storage setup: | - pip3 install -e . + pip3 install -e . run: | - # Get the Head node's IP and total number of nodes (environment variables injected by SkyPilot). - head_ip=$(echo "$SKYPILOT_NODE_IPS" | head -n1) - num_nodes=$(echo "$SKYPILOT_NODE_IPS" | wc -l) + # Get the Head node's IP and total number of nodes (environment variables injected by SkyPilot). + head_ip=$(echo "$SKYPILOT_NODE_IPS" | head -n1) + num_nodes=$(echo "$SKYPILOT_NODE_IPS" | wc -l) - if [ "$SKYPILOT_NODE_RANK" = "0" ]; then - echo "Starting Ray head node..." - ray start --head --port=6379 + if [ "$SKYPILOT_NODE_RANK" = "0" ]; then + echo "Starting Ray head node..." + ray start --head --port=6379 - while [ $(ray nodes | grep NODE_ID | wc -l) -lt $num_nodes ]; do - echo "Waiting for all nodes to join..." - sleep 5 - done + while [ $(ray nodes | grep NODE_ID | wc -l) -lt $num_nodes ]; do + echo "Waiting for all nodes to join..." + sleep 5 + done - echo "Executing training script on head node..." - python3 -m areal.launcher.ray examples/math/gsm8k_grpo.py \ + echo "Executing training script on head node..." + python3 -m areal.launcher.ray examples/math/gsm8k_grpo.py \ --config examples/skypilot/gsm8k_grpo_ray.yaml \ experiment_name= \ trial_name= \ trainer_env_vars="WANDB_API_KEY=$WANDB_API_KEY" - else - sleep 10 - echo "Starting Ray worker node..." - ray start --address $head_ip:6379 - sleep 5 - fi - - echo "Node setup complete for rank $SKYPILOT_NODE_RANK." + else + sleep 10 + echo "Starting Ray worker node..." + ray start --address $head_ip:6379 + sleep 5 + fi + + echo "Node setup complete for rank $SKYPILOT_NODE_RANK." ``` ### Launch the Ray Cluster and AReaL diff --git a/examples/skypilot/ray_cluster.yaml b/examples/skypilot/ray_cluster.yaml index e69de29bb..a101a7281 100644 --- a/examples/skypilot/ray_cluster.yaml +++ b/examples/skypilot/ray_cluster.yaml @@ -0,0 +1,45 @@ +resources: + accelerators: H100:8 + image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.3 + memory: 256+ + cpus: 32+ + +num_nodes: 2 + +workdir: . + +volumes: + # shared storage setup by SkyPilot Volume + /storage: areal-shared-storage + +setup: | + pip3 install -e . + +run: | + # Get the Head node's IP and total number of nodes (environment variables injected by SkyPilot). + head_ip=$(echo "$SKYPILOT_NODE_IPS" | head -n1) + num_nodes=$(echo "$SKYPILOT_NODE_IPS" | wc -l) + + if [ "$SKYPILOT_NODE_RANK" = "0" ]; then + echo "Starting Ray head node..." + ray start --head --port=6379 + + while [ $(ray nodes | grep NODE_ID | wc -l) -lt $num_nodes ]; do + echo "Waiting for all nodes to join..." + sleep 5 + done + + echo "Executing training script on head node..." + python3 -m areal.launcher.ray examples/math/gsm8k_grpo.py \ + --config examples/skypilot/gsm8k_grpo_ray.yaml \ + experiment_name= \ + trial_name= \ + trainer_env_vars="WANDB_API_KEY=$WANDB_API_KEY" + else + sleep 10 + echo "Starting Ray worker node..." + ray start --address $head_ip:6379 + sleep 5 + fi + + echo "Node setup complete for rank $SKYPILOT_NODE_RANK." From a6176780b0f0f804465d221c36642a3a6e69689f Mon Sep 17 00:00:00 2001 From: nuzant Date: Thu, 16 Oct 2025 18:59:02 +0800 Subject: [PATCH 3/8] fix ray cluster example --- areal/api/cli_args.py | 33 +++---- areal/launcher/skypilot.py | 19 ++-- docs/cli_reference.md | 61 ++++++++++-- docs/tutorial/installation.md | 14 +-- examples/skypilot/README.md | 134 ++++++++++++++------------ examples/skypilot/gsm8k_grpo_ray.yaml | 8 +- examples/skypilot/local.yaml | 29 ++++++ examples/skypilot/ray_cluster.yaml | 27 +++--- 8 files changed, 197 insertions(+), 128 deletions(-) create mode 100644 examples/skypilot/local.yaml diff --git a/areal/api/cli_args.py b/areal/api/cli_args.py index c8868f393..36931feb0 100644 --- a/areal/api/cli_args.py +++ b/areal/api/cli_args.py @@ -990,7 +990,7 @@ class SlurmLauncherConfig: @dataclass -class SkyPilotLauncherConfig: +class SkyPilotLauncherClusterConfig: """Configuration for launching the training jobs with SkyPilot.""" # Basic task metadata @@ -1012,10 +1012,10 @@ class SkyPilotLauncherConfig: "help": "Infrastructure spec // or k8s[/context] (resources.infra).", }, ) - accelerators: str | None = field( + accelerator_type: str | None = field( default=None, metadata={ - "help": "Accelerator request, e.g. 'H100:8'. Currently only single-type requests supported (resources.accelerators).", + "help": "Accelerator request, e.g. 'H100', 'A100'. Number of GPUs on the node is determined by `cluster.n_gpus_per_node`.", }, ) accelerator_args: str | None = field( @@ -1024,20 +1024,6 @@ class SkyPilotLauncherConfig: "help": "Additional accelerator args (YAML/JSON string) (resources.accelerator_args).", }, ) - cpus: str | None = field( - default=None, - metadata={"help": "vCPU spec per node, e.g. '4+', '16' (resources.cpus)."}, - ) - memory: str | None = field( - default=None, - metadata={ - "help": "Memory spec per node, e.g. '32+', '64GB' (resources.memory)." - }, - ) - instance_type: str | None = field( - default=None, - metadata={"help": "Explicit instance type (resources.instance_type)."}, - ) use_spot: bool = field( default=False, metadata={ @@ -1135,9 +1121,16 @@ class SkyPilotLauncherConfig: }, ) - config: str | None = field( - default=None, - metadata={"help": "Advanced config overrides (config.*) as YAML/JSON string."}, + +@dataclass +class SkyPilotLauncherConfig: + inference_server: SkyPilotLauncherClusterConfig = field( + default_factory=SkyPilotLauncherClusterConfig, + metadata={"help": "SkyPilot cluster configuration for inference server."}, + ) + trainer: SkyPilotLauncherClusterConfig = field( + default_factory=SkyPilotLauncherClusterConfig, + metadata={"help": "SkyPilot cluster configuration for trainer."}, ) diff --git a/areal/launcher/skypilot.py b/areal/launcher/skypilot.py index c8c95446b..6a12d4084 100644 --- a/areal/launcher/skypilot.py +++ b/areal/launcher/skypilot.py @@ -21,6 +21,7 @@ LauncherConfig, RecoverConfig, SGLangConfig, + SkyPilotLauncherClusterConfig, SkyPilotLauncherConfig, parse_cli_args, to_structured_cfg, @@ -99,6 +100,14 @@ def _default_workdir(skypilot_cfg: SkyPilotLauncherConfig) -> str: return str(Path.cwd()) +def _build_resources( + allocation_mode: AllocationMode, + cluster_spec_config: ClusterSpecConfig, + sky_cluster_cfg: SkyPilotLauncherClusterConfig, +) -> sky.Resources: + pass + + RunSpec = Union[str, Callable[[int, List[str]], str]] @@ -108,20 +117,10 @@ def __init__( experiment_name: str, trial_name: str, total_nodes: int, - skypilot_cfg: SkyPilotLauncherConfig, ): self.experiment_name = experiment_name self.trial_name = trial_name self.total_nodes = total_nodes - self.skypilot_cfg = skypilot_cfg - self.cluster_name = skypilot_cfg.name or _readable_cluster_name( - experiment_name, trial_name - ) - self._cluster_ready = False - self.jobs: Dict[int, JobInfo] = {} - self._job_meta: Dict[int, Dict[str, Any]] = {} - self._job_groups: Dict[str, set[int]] = {} - self.ensure_cluster() @staticmethod def _build_resources(cfg: SkyPilotLauncherConfig) -> sky.Resources: diff --git a/docs/cli_reference.md b/docs/cli_reference.md index a0c60f956..b0bb06bd6 100644 --- a/docs/cli_reference.md +++ b/docs/cli_reference.md @@ -72,6 +72,8 @@ For detailed examples, see the experiment configurations in the `examples/` dire ### Others - [Scheduler Configuration](section-scheduler) +- [SkyPilotLauncherCluster Configuration](section-sky-pilot-launcher-cluster) +- [SkyPilotLauncher Configuration](section-sky-pilot-launcher) ______________________________________________________________________ @@ -597,15 +599,16 @@ Configuration for cluster specification and distributed computing setup. Configuration for launching the LLM server and trainer processes. -| Parameter | Type | Default | Description | -| ------------------------------- | ----------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------ | -| `inference_server_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for inference server. | -| `inference_server_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for inference server in MB. | -| `trainer_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for training. | -| `trainer_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for training in MB. | -| `inference_server_env_vars` | string | `""` | Environment variables for inference server, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | -| `trainer_env_vars` | string | `""` | Environment variables for training, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | -| `slurm` | [`SlurmLauncherConfig`](section-slurm-launcher) | **Required** | Slurm launcher configuration. | +| Parameter | Type | Default | Description | +| ------------------------------- | ------------------------------------------------------ | ------------ | ------------------------------------------------------------------------------------------------ | +| `inference_server_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for inference server. | +| `inference_server_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for inference server in MB. | +| `trainer_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for training. | +| `trainer_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for training in MB. | +| `inference_server_env_vars` | string | `""` | Environment variables for inference server, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | +| `trainer_env_vars` | string | `""` | Environment variables for training, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | +| `slurm` | [`SlurmLauncherConfig`](section-slurm-launcher) | **Required** | Slurm launcher configuration. | +| `skypilot` | [`SkyPilotLauncherConfig`](section-sky-pilot-launcher) | **Required** | SkyPilot launcher configuration. | (section-name-resolve)= @@ -756,3 +759,43 @@ Configuration for worker scheduling. Used in the single-controller mode. Experim | `reward_functioncall_config` | `Dict` | **Required** | - | | `reward_model_path` | string | `""` | - | | `reward_model_service_url` | string | `"http://localhost:30000/classify"` | - | + +(section-sky-pilot-launcher-cluster)= + +## SkyPilotLauncherCluster Configuration + +Configuration for launching the training jobs with SkyPilot. + +| Parameter | Type | Default | Description | +| ------------------ | -------------- | ------------ | ---------------------------------------------------------------------------------------------------------------- | +| `name` | string \| None | `None` | Optional task name displayed in SkyPilot. | +| `workdir` | string \| None | `None` | Local path or git repo spec to sync as working directory (mirrors SkyPilot YAML workdir). | +| `infra` | string \| None | `None` | Infrastructure spec // or k8s\[/context\] (resources.infra). | +| `accelerator_type` | string \| None | `None` | Accelerator request, e.g. 'H100', 'A100'. Number of GPUs on the node is determined by `cluster.n_gpus_per_node`. | +| `accelerator_args` | string \| None | `None` | Additional accelerator args (YAML/JSON string) (resources.accelerator_args). | +| `use_spot` | boolean | `False` | Whether to use spot/preemptible instances (resources.use_spot). | +| `disk_size` | string \| None | `None` | Boot disk size with optional unit, e.g. '256', '256GB' (resources.disk_size). | +| `disk_tier` | string | `"medium"` | Disk performance tier (resources.disk_tier). **Choices:** `low`, `medium`, `high`, `ultra`, `best` | +| `network_tier` | string | `"standard"` | Network tier (resources.network_tier). **Choices:** `standard`, `best` | +| `ports` | string \| None | `None` | Ports to expose, supports single '8080', range '10052-10100', or comma list (resources.ports). | +| `image_id` | string \| None | `None` | Custom base or docker image id (resources.image_id). | +| `labels` | string \| None | `None` | Instance/pod labels as key=value pairs joined by commas (resources.labels). | +| `any_of` | string \| None | `None` | YAML/JSON string list of candidate resource dicts (resources.any_of). | +| `ordered` | string \| None | `None` | YAML/JSON string list of ordered resource dicts (resources.ordered). | +| `job_recovery` | string \| None | `None` | Job recovery strategy spec (resources.job_recovery). Provide JSON/YAML. | +| `autostop` | string \| None | `None` | Autostop configuration: true/false/10/10h or JSON object (resources.autostop). | +| `envs` | string \| None | `None` | Environment variables (envs) as KEY=VAL pairs joined by commas. | +| `secrets` | string \| None | `None` | Secrets usable in setup/run as KEY=VAL pairs joined by commas (will be redacted). | +| `volumes` | string \| None | `None` | Kubernetes volume mappings (volumes) as YAML/JSON string or shorthand mount spec. | +| `file_mounts` | string \| None | `None` | File mounts mapping remote_path:local_path lines or JSON/YAML string (file_mounts). | + +(section-sky-pilot-launcher)= + +## SkyPilotLauncher Configuration + +Configuration class: SkyPilotLauncherConfig + +| Parameter | Type | Default | Description | +| ------------------ | --------------------------------------------------------------------- | ------------ | ---------------------------------------------------- | +| `inference_server` | [`SkyPilotLauncherClusterConfig`](section-sky-pilot-launcher-cluster) | **Required** | SkyPilot cluster configuration for inference server. | +| `trainer` | [`SkyPilotLauncherClusterConfig`](section-sky-pilot-launcher-cluster) | **Required** | SkyPilot cluster configuration for trainer. | diff --git a/docs/tutorial/installation.md b/docs/tutorial/installation.md index db617114d..f93d69d96 100644 --- a/docs/tutorial/installation.md +++ b/docs/tutorial/installation.md @@ -108,11 +108,9 @@ gcloud auth application-default login ### Kubernetes setup -```bash -# Ensure your kubeconfig is at ~/.kube/config -mkdir -p ~/.kube -cp /path/to/kubeconfig ~/.kube/config -``` +Check +[here](https://docs.skypilot.co/en/latest/reference/kubernetes/kubernetes-setup.html) +for a comprehensive guide on how to set up a kubernetes cluster for SkyPilot. ### Verify @@ -121,8 +119,10 @@ sky check ``` If `GCP: enabled` or `Kubernetes: enabled` are shown, you're ready to use SkyPilot with -AReaL. Check [here](../examples/skypilot.md) for a detailed example to run AReaL with -SkyPilot. For more options and details for SkyPilot, see the official +AReaL. Check +[here](https://github.com/inclusionAI/AReaL/blob/main/examples/skypilot/README.md) for a +detailed example to run AReaL with SkyPilot. For more options and details for SkyPilot, +see the official [SkyPilot installation guide](https://docs.skypilot.co/en/latest/getting-started/installation.html). ## (Optional) Launch Ray Cluster for Distributed Training diff --git a/examples/skypilot/README.md b/examples/skypilot/README.md index 46123435f..d642c1d8a 100644 --- a/examples/skypilot/README.md +++ b/examples/skypilot/README.md @@ -3,93 +3,99 @@ This README includes examples and guidelines to running AReaL experiments with SkyPilot. Make sure you have SkyPilot properly installed following [our installation guide](../../docs/tutorial/installation.md#optional-install-skypilot) -before running this example. +before running this example. Note that all command lines shown in this file are assumed +to be execute under the root of AReaL repository. -## Setup Shared Storage +## Running a Single Node Experiment -AReaL requires a shared file system (such as NFS) for basic functionalities such as name -resolve and distributed checkpointing. The following guideline shows how to use SkyPilot -volumes to setup a high-performance shared storage. - -1. **Define the volume.** Create a YAML file describing the volume you want SkyPilot to - manage. The example below provisions a 100 GiB ReadWriteMany Persistent Volume Claim - on a Kubernetes cluster. Adjust the storage class, namespace, or size to match your - environment. +To run a single node experiment, you only need to setup the node with SkyPilot and +launch the experiment with AReaL local launcher. [The following file](local.yaml) shows +a SkyPilot yaml that could launch a simple GSM8K GRPO experiment in a single command +line. This example runs on GCP, but could be easily migrated to other cloud or K8S +cluster by changing `resource.infra` field in SkyPilot YAML file. ```yaml -# storage-volume.yaml -name: areal-shared-storage -type: k8s-pvc -infra: kubernetes # or k8s/context if you manage contexts manually -size: 100Gi # requested capacity -labels: - project: areal -config: - storage_class_name: csi-mounted-fs-path-sc - access_mode: ReadWriteMany -``` - -2. **Create the volume.** Apply the definition once; SkyPilot will reuse the volume for - future launches. +name: areal-test-skypilot -```bash -sky volumes apply storage-volume.yaml -sky volumes ls -v # optional: confirm status and mount info -``` +resources: + infra: gcp + accelerators: A100:2 + autostop: + idle_minutes: 10 + down: true + cpus: 8+ + memory: 32GB+ + disk_size: 256GB + image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.4 + +num_nodes: 1 -3. **Mount the volume in your tasks.** Add a `volumes` section to your SkyPilot YAML so - every node in the cluster sees the shared path. +workdir: . -```yaml -volumes: - /storage: areal-shared-storage +run: | + python3 -m areal.launcher.local examples/math/gsm8k_grpo.py \ + --config examples/math/gsm8k_grpo.yaml \ + experiment_name=gsm8k-grpo \ + trial_name=trial0 \ + cluster.n_gpus_per_node=2 \ + allocation_mode=sglang.d1+d1 \ + train_dataset.batch_size=4 \ + actor.mb_spec.max_tokens_per_mb=4096 ``` -Then in your AReaL yaml file, you could use the shared storage by configuring fileroot -and NFS record root used by NFS name resolve: +To run the experiment, execute: -```yaml -cluster: - # ... - fileroot: /storage/experiments - name_resolve: - # If you use a ray cluster, you can use KV store implemented in Ray - # by setting `type: ray`. - type: nfs - nfs_record_root: /tmp/areal/name_resolve +```bash +sky launch -c areal-test examples/skypilot/local.yaml ``` -To remove the volume when you no longer need it, run -`sky volumes delete areal-shared-storage`. For more information, checkout -[SkyPilot Volume Documentation](https://docs.skypilot.co/en/latest/reference/volumes.html). +## Running a Multi-Node Experiment -## Option 1: Running AReaL with Ray Launcher +### Option 1: Running AReaL with Ray Launcher The following example shows how to setup a ray cluster with SkyPilot and then use AReaL -to run GRPO with GSM8K dataset on 2 8xH100 nodes. +to run GRPO with GSM8K dataset on 2 nodes, each with 1 A100 GPU. This example runs on +GCP, but could be easily migrated to other cloud or K8S cluster by changing +`resource.infra` field in SkyPilot YAML file. -### Example SkyPilot Cluster Spec - -First, prepare your SkyPilot yaml: +Specify the resources and image used to run the experiment. ```yaml resources: - accelerators: H100:8 - image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.3 + infra: gcp + accelerators: A100:1 + image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.4 memory: 256+ cpus: 32+ num_nodes: 2 workdir: . +``` + +Designate shared storage. You could either use an existing cloud bucket or volume: -volumes: - # shared storage setup by SkyPilot Volume - /storage: areal-shared-storage +```yaml +file_mounts: + /storage: gs://areal-default +``` -setup: | - pip3 install -e . +or create a new bucket or volume with SkyPilot: +```yaml +file_mounts: + /storage: + name: areal-test + store: gcs +``` + +For more information about shared storage with SkyPilot, check +[SkyPilot Cloud Buckets](https://docs.skypilot.co/en/latest/reference/storage.html) and +[SkyPilot Volume](https://docs.skypilot.co/en/latest/reference/volumes.html). + +Next, prepare commands used to setup ray cluster and run the experiment. + +```yaml run: | # Get the Head node's IP and total number of nodes (environment variables injected by SkyPilot). head_ip=$(echo "$SKYPILOT_NODE_IPS" | head -n1) @@ -99,8 +105,8 @@ run: | echo "Starting Ray head node..." ray start --head --port=6379 - while [ $(ray nodes | grep NODE_ID | wc -l) -lt $num_nodes ]; do - echo "Waiting for all nodes to join..." + while [ $(ray status | grep node_ | wc -l) -lt $num_nodes ]; do + echo "Waiting for all nodes to join... Current nodes: $(ray status | grep node_ | wc -l) / $num_nodes" sleep 5 done @@ -109,13 +115,13 @@ run: | --config examples/skypilot/gsm8k_grpo_ray.yaml \ experiment_name= \ trial_name= \ - trainer_env_vars="WANDB_API_KEY=$WANDB_API_KEY" + +trainer_env_vars="WANDB_API_KEY=$WANDB_API_KEY" else sleep 10 echo "Starting Ray worker node..." ray start --address $head_ip:6379 sleep 5 - fi + fi echo "Node setup complete for rank $SKYPILOT_NODE_RANK." ``` @@ -126,7 +132,7 @@ Then you are ready to run AReaL with command line: ```bash export WANDB_API_KEY= -sky launch -c areal --secret WANDB_API_KEY examples/skypilot/ray_cluster.yaml +sky launch -c areal-test --secret WANDB_API_KEY examples/skypilot/ray_cluster.yaml ``` You should be able to see your AReaL running and producing training logs in your diff --git a/examples/skypilot/gsm8k_grpo_ray.yaml b/examples/skypilot/gsm8k_grpo_ray.yaml index 8ae02a2cd..503a7664a 100644 --- a/examples/skypilot/gsm8k_grpo_ray.yaml +++ b/examples/skypilot/gsm8k_grpo_ray.yaml @@ -8,13 +8,13 @@ async_training: true cluster: n_nodes: 2 - n_gpus_per_node: 8 + n_gpus_per_node: 1 fileroot: /storage/experiments name_resolve: type: ray ray_actor_name: ray_kv_store -allocation_mode: sglang.d8p1t1+d8p1t1 +allocation_mode: sglang.d1+d1 rollout: experiment_name: ${experiment_name} @@ -97,7 +97,7 @@ sglang: # datasets train_dataset: - batch_size: 512 + batch_size: 4 shuffle: true pin_memory: true num_workers: 4 @@ -106,7 +106,7 @@ train_dataset: max_length: 1024 valid_dataset: - batch_size: 512 + batch_size: 4 shuffle: true pin_memory: true num_workers: 4 diff --git a/examples/skypilot/local.yaml b/examples/skypilot/local.yaml new file mode 100644 index 000000000..94b6ad3b7 --- /dev/null +++ b/examples/skypilot/local.yaml @@ -0,0 +1,29 @@ +name: areal-test-skypilot + +resources: + infra: gcp + accelerators: A100:2 + autostop: + idle_minutes: 10 + down: true + cpus: 8+ + memory: 32GB+ + disk_size: 256GB + image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.4 + +num_nodes: 1 + +file_mounts: + /storage: gs://areal-default + +workdir: . + +run: | + python3 -m areal.launcher.local examples/math/gsm8k_grpo.py \ + --config examples/math/gsm8k_grpo.yaml \ + experiment_name=gsm8k-grpo \ + trial_name=trial0 \ + cluster.n_gpus_per_node=2 \ + allocation_mode=sglang.d1+d1 \ + train_dataset.batch_size=4 \ + actor.mb_spec.max_tokens_per_mb=4096 diff --git a/examples/skypilot/ray_cluster.yaml b/examples/skypilot/ray_cluster.yaml index a101a7281..a8704528f 100644 --- a/examples/skypilot/ray_cluster.yaml +++ b/examples/skypilot/ray_cluster.yaml @@ -1,19 +1,17 @@ + resources: - accelerators: H100:8 - image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.3 - memory: 256+ - cpus: 32+ + infra: gcp + accelerators: A100:1 + image_id: docker:ghcr.io/inclusionai/areal-runtime:v0.3.4 + memory: 32+ + cpus: 8+ num_nodes: 2 workdir: . -volumes: - # shared storage setup by SkyPilot Volume - /storage: areal-shared-storage - -setup: | - pip3 install -e . +file_mounts: + /storage: gs://areal-default run: | # Get the Head node's IP and total number of nodes (environment variables injected by SkyPilot). @@ -24,8 +22,8 @@ run: | echo "Starting Ray head node..." ray start --head --port=6379 - while [ $(ray nodes | grep NODE_ID | wc -l) -lt $num_nodes ]; do - echo "Waiting for all nodes to join..." + while [ $(ray status | grep node_ | wc -l) -lt $num_nodes ]; do + echo "Waiting for all nodes to join... Current nodes: $(ray summary nodes --format=json | jq '.cluster.node_summary.total') / $num_nodes" sleep 5 done @@ -34,12 +32,13 @@ run: | --config examples/skypilot/gsm8k_grpo_ray.yaml \ experiment_name= \ trial_name= \ - trainer_env_vars="WANDB_API_KEY=$WANDB_API_KEY" + stats_logger.wandb.mode=online \ + +trainer_env_vars="WANDB_API_KEY=$WANDB_API_KEY" else sleep 10 echo "Starting Ray worker node..." ray start --address $head_ip:6379 sleep 5 - fi + fi echo "Node setup complete for rank $SKYPILOT_NODE_RANK." From b1bece47e66664c40a72ebde383a0e7447167258 Mon Sep 17 00:00:00 2001 From: nuzant Date: Fri, 17 Oct 2025 14:06:02 +0800 Subject: [PATCH 4/8] fix --- examples/skypilot/README.md | 5 ++--- examples/skypilot/gsm8k_grpo_ray.yaml | 2 +- examples/skypilot/ray_cluster.yaml | 8 +++----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/examples/skypilot/README.md b/examples/skypilot/README.md index d642c1d8a..df14317d1 100644 --- a/examples/skypilot/README.md +++ b/examples/skypilot/README.md @@ -113,9 +113,8 @@ run: | echo "Executing training script on head node..." python3 -m areal.launcher.ray examples/math/gsm8k_grpo.py \ --config examples/skypilot/gsm8k_grpo_ray.yaml \ - experiment_name= \ - trial_name= \ - +trainer_env_vars="WANDB_API_KEY=$WANDB_API_KEY" + experiment_name=gsm8k-grpo \ + trial_name=trial0 else sleep 10 echo "Starting Ray worker node..." diff --git a/examples/skypilot/gsm8k_grpo_ray.yaml b/examples/skypilot/gsm8k_grpo_ray.yaml index 503a7664a..ed973c14f 100644 --- a/examples/skypilot/gsm8k_grpo_ray.yaml +++ b/examples/skypilot/gsm8k_grpo_ray.yaml @@ -41,7 +41,7 @@ actor: gradient_checkpointing: false dtype: bfloat16 mb_spec: - max_tokens_per_mb: 10240 + max_tokens_per_mb: 4096 optimizer: type: adam lr: 1.70e-5 diff --git a/examples/skypilot/ray_cluster.yaml b/examples/skypilot/ray_cluster.yaml index a8704528f..d1c72cb11 100644 --- a/examples/skypilot/ray_cluster.yaml +++ b/examples/skypilot/ray_cluster.yaml @@ -23,17 +23,15 @@ run: | ray start --head --port=6379 while [ $(ray status | grep node_ | wc -l) -lt $num_nodes ]; do - echo "Waiting for all nodes to join... Current nodes: $(ray summary nodes --format=json | jq '.cluster.node_summary.total') / $num_nodes" + echo "Waiting for all nodes to join... Current nodes: $(ray status | grep node_ | wc -l) / $num_nodes" sleep 5 done echo "Executing training script on head node..." python3 -m areal.launcher.ray examples/math/gsm8k_grpo.py \ --config examples/skypilot/gsm8k_grpo_ray.yaml \ - experiment_name= \ - trial_name= \ - stats_logger.wandb.mode=online \ - +trainer_env_vars="WANDB_API_KEY=$WANDB_API_KEY" + experiment_name=gsm8k-grpo \ + trial_name=trial0 else sleep 10 echo "Starting Ray worker node..." From f8e10dfc6d2e675da472393952d6fd63a740ddff Mon Sep 17 00:00:00 2001 From: nuzant Date: Fri, 17 Oct 2025 17:10:47 +0800 Subject: [PATCH 5/8] split PR, add log screenshot --- areal/launcher/skypilot.py | 671 ----------------------- examples/skypilot/README.md | 25 +- examples/skypilot/ray_launch.png | Bin 0 -> 159167 bytes examples/skypilot/train_step_success.png | Bin 0 -> 175470 bytes 4 files changed, 10 insertions(+), 686 deletions(-) delete mode 100644 areal/launcher/skypilot.py create mode 100644 examples/skypilot/ray_launch.png create mode 100644 examples/skypilot/train_step_success.png diff --git a/areal/launcher/skypilot.py b/areal/launcher/skypilot.py deleted file mode 100644 index 6a12d4084..000000000 --- a/areal/launcher/skypilot.py +++ /dev/null @@ -1,671 +0,0 @@ -"""Launch AReaL experiments on SkyPilot-managed clusters. - -This launcher mirrors the semantics of the Ray and Slurm launchers while -delegating provisioning and task execution to the SkyPilot Python SDK. -""" - -from __future__ import annotations - -import re -import shlex -import sys -import time -from pathlib import Path -from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Union - -import yaml - -from areal.api.alloc_mode import AllocationMode, AllocationType -from areal.api.cli_args import ( - ClusterSpecConfig, - LauncherConfig, - RecoverConfig, - SGLangConfig, - SkyPilotLauncherClusterConfig, - SkyPilotLauncherConfig, - parse_cli_args, - to_structured_cfg, - vLLMConfig, -) -from areal.utils import logging, name_resolve, names -from areal.utils.launcher import ( - JobException, - JobInfo, - JobState, - get_env_vars, - validate_config_for_distributed_launcher, - wait_llm_server_addrs, -) -from areal.utils.recover import check_if_recover - -logger = logging.getLogger("SkyPilotLauncher") - - -try: - import sky - from sky import JobStatus as SkyJobStatus -except ImportError as exc: # pragma: no cover - handled at runtime - raise ImportError( - "SkyPilot launcher requires the `skypilot` package. " - "Install it via `pip install -U skypilot`." - ) from exc - - -SKY_TO_JOB_STATE: Dict[SkyJobStatus, JobState] = { - SkyJobStatus.INIT: JobState.PENDING, - SkyJobStatus.PENDING: JobState.PENDING, - SkyJobStatus.SETTING_UP: JobState.PENDING, - SkyJobStatus.RUNNING: JobState.RUNNING, - SkyJobStatus.SUCCEEDED: JobState.COMPLETED, - SkyJobStatus.FAILED: JobState.FAILED, - SkyJobStatus.FAILED_SETUP: JobState.FAILED, - SkyJobStatus.FAILED_DRIVER: JobState.FAILED, - SkyJobStatus.CANCELLED: JobState.CANCELLED, -} - - -SKY_WAIT_CHECK_TIME_INTERVAL = 5 # seconds - - -def _readable_cluster_name(experiment_name: str, trial_name: str) -> str: - slug = f"areal-{experiment_name}-{trial_name}" - return re.sub(r"[^a-zA-Z0-9-]", "-", slug).lower() - - -def _parse_key_value_pairs(value: Optional[str]) -> Dict[str, str]: - if not value: - return {} - result = {} - for chunk in value.split(","): - if not chunk: - continue - if "=" not in chunk: - raise ValueError( - f"Environment/secret entry '{chunk}' must be in KEY=VALUE format." - ) - key, val = chunk.split("=", 1) - result[key.strip()] = val.strip() - return result - - -def _parse_yaml_like(value: Optional[str]) -> Any: - if not value: - return None - return yaml.safe_load(value) - - -def _default_workdir(skypilot_cfg: SkyPilotLauncherConfig) -> str: - if skypilot_cfg.workdir: - return skypilot_cfg.workdir - return str(Path.cwd()) - - -def _build_resources( - allocation_mode: AllocationMode, - cluster_spec_config: ClusterSpecConfig, - sky_cluster_cfg: SkyPilotLauncherClusterConfig, -) -> sky.Resources: - pass - - -RunSpec = Union[str, Callable[[int, List[str]], str]] - - -class SkyPilotLauncher: - def __init__( - self, - experiment_name: str, - trial_name: str, - total_nodes: int, - ): - self.experiment_name = experiment_name - self.trial_name = trial_name - self.total_nodes = total_nodes - - @staticmethod - def _build_resources(cfg: SkyPilotLauncherConfig) -> sky.Resources: - kwargs: Dict[str, Any] = {} - if cfg.infra: - kwargs["infra"] = cfg.infra - if cfg.accelerators: - kwargs["accelerators"] = cfg.accelerators - if cfg.accelerator_args: - kwargs["accelerator_args"] = _parse_yaml_like(cfg.accelerator_args) - if cfg.cpus: - kwargs["cpus"] = cfg.cpus - if cfg.memory: - kwargs["memory"] = cfg.memory - if cfg.instance_type: - kwargs["instance_type"] = cfg.instance_type - if cfg.use_spot is not None: - kwargs["use_spot"] = cfg.use_spot - if cfg.disk_size: - kwargs["disk_size"] = cfg.disk_size - if cfg.disk_tier: - kwargs["disk_tier"] = cfg.disk_tier - if cfg.network_tier: - kwargs["network_tier"] = cfg.network_tier - if cfg.ports: - kwargs["ports"] = cfg.ports - if cfg.image_id: - kwargs["image_id"] = _parse_yaml_like(cfg.image_id) or cfg.image_id - if cfg.labels: - kwargs["labels"] = _parse_key_value_pairs(cfg.labels) - if cfg.any_of: - kwargs["any_of"] = _parse_yaml_like(cfg.any_of) - if cfg.ordered: - kwargs["ordered"] = _parse_yaml_like(cfg.ordered) - if cfg.job_recovery: - kwargs["job_recovery"] = _parse_yaml_like(cfg.job_recovery) - if cfg.autostop: - kwargs["autostop"] = _parse_yaml_like(cfg.autostop) or cfg.autostop - if cfg.volumes: - kwargs["volumes"] = _parse_yaml_like(cfg.volumes) - return sky.Resources(**kwargs) - - def _base_task( - self, - name: str, - num_nodes: int, - run: RunSpec, - extra_envs: Optional[Dict[str, str]] = None, - ) -> sky.Task: - base_envs = _parse_key_value_pairs(self.skypilot_cfg.envs) - secrets = _parse_key_value_pairs(self.skypilot_cfg.secrets) - if secrets: - base_envs.update(secrets) - if extra_envs: - base_envs.update(extra_envs) - workdir = _default_workdir(self.skypilot_cfg) - file_mounts = None - if self.skypilot_cfg.file_mounts: - file_mounts = _parse_yaml_like(self.skypilot_cfg.file_mounts) - resources = self._build_resources(self.skypilot_cfg) - task_kwargs: Dict[str, Any] = { - "name": name, - "num_nodes": num_nodes, - "run": run, - "workdir": workdir, - } - if base_envs: - task_kwargs["envs"] = base_envs - if file_mounts: - task_kwargs["file_mounts"] = file_mounts - task = sky.Task(**task_kwargs) - task.set_resources(resources) - return task - - def ensure_cluster(self) -> None: - if self._cluster_ready: - return - provision_task = self._base_task( - name=f"{self.cluster_name}-provision", - num_nodes=self.total_nodes, - run="echo '[SkyPilot] Cluster ready for AReaL launching.'", # noqa: E501 - ) - logger.info( - "Launching/repairing SkyPilot cluster '%s' with %d node(s).", - self.cluster_name, - self.total_nodes, - ) - req_id = sky.launch(provision_task, cluster_name=self.cluster_name) - sky.stream_and_get(req_id) - self._cluster_ready = True - - @property - def run_name(self) -> str: - return f"{self.experiment_name}_{self.trial_name}" - - def submit(self, job_name: str, task: sky.Task) -> int: - job_ids = self.submit_array(job_name, [task]) - return job_ids[0] - - def submit_array(self, job_name: str, tasks: List[sky.Task]) -> List[int]: - assert tasks, "Tasks list cannot be empty." - job_ids: List[int] = [] - for idx, task in enumerate(tasks): - derived_name = job_name if len(tasks) == 1 else f"{job_name}:{idx}" - task.name = derived_name - logger.info("Submitting SkyPilot task '%s'", derived_name) - request_id = sky.exec(task, cluster_name=self.cluster_name) - job_id, _ = sky.get(request_id) - self._register_job(job_id, derived_name) - job_ids.append(job_id) - return job_ids - - def stop(self, job_name: str, force: bool = False) -> None: - job_ids = list(self._job_groups.get(job_name, set())) - if not job_ids: - return - logger.info("Stopping jobs %s (ids=%s)", job_name, job_ids) - sky.cancel(self.cluster_name, job_ids=job_ids) - for job_id in job_ids: - self._remove_job(job_id) - - def stop_all(self, force: bool = False) -> None: - job_ids = list(self.jobs.keys()) - if not job_ids: - return - logger.info("Stopping all SkyPilot jobs: %s", job_ids) - sky.cancel(self.cluster_name, job_ids=job_ids) - for job_id in job_ids: - self._remove_job(job_id) - - def find(self, job_name: str) -> Optional[JobInfo]: - self._update_all() - job_ids = list(self._job_groups.get(job_name, set())) - if not job_ids: - return None - return self.jobs[job_ids[0]] - - def find_all(self, job_name_regex: str = ".*") -> List[JobInfo]: - self._update_all() - pattern = re.compile(job_name_regex) - results: List[JobInfo] = [] - for job_id, info in self.jobs.items(): - base = self._job_meta[job_id]["base"] - if pattern.fullmatch(base): - results.append(info) - return results - - def wait( - self, - timeout: Optional[int] = None, - check_status: Tuple[JobState, ...] = ( - JobState.CANCELLED, - JobState.FAILED, - JobState.NOT_FOUND, - ), - remove_status: Tuple[JobState, ...] = (JobState.COMPLETED,), - update: bool = False, - job_names: Optional[Iterable[str]] = None, - ) -> None: - deadline = None if timeout is None else time.time() + timeout - target_ids = self._select_job_ids(job_names) - pending = set(target_ids) - if not pending: - return - logger.info("Waiting for jobs %s", sorted(pending)) - while pending: - if deadline is not None and time.time() > deadline: - raise TimeoutError( - f"Timeout waiting for jobs {sorted(pending)} to finish." - ) - self._update_all() - for job_id in list(pending): - info = self.jobs.get(job_id) - if info is None: - pending.discard(job_id) - continue - state = info.state - base = self._job_meta[job_id]["base"] - if state in check_status: - raise JobException( - run_name=self.run_name, - worker_type=base, - host=self.cluster_name, - reason=state, - ) - if state in remove_status: - logger.info( - "Job %s (id=%s) reached %s", info.name, job_id, state.name - ) - pending.discard(job_id) - if update: - self._remove_job(job_id) - if pending: - time.sleep(SKY_WAIT_CHECK_TIME_INTERVAL) - - def _register_job(self, job_id: int, job_name: str) -> None: - base = job_name.split(":", maxsplit=1)[0] - self.jobs[job_id] = JobInfo( - name=job_name, - state=JobState.PENDING, - host=self.cluster_name, - ) - self._job_meta[job_id] = {"name": job_name, "base": base} - self._job_groups.setdefault(base, set()).add(job_id) - - def _remove_job(self, job_id: int) -> None: - info = self._job_meta.pop(job_id, None) - self.jobs.pop(job_id, None) - if info is None: - return - base = info["base"] - group = self._job_groups.get(base) - if group and job_id in group: - group.remove(job_id) - if not group: - self._job_groups.pop(base, None) - - def _select_job_ids(self, job_names: Optional[Iterable[str]]) -> List[int]: - if job_names is None: - return list(self.jobs.keys()) - selected: List[int] = [] - for base in job_names: - selected.extend(list(self._job_groups.get(base, set()))) - return selected - - def _update_all(self) -> None: - if not self.jobs: - return - job_ids = list(self.jobs.keys()) - try: - status_request = sky.job_status(self.cluster_name, job_ids=job_ids) - statuses = sky.get(status_request) - except Exception as exc: # pragma: no cover - best effort logging - logger.warning("Failed to query SkyPilot job status: %s", exc) - return - for job_id in job_ids: - info = self.jobs.get(job_id) - if info is None: - continue - status = statuses.get(job_id) - if status is None: - info.state = JobState.NOT_FOUND - else: - info.state = SKY_TO_JOB_STATE.get(status, JobState.NOT_FOUND) - - -def _quoted_cmd(parts: List[str]) -> str: - return " ".join(shlex.quote(p) for p in parts) - - -def _build_sglang_task( - launcher: SkyPilotLauncher, - job_name: str, - config_args: List[str], - allocation: AllocationMode, - sglang_cfg: SGLangConfig, - n_nodes: int, - gpus_per_node: int, - env_vars: Dict[str, str], -) -> sky.Task: - assert allocation.gen_backend == "sglang" - base_seed = sglang_cfg.random_seed - n_sglang_servers = allocation.gen.dp_size - n_servers_per_node = max(n_sglang_servers // max(n_nodes, 1), 1) - cross_nodes = allocation.gen_instance_size > gpus_per_node - - def run_generator(node_rank: int, host_ips: List[str]) -> str: - args = list(config_args) - args.append(f"sglang.random_seed={base_seed + node_rank * n_servers_per_node}") - cmd = _quoted_cmd(["python", "-m", "areal.launcher.sglang_server", *args]) - exports: List[str] = [] - if cross_nodes: - exports.append(f"export AREAL_SGLANG_MULTI_NODE_RANK={node_rank}") - exports.append(f"export AREAL_SGLANG_MULTI_NODE_MASTER_ADDR={host_ips[0]}") - # TODO: find free port - exports.append("export AREAL_SGLANG_MULTI_NODE_MASTER_PORT=17901") - if exports: - return " && ".join(exports + [cmd]) - return cmd - - return launcher._base_task( # pylint: disable=protected-access - name=job_name, - num_nodes=n_nodes, - run=run_generator, - extra_envs=env_vars, - ) - - -def _build_vllm_task( - launcher: SkyPilotLauncher, - job_name: str, - config_args: List[str], - allocation: AllocationMode, - vllm_cfg: vLLMConfig, - n_nodes: int, - env_vars: Dict[str, str], -) -> sky.Task: - assert allocation.gen_backend == "vllm" - base_seed = vllm_cfg.seed - - def run_generator(node_rank: int, _host_ips: List[str]) -> str: - args = list(config_args) - args.append(f"vllm.seed={base_seed + node_rank}") - cmd = _quoted_cmd(["python", "-m", "areal.launcher.vllm_server", *args]) - return cmd - - return launcher._base_task( # pylint: disable=protected-access - name=job_name, - num_nodes=n_nodes, - run=run_generator, - extra_envs=env_vars, - ) - - -def _build_trainer_task( - launcher: SkyPilotLauncher, - job_name: str, - trainer_entry: str, - trainer_args: List[str], - allocation: AllocationMode, - n_nodes: int, - gpus_per_node: int, - env_vars: Dict[str, str], - is_eval_only: bool, -) -> sky.Task: - - if is_eval_only: - - cmd = _quoted_cmd(["python", trainer_entry, *trainer_args]) - return launcher._base_task( - job_name, - num_nodes=1, - run=cmd, - extra_envs=env_vars, - ) - - # TODO: find free port - rendezvous_port = 29501 - - def run_generator(node_rank: int, host_ips: List[str]) -> str: - master_addr = host_ips[0] - torchrun_cmd = [ - "torchrun", - "--nnodes", - str(n_nodes), - "--nproc-per-node", - str(gpus_per_node), - "--rdzv_backend", - "c10d", - "--rdzv_endpoint", - f"{master_addr}:{rendezvous_port}", - "--node_rank", - str(node_rank), - trainer_entry, - *trainer_args, - ] - cmd = _quoted_cmd(torchrun_cmd) - return cmd - - return launcher._base_task( - job_name, - num_nodes=n_nodes, - run=run_generator, - extra_envs=env_vars, - ) - - -def skypilot_main(config, run_id: int = 0): - config.launcher = to_structured_cfg(config.launcher, LauncherConfig) - config.recover = to_structured_cfg(config.recover, RecoverConfig) - config.cluster = to_structured_cfg(config.cluster, ClusterSpecConfig) - config.launcher.skypilot = to_structured_cfg( - config.launcher.skypilot, SkyPilotLauncherConfig - ) - - is_recover_run = check_if_recover(config.recover, run_id) - validate_config_for_distributed_launcher(config) - - name_resolve.reconfigure(config.cluster.name_resolve) - name_resolve.clear_subtree( - names.trial_root( - experiment_name=config.experiment_name, trial_name=config.trial_name - ) - ) - - allocation_mode = AllocationMode.from_str(config.allocation_mode) - launcher = SkyPilotLauncher( - experiment_name=config.experiment_name, - trial_name=config.trial_name, - total_nodes=config.cluster.n_nodes, - skypilot_cfg=config.launcher.skypilot, - ) - launcher.ensure_cluster() - - trainer_entry = sys.argv[1] - trainer_args = sys.argv[2:] - - llm_job_name: Optional[str] = None - llm_addrs: List[str] = [] - - try: - gpus_per_node = config.cluster.n_gpus_per_node - llm_backend = allocation_mode.gen_backend - if llm_backend == "sglang": - llm_job_name = f"{launcher.cluster_name}-sglang" - config.sglang = to_structured_cfg(config.sglang, SGLangConfig) - n_llm_nodes = max( - (allocation_mode.gen.world_size + gpus_per_node - 1) - // max(gpus_per_node, 1), - 1, - ) - llm_env = get_env_vars( - config.cluster.cluster_name, - config.launcher.inference_server_env_vars, - ) - task = _build_sglang_task( - launcher=launcher, - job_name=llm_job_name, - config_args=list(trainer_args), - allocation=allocation_mode, - sglang_cfg=config.sglang, - n_nodes=n_llm_nodes, - gpus_per_node=gpus_per_node, - env_vars=llm_env, - ) - launcher.submit(llm_job_name, task) - elif llm_backend == "vllm": - llm_job_name = f"{launcher.cluster_name}-vllm" - config.vllm = to_structured_cfg(config.vllm, vLLMConfig) - n_llm_nodes = max( - (allocation_mode.gen.world_size + gpus_per_node - 1) - // max(gpus_per_node, 1), - 1, - ) - llm_env = get_env_vars( - config.cluster.cluster_name, - config.launcher.inference_server_env_vars, - ) - task = _build_vllm_task( - launcher=launcher, - job_name=llm_job_name, - config_args=list(trainer_args), - allocation=allocation_mode, - vllm_cfg=config.vllm, - n_nodes=n_llm_nodes, - env_vars=llm_env, - ) - launcher.submit(llm_job_name, task) - - if llm_job_name is not None: - llm_addrs = wait_llm_server_addrs( - experiment_name=config.experiment_name, - trial_name=config.trial_name, - n_rollout_servers=allocation_mode.gen.dp_size, - ) - - if allocation_mode.type_ == AllocationType.LLM_SERVER_ONLY: - if llm_job_name is None: - logger.warning( - "Allocation mode is LLM_SERVER_ONLY but no LLM job launched." - ) - else: - launcher.wait( - job_names=[llm_job_name], - check_status=( - JobState.FAILED, - JobState.CANCELLED, - JobState.NOT_FOUND, - ), - remove_status=(JobState.COMPLETED,), - update=False, - ) - return - - trainer_env = dict( - **get_env_vars( - config.cluster.cluster_name, - config.launcher.trainer_env_vars, - ), - AREAL_RECOVER_RUN=str(int(is_recover_run)), - ) - if llm_addrs: - trainer_env["AREAL_LLM_SERVER_ADDRS"] = ",".join(llm_addrs) - - if allocation_mode.type_ == AllocationType.DECOUPLED_EVAL: - trainer_nodes = 1 - gpus_per_node = 0 - else: - trainer_nodes = max( - config.cluster.n_nodes - - (allocation_mode.gen.world_size // config.cluster.n_gpus_per_node), - 1, - ) - gpus_per_node = config.cluster.n_gpus_per_node - - trainer_job_name = f"{launcher.cluster_name}-trainer" - trainer_task = _build_trainer_task( - launcher=launcher, - job_name=trainer_job_name, - trainer_entry=trainer_entry, - trainer_args=trainer_args, - allocation=allocation_mode, - n_nodes=trainer_nodes, - gpus_per_node=gpus_per_node, - env_vars=trainer_env, - is_eval_only=allocation_mode.type_ == AllocationType.DECOUPLED_EVAL, - ) - launcher.submit(trainer_job_name, trainer_task) - - launcher.wait( - job_names=[trainer_job_name], - check_status=( - JobState.FAILED, - JobState.CANCELLED, - JobState.NOT_FOUND, - ), - remove_status=(JobState.COMPLETED,), - update=True, - ) - except (KeyboardInterrupt, TimeoutError, JobException) as exc: - logger.error("SkyPilot launcher encountered an error: %s", exc) - launcher.stop_all() - recoverable_states = {JobState.FAILED} - if ( - isinstance(exc, JobException) - and exc.reason in recoverable_states - and run_id < config.recover.retries - and config.recover.mode in ("auto", "fault") - ): - time.sleep(10) - skypilot_main(config, run_id=run_id + 1) - else: - raise - finally: - if llm_job_name is not None: - try: - launcher.stop(llm_job_name) - except Exception as cancel_exc: # pragma: no cover - logger.warning("Failed to cancel LLM server job: %s", cancel_exc) - - -def main(): - config, _ = parse_cli_args(sys.argv[1:]) - skypilot_main(config, run_id=0) - - -if __name__ == "__main__": - main() diff --git a/examples/skypilot/README.md b/examples/skypilot/README.md index df14317d1..4e9bab38a 100644 --- a/examples/skypilot/README.md +++ b/examples/skypilot/README.md @@ -51,7 +51,7 @@ sky launch -c areal-test examples/skypilot/local.yaml ## Running a Multi-Node Experiment -### Option 1: Running AReaL with Ray Launcher +### Running AReaL with Ray Launcher The following example shows how to setup a ray cluster with SkyPilot and then use AReaL to run GRPO with GSM8K dataset on 2 nodes, each with 1 A100 GPU. This example runs on @@ -130,25 +130,20 @@ run: | Then you are ready to run AReaL with command line: ```bash -export WANDB_API_KEY= -sky launch -c areal-test --secret WANDB_API_KEY examples/skypilot/ray_cluster.yaml +sky launch -c areal-test examples/skypilot/ray_cluster.yaml ``` You should be able to see your AReaL running and producing training logs in your terminal. - +Successfully launched 2 nodes on GCP and deployed a ray cluster: +Launching Ray Cluster -## Option 2: Running AReaL with SkyPilot Launcher +Successfully ran a training step: +Running a train step - +### Running AReaL with SkyPilot Launcher -You could also run a multi-node AReaL experiment in a single command, without having to -launch the Ray cluster: - -```bash -python3 -m areal.launcher.skypilot examples/math/gsm8k_grpo.py \ - --config examples/skypilot/gsm8k_grpo_skypilot.yaml \ - experiment_name= \ - trial_name= -``` +AReaL plans to support a SkyPilot native launcher with +[SkyPilot Python SDK](https://docs.skypilot.co/en/latest/reference/api.html), which is +currently under development. diff --git a/examples/skypilot/ray_launch.png b/examples/skypilot/ray_launch.png new file mode 100644 index 0000000000000000000000000000000000000000..207251b282867ca8cdc3c01b907a57f2c35f1dd3 GIT binary patch literal 159167 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
ib^t#V?)-DD?&X$XD=53dSY8ZaL@9QZ&< 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 a&o1-^%B^Yon#_QJm-;;&Ww?^<)BgbFZ!;$V literal 0 HcmV?d00001 diff --git a/examples/skypilot/train_step_success.png b/examples/skypilot/train_step_success.png new file mode 100644 index 0000000000000000000000000000000000000000..4acb5f6ba5fe10b5466a101a98f3ec39878a97cf GIT binary patch literal 175470 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�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�ozN3?-hmW^!v!T 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 RzXSn)WF!>DOGJ(Q{}&O1o$>$x literal 0 HcmV?d00001 From d3dbc7b61b53f570b94180b656598c45f70cf1ec Mon Sep 17 00:00:00 2001 From: nuzant Date: Fri, 17 Oct 2025 17:13:13 +0800 Subject: [PATCH 6/8] . --- areal/api/cli_args.py | 149 ------------------------------------------ docs/cli_reference.md | 61 +++-------------- 2 files changed, 9 insertions(+), 201 deletions(-) diff --git a/areal/api/cli_args.py b/areal/api/cli_args.py index 36931feb0..70da16426 100644 --- a/areal/api/cli_args.py +++ b/areal/api/cli_args.py @@ -989,151 +989,6 @@ class SlurmLauncherConfig: ) -@dataclass -class SkyPilotLauncherClusterConfig: - """Configuration for launching the training jobs with SkyPilot.""" - - # Basic task metadata - name: str | None = field( - default=None, - metadata={"help": "Optional task name displayed in SkyPilot."}, - ) - workdir: str | None = field( - default=None, - metadata={ - "help": "Local path or git repo spec to sync as working directory (mirrors SkyPilot YAML workdir)." - }, - ) - - # Core resource specification (subset of SkyPilot resources.* fields) - infra: str | None = field( - default=None, - metadata={ - "help": "Infrastructure spec // or k8s[/context] (resources.infra).", - }, - ) - accelerator_type: str | None = field( - default=None, - metadata={ - "help": "Accelerator request, e.g. 'H100', 'A100'. Number of GPUs on the node is determined by `cluster.n_gpus_per_node`.", - }, - ) - accelerator_args: str | None = field( - default=None, - metadata={ - "help": "Additional accelerator args (YAML/JSON string) (resources.accelerator_args).", - }, - ) - use_spot: bool = field( - default=False, - metadata={ - "help": "Whether to use spot/preemptible instances (resources.use_spot)." - }, - ) - disk_size: str | None = field( - default=None, - metadata={ - "help": "Boot disk size with optional unit, e.g. '256', '256GB' (resources.disk_size)." - }, - ) - disk_tier: str = field( - default="medium", - metadata={ - "help": "Disk performance tier (resources.disk_tier).", - "choices": ["low", "medium", "high", "ultra", "best"], - }, - ) - network_tier: str = field( - default="standard", - metadata={ - "help": "Network tier (resources.network_tier).", - "choices": ["standard", "best"], - }, - ) - ports: str | None = field( - default=None, - metadata={ - "help": "Ports to expose, supports single '8080', range '10052-10100', or comma list (resources.ports)." - }, - ) - image_id: str | None = field( - default=None, - metadata={"help": "Custom base or docker image id (resources.image_id)."}, - ) - labels: str | None = field( - default=None, - metadata={ - "help": "Instance/pod labels as key=value pairs joined by commas (resources.labels)." - }, - ) - - any_of: str | None = field( - default=None, - metadata={ - "help": "YAML/JSON string list of candidate resource dicts (resources.any_of)." - }, - ) - ordered: str | None = field( - default=None, - metadata={ - "help": "YAML/JSON string list of ordered resource dicts (resources.ordered)." - }, - ) - job_recovery: str | None = field( - default=None, - metadata={ - "help": "Job recovery strategy spec (resources.job_recovery). Provide JSON/YAML." - }, - ) - - # Autostop: store flexible spec as raw string - autostop: str | None = field( - default=None, - metadata={ - "help": "Autostop configuration: true/false/10/10h or JSON object (resources.autostop)." - }, - ) - - # Environment & secret injection - envs: str | None = field( - default=None, - metadata={ - "help": "Environment variables (envs) as KEY=VAL pairs joined by commas." - }, - ) - secrets: str | None = field( - default=None, - metadata={ - "help": "Secrets usable in setup/run as KEY=VAL pairs joined by commas (will be redacted)." - }, - ) - - volumes: str | None = field( - default=None, - metadata={ - "help": "Kubernetes volume mappings (volumes) as YAML/JSON string or shorthand mount spec." - }, - ) - file_mounts: str | None = field( - default=None, - metadata={ - "help": "File mounts mapping remote_path:local_path lines or JSON/YAML string (file_mounts)." - }, - ) - - -@dataclass -class SkyPilotLauncherConfig: - inference_server: SkyPilotLauncherClusterConfig = field( - default_factory=SkyPilotLauncherClusterConfig, - metadata={"help": "SkyPilot cluster configuration for inference server."}, - ) - trainer: SkyPilotLauncherClusterConfig = field( - default_factory=SkyPilotLauncherClusterConfig, - metadata={"help": "SkyPilot cluster configuration for trainer."}, - ) - - @dataclass class LauncherConfig: """Configuration for launching the LLM server and trainer processes.""" @@ -1172,10 +1027,6 @@ class LauncherConfig: default_factory=SlurmLauncherConfig, metadata={"help": "Slurm launcher configuration."}, ) - skypilot: SkyPilotLauncherConfig = field( - default_factory=SkyPilotLauncherConfig, - metadata={"help": "SkyPilot launcher configuration."}, - ) @dataclass diff --git a/docs/cli_reference.md b/docs/cli_reference.md index b0bb06bd6..a0c60f956 100644 --- a/docs/cli_reference.md +++ b/docs/cli_reference.md @@ -72,8 +72,6 @@ For detailed examples, see the experiment configurations in the `examples/` dire ### Others - [Scheduler Configuration](section-scheduler) -- [SkyPilotLauncherCluster Configuration](section-sky-pilot-launcher-cluster) -- [SkyPilotLauncher Configuration](section-sky-pilot-launcher) ______________________________________________________________________ @@ -599,16 +597,15 @@ Configuration for cluster specification and distributed computing setup. Configuration for launching the LLM server and trainer processes. -| Parameter | Type | Default | Description | -| ------------------------------- | ------------------------------------------------------ | ------------ | ------------------------------------------------------------------------------------------------ | -| `inference_server_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for inference server. | -| `inference_server_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for inference server in MB. | -| `trainer_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for training. | -| `trainer_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for training in MB. | -| `inference_server_env_vars` | string | `""` | Environment variables for inference server, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | -| `trainer_env_vars` | string | `""` | Environment variables for training, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | -| `slurm` | [`SlurmLauncherConfig`](section-slurm-launcher) | **Required** | Slurm launcher configuration. | -| `skypilot` | [`SkyPilotLauncherConfig`](section-sky-pilot-launcher) | **Required** | SkyPilot launcher configuration. | +| Parameter | Type | Default | Description | +| ------------------------------- | ----------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------ | +| `inference_server_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for inference server. | +| `inference_server_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for inference server in MB. | +| `trainer_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for training. | +| `trainer_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for training in MB. | +| `inference_server_env_vars` | string | `""` | Environment variables for inference server, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | +| `trainer_env_vars` | string | `""` | Environment variables for training, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | +| `slurm` | [`SlurmLauncherConfig`](section-slurm-launcher) | **Required** | Slurm launcher configuration. | (section-name-resolve)= @@ -759,43 +756,3 @@ Configuration for worker scheduling. Used in the single-controller mode. Experim | `reward_functioncall_config` | `Dict` | **Required** | - | | `reward_model_path` | string | `""` | - | | `reward_model_service_url` | string | `"http://localhost:30000/classify"` | - | - -(section-sky-pilot-launcher-cluster)= - -## SkyPilotLauncherCluster Configuration - -Configuration for launching the training jobs with SkyPilot. - -| Parameter | Type | Default | Description | -| ------------------ | -------------- | ------------ | ---------------------------------------------------------------------------------------------------------------- | -| `name` | string \| None | `None` | Optional task name displayed in SkyPilot. | -| `workdir` | string \| None | `None` | Local path or git repo spec to sync as working directory (mirrors SkyPilot YAML workdir). | -| `infra` | string \| None | `None` | Infrastructure spec // or k8s\[/context\] (resources.infra). | -| `accelerator_type` | string \| None | `None` | Accelerator request, e.g. 'H100', 'A100'. Number of GPUs on the node is determined by `cluster.n_gpus_per_node`. | -| `accelerator_args` | string \| None | `None` | Additional accelerator args (YAML/JSON string) (resources.accelerator_args). | -| `use_spot` | boolean | `False` | Whether to use spot/preemptible instances (resources.use_spot). | -| `disk_size` | string \| None | `None` | Boot disk size with optional unit, e.g. '256', '256GB' (resources.disk_size). | -| `disk_tier` | string | `"medium"` | Disk performance tier (resources.disk_tier). **Choices:** `low`, `medium`, `high`, `ultra`, `best` | -| `network_tier` | string | `"standard"` | Network tier (resources.network_tier). **Choices:** `standard`, `best` | -| `ports` | string \| None | `None` | Ports to expose, supports single '8080', range '10052-10100', or comma list (resources.ports). | -| `image_id` | string \| None | `None` | Custom base or docker image id (resources.image_id). | -| `labels` | string \| None | `None` | Instance/pod labels as key=value pairs joined by commas (resources.labels). | -| `any_of` | string \| None | `None` | YAML/JSON string list of candidate resource dicts (resources.any_of). | -| `ordered` | string \| None | `None` | YAML/JSON string list of ordered resource dicts (resources.ordered). | -| `job_recovery` | string \| None | `None` | Job recovery strategy spec (resources.job_recovery). Provide JSON/YAML. | -| `autostop` | string \| None | `None` | Autostop configuration: true/false/10/10h or JSON object (resources.autostop). | -| `envs` | string \| None | `None` | Environment variables (envs) as KEY=VAL pairs joined by commas. | -| `secrets` | string \| None | `None` | Secrets usable in setup/run as KEY=VAL pairs joined by commas (will be redacted). | -| `volumes` | string \| None | `None` | Kubernetes volume mappings (volumes) as YAML/JSON string or shorthand mount spec. | -| `file_mounts` | string \| None | `None` | File mounts mapping remote_path:local_path lines or JSON/YAML string (file_mounts). | - -(section-sky-pilot-launcher)= - -## SkyPilotLauncher Configuration - -Configuration class: SkyPilotLauncherConfig - -| Parameter | Type | Default | Description | -| ------------------ | --------------------------------------------------------------------- | ------------ | ---------------------------------------------------- | -| `inference_server` | [`SkyPilotLauncherClusterConfig`](section-sky-pilot-launcher-cluster) | **Required** | SkyPilot cluster configuration for inference server. | -| `trainer` | [`SkyPilotLauncherClusterConfig`](section-sky-pilot-launcher-cluster) | **Required** | SkyPilot cluster configuration for trainer. | From 77f062f817b48646b9109e077077bcda6e8ced24 Mon Sep 17 00:00:00 2001 From: nuzant Date: Fri, 17 Oct 2025 17:14:38 +0800 Subject: [PATCH 7/8] . --- docs/generate_cli_docs.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/docs/generate_cli_docs.py b/docs/generate_cli_docs.py index c893237a5..2929e6afc 100644 --- a/docs/generate_cli_docs.py +++ b/docs/generate_cli_docs.py @@ -8,7 +8,6 @@ """ import inspect -import platform import sys import types from dataclasses import MISSING as DATACLASSES_MISSING @@ -23,11 +22,8 @@ project_root = Path(__file__).parent.parent sys.path.insert(0, str(project_root)) -try: - # Import the entire module to discover all dataclasses - import areal.api.cli_args as cli_args_module -except ImportError as e: - cli_args_module = None +# Import the entire module to discover all dataclasses +import areal.api.cli_args as cli_args_module def discover_dataclasses() -> Dict[str, Any]: @@ -372,8 +368,5 @@ def main(): if __name__ == "__main__": - if platform.system() == "Windows": - print("Detected Windows OS, skipping.") - sys.exit(0) success = main() sys.exit(0 if success else 1) From 3218e78a6941cb932cc99cde06f18c452943aef2 Mon Sep 17 00:00:00 2001 From: nuzant Date: Fri, 17 Oct 2025 17:21:43 +0800 Subject: [PATCH 8/8] add skypilot launcher draft --- areal/api/cli_args.py | 137 ++++++++ areal/launcher/skypilot.py | 632 +++++++++++++++++++++++++++++++++++++ docs/cli_reference.md | 49 ++- 3 files changed, 809 insertions(+), 9 deletions(-) create mode 100644 areal/launcher/skypilot.py diff --git a/areal/api/cli_args.py b/areal/api/cli_args.py index 70da16426..a66456a95 100644 --- a/areal/api/cli_args.py +++ b/areal/api/cli_args.py @@ -989,6 +989,139 @@ class SlurmLauncherConfig: ) +@dataclass +class SkyPilotLauncherConfig: + """Configuration for launching the training jobs with SkyPilot.""" + + # Basic task metadata + name: str | None = field( + default=None, + metadata={"help": "Optional task name displayed in SkyPilot."}, + ) + workdir: str | None = field( + default=None, + metadata={ + "help": "Local path or git repo spec to sync as working directory (mirrors SkyPilot YAML workdir)." + }, + ) + + # Core resource specification (subset of SkyPilot resources.* fields) + infra: str | None = field( + default=None, + metadata={ + "help": "Infrastructure spec // or k8s[/context] (resources.infra).", + }, + ) + accelerator_type: str | None = field( + default=None, + metadata={ + "help": "Accelerator request, e.g. 'H100', 'A100'. Number of GPUs on the node is determined by `cluster.n_gpus_per_node`.", + }, + ) + accelerator_args: str | None = field( + default=None, + metadata={ + "help": "Additional accelerator args (YAML/JSON string) (resources.accelerator_args).", + }, + ) + use_spot: bool = field( + default=False, + metadata={ + "help": "Whether to use spot/preemptible instances (resources.use_spot)." + }, + ) + disk_size: str | None = field( + default=None, + metadata={ + "help": "Boot disk size with optional unit, e.g. '256', '256GB' (resources.disk_size)." + }, + ) + disk_tier: str = field( + default="medium", + metadata={ + "help": "Disk performance tier (resources.disk_tier).", + "choices": ["low", "medium", "high", "ultra", "best"], + }, + ) + network_tier: str = field( + default="standard", + metadata={ + "help": "Network tier (resources.network_tier).", + "choices": ["standard", "best"], + }, + ) + ports: str | None = field( + default=None, + metadata={ + "help": "Ports to expose, supports single '8080', range '10052-10100', or comma list (resources.ports)." + }, + ) + image_id: str | None = field( + default=None, + metadata={"help": "Custom base or docker image id (resources.image_id)."}, + ) + labels: str | None = field( + default=None, + metadata={ + "help": "Instance/pod labels as key=value pairs joined by commas (resources.labels)." + }, + ) + + any_of: str | None = field( + default=None, + metadata={ + "help": "YAML/JSON string list of candidate resource dicts (resources.any_of)." + }, + ) + ordered: str | None = field( + default=None, + metadata={ + "help": "YAML/JSON string list of ordered resource dicts (resources.ordered)." + }, + ) + job_recovery: str | None = field( + default=None, + metadata={ + "help": "Job recovery strategy spec (resources.job_recovery). Provide JSON/YAML." + }, + ) + + # Autostop: store flexible spec as raw string + autostop: str | None = field( + default=None, + metadata={ + "help": "Autostop configuration: true/false/10/10h or JSON object (resources.autostop)." + }, + ) + + # Environment & secret injection + envs: str | None = field( + default=None, + metadata={ + "help": "Environment variables (envs) as KEY=VAL pairs joined by commas." + }, + ) + secrets: str | None = field( + default=None, + metadata={ + "help": "Secrets usable in setup/run as KEY=VAL pairs joined by commas (will be redacted)." + }, + ) + + volumes: str | None = field( + default=None, + metadata={ + "help": "Kubernetes volume mappings (volumes) as YAML/JSON string or shorthand mount spec." + }, + ) + file_mounts: str | None = field( + default=None, + metadata={ + "help": "File mounts mapping remote_path:local_path lines or JSON/YAML string (file_mounts)." + }, + ) + + @dataclass class LauncherConfig: """Configuration for launching the LLM server and trainer processes.""" @@ -1027,6 +1160,10 @@ class LauncherConfig: default_factory=SlurmLauncherConfig, metadata={"help": "Slurm launcher configuration."}, ) + skypilot: SkyPilotLauncherConfig = field( + default_factory=SkyPilotLauncherConfig, + metadata={"help": "SkyPilot launcher configuration."}, + ) @dataclass diff --git a/areal/launcher/skypilot.py b/areal/launcher/skypilot.py new file mode 100644 index 000000000..68e75ad65 --- /dev/null +++ b/areal/launcher/skypilot.py @@ -0,0 +1,632 @@ +"""Launch AReaL experiments on SkyPilot-managed clusters. + +This launcher mirrors the semantics of the Ray and Slurm launchers while +delegating provisioning and task execution to the SkyPilot Python SDK. +""" + +from __future__ import annotations + +import re +import shlex +import sys +import time +from pathlib import Path +from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Union + +import yaml + +from areal.api.alloc_mode import AllocationMode, AllocationType +from areal.api.cli_args import ( + ClusterSpecConfig, + LauncherConfig, + RecoverConfig, + SGLangConfig, + SkyPilotLauncherConfig, + parse_cli_args, + to_structured_cfg, + vLLMConfig, +) +from areal.utils import logging, name_resolve, names +from areal.utils.launcher import ( + JobException, + JobInfo, + JobState, + get_env_vars, + validate_config_for_distributed_launcher, + wait_llm_server_addrs, +) +from areal.utils.recover import check_if_recover + +logger = logging.getLogger("SkyPilotLauncher") + + +try: + import sky + from sky import JobStatus as SkyJobStatus +except ImportError as exc: # pragma: no cover - handled at runtime + raise ImportError( + "SkyPilot launcher requires the `skypilot` package. " + "Install it via `pip install -U skypilot`." + ) from exc + + +SKY_TO_JOB_STATE: Dict[SkyJobStatus, JobState] = { + SkyJobStatus.INIT: JobState.PENDING, + SkyJobStatus.PENDING: JobState.PENDING, + SkyJobStatus.SETTING_UP: JobState.PENDING, + SkyJobStatus.RUNNING: JobState.RUNNING, + SkyJobStatus.SUCCEEDED: JobState.COMPLETED, + SkyJobStatus.FAILED: JobState.FAILED, + SkyJobStatus.FAILED_SETUP: JobState.FAILED, + SkyJobStatus.FAILED_DRIVER: JobState.FAILED, + SkyJobStatus.CANCELLED: JobState.CANCELLED, +} + + +SKY_WAIT_CHECK_TIME_INTERVAL = 5 # seconds + + +def _readable_cluster_name(experiment_name: str, trial_name: str) -> str: + slug = f"areal-{experiment_name}-{trial_name}" + return re.sub(r"[^a-zA-Z0-9-]", "-", slug).lower() + + +def _parse_key_value_pairs(value: Optional[str]) -> Dict[str, str]: + if not value: + return {} + result = {} + for chunk in value.split(","): + if not chunk: + continue + if "=" not in chunk: + raise ValueError( + f"Environment/secret entry '{chunk}' must be in KEY=VALUE format." + ) + key, val = chunk.split("=", 1) + result[key.strip()] = val.strip() + return result + + +def _parse_yaml_like(value: Optional[str]) -> Any: + if not value: + return None + return yaml.safe_load(value) + + +def _default_workdir(skypilot_cfg: SkyPilotLauncherConfig) -> str: + if skypilot_cfg.workdir: + return skypilot_cfg.workdir + return str(Path.cwd()) + + +RunSpec = Union[str, Callable[[int, List[str]], str]] + + +class SkyPilotLauncher: + def __init__( + self, + experiment_name: str, + trial_name: str, + config: LauncherConfig, + cluster_spec_config: ClusterSpecConfig, + ): + self.experiment_name = experiment_name + self.trial_name = trial_name + self.config = config + self.skypilot_config = config.skypilot + self.cluster_spec_config = cluster_spec_config + + self.cluster_name = _readable_cluster_name(experiment_name, trial_name) + self._ensure_cluster() + + def _build_resources(self) -> sky.Resources: + assert self.skypilot_config.accelerator_type is not None + self.cluster_spec_config.n_nodes + accelerator_type = self.skypilot_config.accelerator_type + n_gpus_per_node = self.cluster_spec_config.n_gpus_per_node + accelerators = f"{accelerator_type}:{n_gpus_per_node}" + # TODO: build sky.Resources according to SkyPilotLauncherConfig cli_args.py + + def _base_task( + self, + name: str, + num_nodes: int, + run: RunSpec, + ) -> sky.Task: + base_envs = _parse_key_value_pairs(self.skypilot_config.envs) + secrets = _parse_key_value_pairs(self.skypilot_config.secrets) + if secrets: + base_envs.update(secrets) + workdir = _default_workdir(self.skypilot_config) + file_mounts = None + if self.skypilot_config.file_mounts: + file_mounts = _parse_yaml_like(self.skypilot_config.file_mounts) + resources = self._build_resources(self.skypilot_config) + task_kwargs: Dict[str, Any] = { + "name": name, + "num_nodes": num_nodes, + "run": run, + "workdir": workdir, + } + if base_envs: + task_kwargs["envs"] = base_envs + if file_mounts: + task_kwargs["file_mounts"] = file_mounts + task = sky.Task(**task_kwargs) + task.set_resources(resources) + return task + + def _ensure_cluster(self) -> None: + if self._cluster_ready: + return + provision_task = self._base_task( + name=f"{self.cluster_name}-provision", + num_nodes=self.total_nodes, + run="echo '[SkyPilot] Cluster ready for AReaL launching.'", # noqa: E501 + ) + logger.info( + "Launching/repairing SkyPilot cluster '%s' with %d node(s).", + self.cluster_name, + self.total_nodes, + ) + req_id = sky.launch(provision_task, cluster_name=self.cluster_name) + sky.stream_and_get(req_id) + self._cluster_ready = True + + @property + def run_name(self) -> str: + return f"{self.experiment_name}_{self.trial_name}" + + def submit(self, job_name: str, task: sky.Task) -> int: + job_ids = self.submit_array(job_name, [task]) + return job_ids[0] + + def submit_array(self, job_name: str, tasks: List[sky.Task]) -> List[int]: + assert tasks, "Tasks list cannot be empty." + job_ids: List[int] = [] + for idx, task in enumerate(tasks): + derived_name = job_name if len(tasks) == 1 else f"{job_name}:{idx}" + task.name = derived_name + logger.info("Submitting SkyPilot task '%s'", derived_name) + request_id = sky.exec(task, cluster_name=self.cluster_name) + job_id, _ = sky.get(request_id) + self._register_job(job_id, derived_name) + job_ids.append(job_id) + return job_ids + + def stop(self, job_name: str, force: bool = False) -> None: + job_ids = list(self._job_groups.get(job_name, set())) + if not job_ids: + return + logger.info("Stopping jobs %s (ids=%s)", job_name, job_ids) + sky.cancel(self.cluster_name, job_ids=job_ids) + for job_id in job_ids: + self._remove_job(job_id) + + def stop_all(self, force: bool = False) -> None: + job_ids = list(self.jobs.keys()) + if not job_ids: + return + logger.info("Stopping all SkyPilot jobs: %s", job_ids) + sky.cancel(self.cluster_name, job_ids=job_ids) + for job_id in job_ids: + self._remove_job(job_id) + + def find(self, job_name: str) -> Optional[JobInfo]: + self._update_all() + job_ids = list(self._job_groups.get(job_name, set())) + if not job_ids: + return None + return self.jobs[job_ids[0]] + + def find_all(self, job_name_regex: str = ".*") -> List[JobInfo]: + self._update_all() + pattern = re.compile(job_name_regex) + results: List[JobInfo] = [] + for job_id, info in self.jobs.items(): + base = self._job_meta[job_id]["base"] + if pattern.fullmatch(base): + results.append(info) + return results + + def wait( + self, + timeout: Optional[int] = None, + check_status: Tuple[JobState, ...] = ( + JobState.CANCELLED, + JobState.FAILED, + JobState.NOT_FOUND, + ), + remove_status: Tuple[JobState, ...] = (JobState.COMPLETED,), + update: bool = False, + job_names: Optional[Iterable[str]] = None, + ) -> None: + deadline = None if timeout is None else time.time() + timeout + target_ids = self._select_job_ids(job_names) + pending = set(target_ids) + if not pending: + return + logger.info("Waiting for jobs %s", sorted(pending)) + while pending: + if deadline is not None and time.time() > deadline: + raise TimeoutError( + f"Timeout waiting for jobs {sorted(pending)} to finish." + ) + self._update_all() + for job_id in list(pending): + info = self.jobs.get(job_id) + if info is None: + pending.discard(job_id) + continue + state = info.state + base = self._job_meta[job_id]["base"] + if state in check_status: + raise JobException( + run_name=self.run_name, + worker_type=base, + host=self.cluster_name, + reason=state, + ) + if state in remove_status: + logger.info( + "Job %s (id=%s) reached %s", info.name, job_id, state.name + ) + pending.discard(job_id) + if update: + self._remove_job(job_id) + if pending: + time.sleep(SKY_WAIT_CHECK_TIME_INTERVAL) + + def _register_job(self, job_id: int, job_name: str) -> None: + base = job_name.split(":", maxsplit=1)[0] + self.jobs[job_id] = JobInfo( + name=job_name, + state=JobState.PENDING, + host=self.cluster_name, + ) + self._job_meta[job_id] = {"name": job_name, "base": base} + self._job_groups.setdefault(base, set()).add(job_id) + + def _remove_job(self, job_id: int) -> None: + info = self._job_meta.pop(job_id, None) + self.jobs.pop(job_id, None) + if info is None: + return + base = info["base"] + group = self._job_groups.get(base) + if group and job_id in group: + group.remove(job_id) + if not group: + self._job_groups.pop(base, None) + + def _select_job_ids(self, job_names: Optional[Iterable[str]]) -> List[int]: + if job_names is None: + return list(self.jobs.keys()) + selected: List[int] = [] + for base in job_names: + selected.extend(list(self._job_groups.get(base, set()))) + return selected + + def _update_all(self) -> None: + if not self.jobs: + return + job_ids = list(self.jobs.keys()) + try: + status_request = sky.job_status(self.cluster_name, job_ids=job_ids) + statuses = sky.get(status_request) + except Exception as exc: # pragma: no cover - best effort logging + logger.warning("Failed to query SkyPilot job status: %s", exc) + return + for job_id in job_ids: + info = self.jobs.get(job_id) + if info is None: + continue + status = statuses.get(job_id) + if status is None: + info.state = JobState.NOT_FOUND + else: + info.state = SKY_TO_JOB_STATE.get(status, JobState.NOT_FOUND) + + +def _quoted_cmd(parts: List[str]) -> str: + return " ".join(shlex.quote(p) for p in parts) + + +def _build_sglang_task( + launcher: SkyPilotLauncher, + job_name: str, + config_args: List[str], + allocation: AllocationMode, + sglang_cfg: SGLangConfig, + n_nodes: int, + gpus_per_node: int, + env_vars: Dict[str, str], +) -> sky.Task: + assert allocation.gen_backend == "sglang" + base_seed = sglang_cfg.random_seed + n_sglang_servers = allocation.gen.dp_size + n_servers_per_node = max(n_sglang_servers // max(n_nodes, 1), 1) + cross_nodes = allocation.gen_instance_size > gpus_per_node + + def run_generator(node_rank: int, host_ips: List[str]) -> str: + args = list(config_args) + args.append(f"sglang.random_seed={base_seed + node_rank * n_servers_per_node}") + cmd = _quoted_cmd(["python", "-m", "areal.launcher.sglang_server", *args]) + exports: List[str] = [] + if cross_nodes: + exports.append(f"export AREAL_SGLANG_MULTI_NODE_RANK={node_rank}") + exports.append(f"export AREAL_SGLANG_MULTI_NODE_MASTER_ADDR={host_ips[0]}") + # TODO: find free port + exports.append("export AREAL_SGLANG_MULTI_NODE_MASTER_PORT=17901") + if exports: + return " && ".join(exports + [cmd]) + return cmd + + return launcher._base_task( # pylint: disable=protected-access + name=job_name, + num_nodes=n_nodes, + run=run_generator, + extra_envs=env_vars, + ) + + +def _build_vllm_task( + launcher: SkyPilotLauncher, + job_name: str, + config_args: List[str], + allocation: AllocationMode, + vllm_cfg: vLLMConfig, + n_nodes: int, + env_vars: Dict[str, str], +) -> sky.Task: + assert allocation.gen_backend == "vllm" + base_seed = vllm_cfg.seed + + def run_generator(node_rank: int, _host_ips: List[str]) -> str: + args = list(config_args) + args.append(f"vllm.seed={base_seed + node_rank}") + cmd = _quoted_cmd(["python", "-m", "areal.launcher.vllm_server", *args]) + return cmd + + return launcher._base_task( # pylint: disable=protected-access + name=job_name, + num_nodes=n_nodes, + run=run_generator, + extra_envs=env_vars, + ) + + +def _build_trainer_task( + launcher: SkyPilotLauncher, + job_name: str, + trainer_entry: str, + trainer_args: List[str], + allocation: AllocationMode, + n_nodes: int, + gpus_per_node: int, + env_vars: Dict[str, str], + is_eval_only: bool, +) -> sky.Task: + + if is_eval_only: + + cmd = _quoted_cmd(["python", trainer_entry, *trainer_args]) + return launcher._base_task( + job_name, + num_nodes=1, + run=cmd, + extra_envs=env_vars, + ) + + # TODO: find free port + rendezvous_port = 29501 + + def run_generator(node_rank: int, host_ips: List[str]) -> str: + master_addr = host_ips[0] + torchrun_cmd = [ + "torchrun", + "--nnodes", + str(n_nodes), + "--nproc-per-node", + str(gpus_per_node), + "--rdzv_backend", + "c10d", + "--rdzv_endpoint", + f"{master_addr}:{rendezvous_port}", + "--node_rank", + str(node_rank), + trainer_entry, + *trainer_args, + ] + cmd = _quoted_cmd(torchrun_cmd) + return cmd + + return launcher._base_task( + job_name, + num_nodes=n_nodes, + run=run_generator, + extra_envs=env_vars, + ) + + +def skypilot_main(config, run_id: int = 0): + config.launcher = to_structured_cfg(config.launcher, LauncherConfig) + config.recover = to_structured_cfg(config.recover, RecoverConfig) + config.cluster = to_structured_cfg(config.cluster, ClusterSpecConfig) + config.launcher.skypilot = to_structured_cfg( + config.launcher.skypilot, SkyPilotLauncherConfig + ) + + is_recover_run = check_if_recover(config.recover, run_id) + validate_config_for_distributed_launcher(config) + + name_resolve.reconfigure(config.cluster.name_resolve) + name_resolve.clear_subtree( + names.trial_root( + experiment_name=config.experiment_name, trial_name=config.trial_name + ) + ) + + allocation_mode = AllocationMode.from_str(config.allocation_mode) + launcher = SkyPilotLauncher( + experiment_name=config.experiment_name, + trial_name=config.trial_name, + total_nodes=config.cluster.n_nodes, + skypilot_cfg=config.launcher.skypilot, + ) + launcher.ensure_cluster() + + trainer_entry = sys.argv[1] + trainer_args = sys.argv[2:] + + llm_job_name: Optional[str] = None + llm_addrs: List[str] = [] + + try: + gpus_per_node = config.cluster.n_gpus_per_node + llm_backend = allocation_mode.gen_backend + if llm_backend == "sglang": + llm_job_name = f"{launcher.cluster_name}-sglang" + config.sglang = to_structured_cfg(config.sglang, SGLangConfig) + n_llm_nodes = max( + (allocation_mode.gen.world_size + gpus_per_node - 1) + // max(gpus_per_node, 1), + 1, + ) + llm_env = get_env_vars( + config.cluster.cluster_name, + config.launcher.inference_server_env_vars, + ) + task = _build_sglang_task( + launcher=launcher, + job_name=llm_job_name, + config_args=list(trainer_args), + allocation=allocation_mode, + sglang_cfg=config.sglang, + n_nodes=n_llm_nodes, + gpus_per_node=gpus_per_node, + env_vars=llm_env, + ) + launcher.submit(llm_job_name, task) + elif llm_backend == "vllm": + llm_job_name = f"{launcher.cluster_name}-vllm" + config.vllm = to_structured_cfg(config.vllm, vLLMConfig) + n_llm_nodes = max( + (allocation_mode.gen.world_size + gpus_per_node - 1) + // max(gpus_per_node, 1), + 1, + ) + llm_env = get_env_vars( + config.cluster.cluster_name, + config.launcher.inference_server_env_vars, + ) + task = _build_vllm_task( + launcher=launcher, + job_name=llm_job_name, + config_args=list(trainer_args), + allocation=allocation_mode, + vllm_cfg=config.vllm, + n_nodes=n_llm_nodes, + env_vars=llm_env, + ) + launcher.submit(llm_job_name, task) + + if llm_job_name is not None: + llm_addrs = wait_llm_server_addrs( + experiment_name=config.experiment_name, + trial_name=config.trial_name, + n_rollout_servers=allocation_mode.gen.dp_size, + ) + + if allocation_mode.type_ == AllocationType.LLM_SERVER_ONLY: + if llm_job_name is None: + logger.warning( + "Allocation mode is LLM_SERVER_ONLY but no LLM job launched." + ) + else: + launcher.wait( + job_names=[llm_job_name], + check_status=( + JobState.FAILED, + JobState.CANCELLED, + JobState.NOT_FOUND, + ), + remove_status=(JobState.COMPLETED,), + update=False, + ) + return + + trainer_env = dict( + **get_env_vars( + config.cluster.cluster_name, + config.launcher.trainer_env_vars, + ), + AREAL_RECOVER_RUN=str(int(is_recover_run)), + ) + if llm_addrs: + trainer_env["AREAL_LLM_SERVER_ADDRS"] = ",".join(llm_addrs) + + if allocation_mode.type_ == AllocationType.DECOUPLED_EVAL: + trainer_nodes = 1 + gpus_per_node = 0 + else: + trainer_nodes = max( + config.cluster.n_nodes + - (allocation_mode.gen.world_size // config.cluster.n_gpus_per_node), + 1, + ) + gpus_per_node = config.cluster.n_gpus_per_node + + trainer_job_name = f"{launcher.cluster_name}-trainer" + trainer_task = _build_trainer_task( + launcher=launcher, + job_name=trainer_job_name, + trainer_entry=trainer_entry, + trainer_args=trainer_args, + allocation=allocation_mode, + n_nodes=trainer_nodes, + gpus_per_node=gpus_per_node, + env_vars=trainer_env, + is_eval_only=allocation_mode.type_ == AllocationType.DECOUPLED_EVAL, + ) + launcher.submit(trainer_job_name, trainer_task) + + launcher.wait( + job_names=[trainer_job_name], + check_status=( + JobState.FAILED, + JobState.CANCELLED, + JobState.NOT_FOUND, + ), + remove_status=(JobState.COMPLETED,), + update=True, + ) + except (KeyboardInterrupt, TimeoutError, JobException) as exc: + logger.error("SkyPilot launcher encountered an error: %s", exc) + launcher.stop_all() + recoverable_states = {JobState.FAILED} + if ( + isinstance(exc, JobException) + and exc.reason in recoverable_states + and run_id < config.recover.retries + and config.recover.mode in ("auto", "fault") + ): + time.sleep(10) + skypilot_main(config, run_id=run_id + 1) + else: + raise + finally: + if llm_job_name is not None: + try: + launcher.stop(llm_job_name) + except Exception as cancel_exc: # pragma: no cover + logger.warning("Failed to cancel LLM server job: %s", cancel_exc) + + +def main(): + config, _ = parse_cli_args(sys.argv[1:]) + skypilot_main(config, run_id=0) + + +if __name__ == "__main__": + main() diff --git a/docs/cli_reference.md b/docs/cli_reference.md index a0c60f956..bdaf64d34 100644 --- a/docs/cli_reference.md +++ b/docs/cli_reference.md @@ -72,6 +72,7 @@ For detailed examples, see the experiment configurations in the `examples/` dire ### Others - [Scheduler Configuration](section-scheduler) +- [SkyPilotLauncher Configuration](section-sky-pilot-launcher) ______________________________________________________________________ @@ -597,15 +598,16 @@ Configuration for cluster specification and distributed computing setup. Configuration for launching the LLM server and trainer processes. -| Parameter | Type | Default | Description | -| ------------------------------- | ----------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------ | -| `inference_server_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for inference server. | -| `inference_server_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for inference server in MB. | -| `trainer_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for training. | -| `trainer_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for training in MB. | -| `inference_server_env_vars` | string | `""` | Environment variables for inference server, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | -| `trainer_env_vars` | string | `""` | Environment variables for training, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | -| `slurm` | [`SlurmLauncherConfig`](section-slurm-launcher) | **Required** | Slurm launcher configuration. | +| Parameter | Type | Default | Description | +| ------------------------------- | ------------------------------------------------------ | ------------ | ------------------------------------------------------------------------------------------------ | +| `inference_server_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for inference server. | +| `inference_server_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for inference server in MB. | +| `trainer_cpus_per_gpu` | integer | `4` | Number of CPUs allocated per GPU for training. | +| `trainer_mem_per_gpu` | integer | `32768` | Memory allocated per GPU for training in MB. | +| `inference_server_env_vars` | string | `""` | Environment variables for inference server, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | +| `trainer_env_vars` | string | `""` | Environment variables for training, separated by commas. Example: 'ENV1=val1,ENV2=val2'. | +| `slurm` | [`SlurmLauncherConfig`](section-slurm-launcher) | **Required** | Slurm launcher configuration. | +| `skypilot` | [`SkyPilotLauncherConfig`](section-sky-pilot-launcher) | **Required** | SkyPilot launcher configuration. | (section-name-resolve)= @@ -756,3 +758,32 @@ Configuration for worker scheduling. Used in the single-controller mode. Experim | `reward_functioncall_config` | `Dict` | **Required** | - | | `reward_model_path` | string | `""` | - | | `reward_model_service_url` | string | `"http://localhost:30000/classify"` | - | + +(section-sky-pilot-launcher)= + +## SkyPilotLauncher Configuration + +Configuration for launching the training jobs with SkyPilot. + +| Parameter | Type | Default | Description | +| ------------------ | -------------- | ------------ | ---------------------------------------------------------------------------------------------------------------- | +| `name` | string \| None | `None` | Optional task name displayed in SkyPilot. | +| `workdir` | string \| None | `None` | Local path or git repo spec to sync as working directory (mirrors SkyPilot YAML workdir). | +| `infra` | string \| None | `None` | Infrastructure spec // or k8s\[/context\] (resources.infra). | +| `accelerator_type` | string \| None | `None` | Accelerator request, e.g. 'H100', 'A100'. Number of GPUs on the node is determined by `cluster.n_gpus_per_node`. | +| `accelerator_args` | string \| None | `None` | Additional accelerator args (YAML/JSON string) (resources.accelerator_args). | +| `use_spot` | boolean | `False` | Whether to use spot/preemptible instances (resources.use_spot). | +| `disk_size` | string \| None | `None` | Boot disk size with optional unit, e.g. '256', '256GB' (resources.disk_size). | +| `disk_tier` | string | `"medium"` | Disk performance tier (resources.disk_tier). **Choices:** `low`, `medium`, `high`, `ultra`, `best` | +| `network_tier` | string | `"standard"` | Network tier (resources.network_tier). **Choices:** `standard`, `best` | +| `ports` | string \| None | `None` | Ports to expose, supports single '8080', range '10052-10100', or comma list (resources.ports). | +| `image_id` | string \| None | `None` | Custom base or docker image id (resources.image_id). | +| `labels` | string \| None | `None` | Instance/pod labels as key=value pairs joined by commas (resources.labels). | +| `any_of` | string \| None | `None` | YAML/JSON string list of candidate resource dicts (resources.any_of). | +| `ordered` | string \| None | `None` | YAML/JSON string list of ordered resource dicts (resources.ordered). | +| `job_recovery` | string \| None | `None` | Job recovery strategy spec (resources.job_recovery). Provide JSON/YAML. | +| `autostop` | string \| None | `None` | Autostop configuration: true/false/10/10h or JSON object (resources.autostop). | +| `envs` | string \| None | `None` | Environment variables (envs) as KEY=VAL pairs joined by commas. | +| `secrets` | string \| None | `None` | Secrets usable in setup/run as KEY=VAL pairs joined by commas (will be redacted). | +| `volumes` | string \| None | `None` | Kubernetes volume mappings (volumes) as YAML/JSON string or shorthand mount spec. | +| `file_mounts` | string \| None | `None` | File mounts mapping remote_path:local_path lines or JSON/YAML string (file_mounts). |