Running third-party schedulers on Together GPU clusters is in beta. The steps and pinned version here (Volcano v1.15.0) are validated on current clusters, but the workflow and defaults may change. Report issues through the support form.
Requirements
- A Together Kubernetes GPU cluster in the Ready state.
- Cluster-admin access, which the cluster’s admin kubeconfig grants. Only project admins can download the admin kubeconfig.
kubectlconfigured against the cluster. Download the admin kubeconfig withtg clusters get-credentials <CLUSTER_ID> --set-default-context --no-json.
nvidia.com/gpu count in the GPU column. The NVIDIA device plugin that exposes this resource is preinstalled on Together clusters.
Install Volcano
Install the scheduler, controllers, and custom resource definitions from the versioned release manifest:Running or Completed:
default queue automatically. List the queues to confirm it exists:
Create a queue
A queue is the unit Volcano uses to divide cluster capacity between teams or workloads. Create a queue namedresearch whose jobs can use at most eight GPUs at once:
research-queue.yaml
capabilityis the hard upper bound on resources the queue’s jobs can use at once.weightsets the queue’s share of cluster resources relative to other queues when capacity is contended.reclaimable: truelets other queues reclaim resources the queue uses beyond its fair share.
Attach shared storage
To give every worker the same dataset and checkpoints, bind a PersistentVolumeClaim to your cluster’s shared volume. Together provisions a static PersistentVolume named after the shared volume, so setvolumeName to your shared volume’s name:
shared-pvc.yaml
Run a gang-scheduled job
A VolcanoJob (vcjob) wraps a set of tasks and enforces gang scheduling through minAvailable. The scheduler admits the job only once it can place at least minAvailable pods together.
The following job runs four workers with two GPUs each, for eight GPUs in total. Every worker mounts the shared volume at /mnt/shared:
gpu-gang-job.yaml
schedulerName: volcanoroutes the pods to Volcano instead of the default Kubernetes scheduler.minAvailable: 4means all four workers start together or none do.queue: researchdraws resources from the queue you created in Create a queue.claimName: shared-pvcmounts the claim you bound in Attach shared storage.
Running:
PodGroup. Inspect it and the job’s pods:
nvidia-smi -L on startup. Check a worker’s log to confirm it sees its two GPUs:
ReadWriteMany volume, so a file that one worker writes is visible to the others. To confirm, create a file from one worker and list it from another:
Verify all-or-nothing behavior
Gang scheduling matters most when a job cannot fit. Delete the running job, then submit one that requests more GPUs than the cluster has (eight workers at two GPUs each is 16 GPUs, past this cluster’s 8):minAvailable to 8 and replicas to 8 in the manifest and reapply. The job stays Pending and, critically, no pods run. The default scheduler would start as many as fit and strand the rest. Volcano keeps the whole group pending:
PodGroup sits in the Inqueue phase until enough resources free up to admit the entire gang.
Route other workloads to Volcano
Any pod, Deployment, or third-party job type can use Volcano by settingschedulerName: volcano in its pod template. This is how you schedule multi-node training launched through the MPI Operator. The MPI Operator isn’t installed on every cluster, so check for it with kubectl get crd mpijobs.kubeflow.org and install it if it’s missing. For gang guarantees on those workloads, create a PodGroup and reference it from the pods. See the Volcano documentation.
Troubleshooting
- Pods stay
Pendingand thePodGroupisInqueue: The queue can’t fitminAvailablepods at once. LowerminAvailable, raise the queue’scapability, or wait for other jobs to release GPUs. - Pods schedule on the default scheduler instead of Volcano:
schedulerName: volcanois missing from the pod template. On avcjob, set it underspec. - Job rejected right after you install Volcano: The Volcano admission webhook may still be starting. Confirm that the
volcano-admissionpod isRunningin thevolcano-systemnamespace, then reapply. - Job rejected with a queue error: The queue the job names doesn’t exist, isn’t
Open, or isn’t a leaf queue. Check it withkubectl get queue.
Next steps
Queue GPU jobs with Kueue
Gate GPU jobs on quota with a Kubernetes-native queueing controller.
Run workloads on Kubernetes
Deploy pods with persistent storage and monitor them with Grafana.