Функция cuda.manual_seed_all
Функция cuda.manual_seed_all устанавливает начальное зерно для генератора случайных чисел на всех доступных устройствах CUDA. Это необходимо для обеспечения воспроизводимости результатов при использовании нескольких графических процессоров. Функция принимает одно целочисленное значение в качестве зерна и применяет его ко всем устройствам CUDA, которые видны PyTorch.
Синтаксис
torch.cuda.manual_seed_all(seed)
В качестве параметра ⁅i⁆seed⁅/i⁆ передаётся целое число, которое будет использоваться как начальное состояние для генератора случайных чисел на всех GPU.
Пример
Давайте зафиксируем зерно для всех доступных видеокарт и сгенерируем случайные тензоры на разных устройствах:
import torch
torch.cuda.manual_seed_all(42)
if torch.cuda.is_available():
t1 = torch.rand(3, device='cuda:0')
t2 = torch.rand(3, device='cuda:0')
print(t1)
print(t2)
Результат выполнения кода (при наличии хотя бы одного GPU):
tensor([0.8823, 0.9150, 0.3829], device='cuda:0')
tensor([0.9593, 0.3904, 0.6009], device='cuda:0')
Пример
Покажем, что установка зерна через cuda.manual_seed_all гарантирует одинаковые последовательности случайных чисел на всех устройствах, если их запустить с одним и тем же зерном:
import torch
if torch.cuda.device_count() >= 2:
torch.cuda.manual_seed_all(123)
t1 = torch.rand(3, device='cuda:0')
t2 = torch.rand(3, device='cuda:1')
print(t1)
print(t2)
Результат выполнения кода:
tensor([0.2961, 0.5166, 0.2517], device='cuda:0')
tensor([0.2961, 0.5166, 0.2517], device='cuda:1')
Как видно, тензоры на обоих устройствах получились одинаковыми, так как зерно было установлено для всех GPU.
Пример
Если не вызвать cuda.manual_seed_all, то на разных устройствах последовательности будут различаться. Сравним поведение:
import torch
if torch.cuda.device_count() >= 2:
t1 = torch.rand(3, device='cuda:0')
t2 = torch.rand(3, device='cuda:1')
print(t1)
print(t2)
Результат выполнения кода (будет различаться при каждом запуске):
tensor([0.7632, 0.1285, 0.6718], device='cuda:0')
tensor([0.6311, 0.9114, 0.8721], device='cuda:1')
В этом случае случайные последовательности на разных GPU независимы и невоспроизводимы.
Смотрите также
-
функцию
manual_seed,
которая устанавливает зерно для CPU -
функцию
cuda.manual_seed,
которая устанавливает зерно для одного GPU (текущего устройства) -
функцию
seed,
которая устанавливает случайное зерно для CPU -
функцию
get_rng_state,
которая возвращает состояние генератора случайных чисел для CPU