Running third-party schedulers on Together GPU clusters is in beta. The steps and pinned version here (Kueue v0.18.3) are validated on current clusters, but the workflow and defaults may change. Report issues to support@together.ai.
Prerequisites
- A Together Kubernetes GPU cluster in the Ready state.
kubectlconfigured against the cluster. Download credentials withtg beta clusters get-credentials <cluster_id> --set-default-context.- Cluster-admin access. The kubeconfig from the Together CLI grants it.
Install Kueue
Apply the versioned release manifest. Use--server-side because the bundled custom resource definitions are large. For other install methods and configuration options, see the Kueue installation guide:
Define quotas
Kueue admits jobs against quota described by three resources:- ResourceFlavor: a class of nodes. One flavor is enough when your GPU nodes are homogeneous.
- ClusterQueue: the cluster-wide quota pool. It must cover every resource your jobs request, including CPU and memory, or matching jobs are never admitted.
- LocalQueue: a namespaced pointer to a ClusterQueue that users submit jobs to.
kueue-quota.yaml
nominalQuota is the amount of each resource the ClusterQueue can admit at once. Set the GPU quota to the number of GPUs you want this queue to control.
Attach shared storage
Together provisions a static PersistentVolume named after your cluster’s shared volume. Bind a PersistentVolumeClaim to it so queued jobs read and write the same dataset and checkpoints:shared-pvc.yaml
Submit a job to a queue
Point a standardbatch/v1 Job at the LocalQueue with the kueue.x-k8s.io/queue-name label and set suspend: true. Kueue takes over the suspend flag and flips it to false when it admits the job. For other supported workload types (JobSet, RayJob, MPIJob, and more), see running jobs with Kueue:
gpu-job.yaml
Workload object for the job and admits it because six GPUs fit within the eight-GPU quota. The job’s suspend flag flips to false and its pod starts:
Watch quota gate a second job
Submit a second job that also requests six GPUs. Together the two jobs need 12 GPUs, past the eight-GPU quota. Copygpu-job.yaml to a new name (gpu-job-b) and apply it, then compare the two:
Troubleshooting
- A job never leaves
suspend: true: its combined request exceeds the ClusterQueue quota, or the ClusterQueue does not cover one of its resources. Check the Workload’sQuotaReservedcondition message. - The job runs immediately without queueing: the
kueue.x-k8s.io/queue-namelabel is missing or names a LocalQueue that does not exist in the job’s namespace. - The ClusterQueue shows no active quota: its ResourceFlavor is missing or misnamed. The
flavors[].namemust match a ResourceFlavor. - A job requesting only GPUs is never admitted: the ClusterQueue must also cover the CPU and memory the pods request. Add them to
coveredResources.
Next steps
Gang-schedule GPU jobs with Volcano
Run distributed training with all-or-nothing gang scheduling.
Manage GPU clusters
Deploy workloads, attach storage, and access the Kubernetes dashboard.