Two GPUs, One Pool: Ray over Tailscale
A Linux workstation GPU and a Windows consumer GPU, scheduled as one cluster.
The Lab has two GPUs that could not be more different: a workstation NVIDIA card in a Linux box and a consumer GeForce in a Windows one. Different silicon, different operating systems, different subnets. The goal: hand a job to the cluster and not care which GPU runs it.
The fabric is Ray. A head runs on the Linux node; the Windows node joins as a worker. The two only ever talk over the Tailscale backbone, so the cross-subnet, cross-OS mess disappears behind stable tailnet addresses.
It was not free. Ray insists on an exact Python match across nodes, so both ended up pinned to the same interpreter. Ray also guards multi-node Windows behind a flag — and, more subtly, a worker started over a remote shell gets its processes reaped when the shell closes, so the worker has to run under a supervised task that holds it open. Once those were sorted, a six-task GPU job split cleanly: three tasks on the workstation card, three on the GeForce. One pool.
← all posts