Maybe try creating multiple physical seats with logind, and start each compositor on its own seat? A physical seat is a collection of devices like DRM nodes and evdev device files. Also udev creates files in /dev/dri/by-path/, these should be stable across reboots. `udevadm settle` before a compositor start-up can wait for udev to finish its job. Out of curiosity, can you explain your use-case? Why do you need to start multiple compositors, each on its own GPU?