Функция cuda.manual_seed
Функция cuda.manual_seed устанавливает начальное значение (зерно) для генератора случайных чисел на текущем устройстве CUDA. Она принимает одно целочисленное значение в качестве параметра и инициализирует состояние генератора на активном GPU. Эта функция полезна для получения воспроизводимых результатов при генерации случайных тензоров на видеокарте, особенно в сочетании с функцией manual_seed для CPU.
Синтаксис
torch.cuda.manual_seed(seed)
Параметр seed - целое число, которое задаёт начальное состояние генератора случайных чисел. Оно может быть любым значением типа int.
Пример
Давайте зафиксируем зерно на GPU и сгенерируем два случайных тензора с помощью функции rand:
import torch
torch.cuda.manual_seed(42)
t1 = torch.rand(3, device='cuda')
print(t1)
t2 = torch.rand(3, device='cuda')
print(t2)
Результат выполнения кода:
tensor([0.8823, 0.9150, 0.3829], device='cuda:0')
tensor([0.9593, 0.3904, 0.6009], device='cuda:0')
При повторном запуске кода с тем же зерном значения тензоров будут полностью совпадать.
Пример
Покажем, как функция cuda.manual_seed работает совместно с manual_seed для обеспечения полной воспроизводимости на CPU и GPU:
import torch
seed = 123
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
t_cpu = torch.rand(2)
t_gpu = torch.rand(2, device='cuda')
print(t_cpu)
print(t_gpu)
Результат выполнения кода:
tensor([0.2961, 0.5166])
tensor([0.0728, 0.6470], device='cuda:0')
Пример
Если у вас несколько видеокарт, то для установки зерна на всех устройствах используется функция cuda.manual_seed_all, однако cuda.manual_seed влияет только на текущее активное устройство. Продемонстрируем это на примере с двумя GPU:
import torch
torch.cuda.manual_seed(456)
t_gpu_0 = torch.rand(3, device='cuda:0')
# Если доступно второе устройство, зерно для него остаётся случайным
if torch.cuda.device_count() > 1:
t_gpu_1 = torch.rand(3, device='cuda:1')
print(t_gpu_1)
print(t_gpu_0)
Результат выполнения кода:
tensor([0.7956, 0.7455, 0.4202], device='cuda:0')
Чтобы гарантировать воспроизводимость на всех видеокартах, используйте функцию cuda.manual_seed_all.
Смотрите также
-
функцию
manual_seed,
которая устанавливает зерно для генератора на CPU -
функцию
cuda.manual_seed_all,
которая устанавливает зерно для всех доступных устройств CUDA -
функцию
seed,
которая инициализирует генератор случайным зерном на основе системного времени -
функцию
initial_seed,
которая возвращает текущее значение зерна для генератора на CPU