Skip to content

launch.yaml

launch.yaml configures one job. launch validate checks a file and prints every refusal with its path. It exits 64 if there is any. The JSON Schema is published beside this page.

An unknown key at any level is refused, and so is a key in another case. version must be 1, and the file needs a train section, a serve section or both. launch train refuses a file without train, and launch serve one without serve.

train

Key Default Meaning
command required Run verbatim on every rank.
procsPerNode the scheduler's Ranks per node. Absent, it comes from PET_NPROC_PER_NODE or SLURM_NTASKS_PER_NODE, and the launcher refuses to start if neither is set.
rendezvous.port 0 Slurm only. 0 picks a free port for the job.
rendezvous.resumePort 0 Kubeflow only. 0 means PET_MASTER_PORT + 1.
rendezvous.joinTimeout 10m How long nodes wait for the resume point.
env none Added to every rank's environment. Names under LAUNCH_ and DISPATCH_ are refused.

checkpoint

Optional. Without it there is no resume and no publication.

Key Default Meaning
root required An absolute path or an s3:// URL.
framework required hf or dcp: how publish watch decides a save is complete.
resumeFlag none Appended to train.command with the path when a resume point exists.
publish publish, or /opt/dispatch/publish on Kubeflow The helper's path.
creds none s3:// roots only. ${DUNSCAITH_S3_CREDS} is the only interpolation in the file, and it must be the whole value.

signal

Key Default Meaning
grace the kill window The most the payload is given after a signal, in whole seconds. 0s says no save is wanted.

heartbeat

Optional. Without it there is no hang detection beyond NCCL's own.

Key Default Meaning
timeout 5m The longest gap between beats in phase train. It must be below NCCL's timeout, which is 10 minutes unless ncclTimeout says otherwise.
startup 45m The longest wait for the first beat.
ncclTimeout none The process-group timeout, for a payload that sets its own.
phases none A timeout per named phase. train is refused, because timeout already times it.

gpu

Key Default Meaning
health optional required refuses with 64 when NVML can't start or shows no GPUs, and needs the launch-nvml build. Under Slurm the coordinator's node makes that check too, so its step must be able to see a GPU. optional reads NVML where it can and reports absent otherwise. off reads nothing and doesn't load the library.

serve

Key Default Meaning
command required How to start vLLM, such as [vllm, serve].
model.name, model.path required The base model and the name it is served under. A comma is refused in the name.
adapters none Startup LoRA adapters, name to path. A comma or = is refused in a name, and so is the base model's name.
lora.runtime false Allow POST /v1/load_lora_adapter.
lora.maxLoras vLLM's LoRAs per batch.
lora.maxLoraRank vLLM's One of 1, 8, 16, 32, 64, 128, 256, 320 or 512.
lora.maxCpuLoras vLLM's CPU slots, no fewer than maxLoras.
env none Added to vLLM's environment. Refused: names that aren't shell identifiers, LAUNCH_ and DISPATCH_ names, and VLLM_ALLOW_RUNTIME_LORA_UPDATING, which lora.runtime owns.
port 8000 The loopback port.
ready.timeout 20m How long to wait for vLLM to become ready.
ready.interval 5s How often to check.
stopGrace 30s How long vLLM gets after SIGTERM before SIGKILL.

Flags the launcher owns

A URL with userinfo, a query string or a fragment, or with an @ anywhere later in the value, even after a space, is refused in serve.command, serve.model and serve.adapters, names as well as paths, including inside an argument such as --model=URL, because each reaches the manifest's exact argv. A URL that needs no credential but has a query string is refused too, since the launcher can't tell them apart. The @ rule deliberately over-refuses: a legitimate @ in a path or query must be percent-encoded, as %40.

That can't catch a credential passed as a bare flag, such as --api-key secret, which looks like any other flag and is recorded as written. Give vLLM its API key in the environment instead, as VLLM_API_KEY, with serve.env or inherited: the manifest records that variable as ***. Of the rest of the environment only VLLM_* variables reach the manifest, and a value there is masked only where go/redact recognises a credential by its shape, so don't put any other secret in a VLLM_* variable.

These are refused in serve.command: --host, --port, --served-model-name, --enable-lora, --lora-modules, --max-loras, --max-lora-rank and --max-cpu-loras. They are matched the way vLLM's parser reads them, so --max_loras and the abbreviation --served-model are refused too.

--config is refused outright. Its contents would be flags the launcher never sees, so put them in serve.command, where they are checked and recorded.