Spec-Zone.ru › PyTorch 2.14

Generator

class torch.Generator
clone_state() → torch.Generator

Клонирует текущее состояние генератора и возвращает новый генератор, указывающий на это клонированное состояние. Этот метод полезен для сохранения определённого состояния генератора, чтобы восстановить его позднее.

Возвращает:

Generator, указывающий на вновь клонированное состояние.

Тип возвращаемого значения:

torch.Generator

Пример

>>> g_cuda = torch.Generator(device='cuda')
>>> cloned_state = g_cuda.clone_state()
device

Generator.device -> device

Возвращает текущее устройство генератора.

Пример:

>>> g_cpu = torch.Generator()
>>> g_cpu.device
device(type='cpu')
get_state() → Tensor

Возвращает состояние Generator в виде torch.ByteTensor.

Возвращает:

torch.ByteTensor, содержащий все необходимые данные для восстановления Generator до определённого момента времени.

Тип возвращаемого значения:

Tensor

Пример:

>>> g_cpu = torch.Generator()
>>> g_cpu.get_state()
graphsafe_get_state() → torch.Generator

Получает текущее состояние генератора способом, безопасным для захвата графа. Этот метод необходим для обеспечения возможности захвата состояния генератора в граф CUDA.

Возвращает:

Generator, указывающий на текущее состояние генератора.

Тип возвращаемого значения:

torch.Generator

Пример

>>> g_cuda = torch.Generator(device='cuda')
>>> current_state = g_cuda.graphsafe_get_state()
graphsafe_set_state(state) → None

Задаёт состояние генератора указанным состоянием способом, безопасным для использования при захвате графа. Этот метод необходим для обеспечения возможности захвата состояния генератора в граф CUDA.

Параметры:

state (torch.Generator) – Generator, указывающий на новое состояние генератора; обычно его получают с помощью graphsafe_get_state.

Пример

>>> g_cuda = torch.Generator(device='cuda')
>>> g_cuda_other = torch.Generator(device='cuda')
>>> current_state = g_cuda_other.graphsafe_get_state()
>>> g_cuda.graphsafe_set_state(current_state)
initial_seed() → int

Возвращает начальное значение seed для генерации случайных чисел.

Пример:

>>> g_cpu = torch.Generator()
>>> g_cpu.initial_seed()
2147483647
manual_seed(seed) → Generator

Задаёт значение seed для генерации случайных чисел. Возвращает объект torch.Generator. В качестве значения seed подходит любое 32-битное целое число.

Параметры:

seed (int) – Требуемое значение seed. Значение должно находиться в включительном диапазоне [-0x8000_0000_0000_0000, 0xffff_ffff_ffff_ffff]. В противном случае будет вызвано исключение RuntimeError. Отрицательные значения преобразуются в положительные по формуле 0xffff_ffff_ffff_ffff + seed.

Возвращает:

Объект torch.Generator.

Тип возвращаемого значения:

Generator

Пример:

>>> g_cpu = torch.Generator()
>>> g_cpu.manual_seed(2147483647)
philox_state(increment) → tuple[Tensor, Tensor, Tensor]

Резервирует значения increment из потока Philox4x32-10 этого генератора и возвращает зарезервированную позицию в виде (seed, offset, intragraph_offset), трёх тензоров int64 с одним элементом. Это тот же протокол резервирования, который используют встроенные случайные CUDA-ядра (PhiloxCudaState в C++), поэтому созданные на его основе ядра получают значения из того же потока и совместно работают со встроенными случайными операциями. Этот метод поддерживается только генераторами на основе Philox (в настоящее время — CUDA).

Что даёт резервирование. При effective_offset = (uint64(offset) + uint64(intragraph_offset)) % 2**64 (оба операнда предварительно интерпретируются обратно из int64 как uint64; см. ниже) вызывающий код получает во владение значения счётчика Philox effective_offset / 4 — effective_offset / 4 + ceil(increment / 4) - 1 (счётчик увеличивается один раз на каждые 4 сгенерированных значения) при фиксированном seed для каждой подпоследовательности. Следуя соглашению встроенных ядер — одна подпоследовательность на поток (curand_init(seed, subsequence, effective_offset, ...), где счётчик занимает counter.x/y, а подпоследовательность — counter.z/w), поток может сгенерировать до increment значений, округлённых вверх до ближайшего числа, кратного 4. Смещение генератора увеличивается на это округлённое значение, поэтому increment должно быть не меньше числа 32-битных значений, генерируемых любым отдельным потоком использующего ядра.

Интерпретация int64. Seed и смещение — это беззнаковые 64-битные величины, возвращаемые побитно точно в тензорах int64 (тензоры PyTorch не поддерживают арифметику uint64); значения, равные 2**63 или превышающие его, отображаются как отрицательные. Ядрам следует повторно интерпретировать биты как uint64 (например, загрузить как int64 и выполнить bitcast); для проверки на стороне хоста используйте .item() & (2**64 - 1). При увеличении смещение циклически переходит по модулю 2**64.

Захват графа. Два режима возврата соответствуют протоколу C++ PhiloxCudaState. Вне захвата (HostState) seed и offset — это тензоры CPU, содержащие текущие значения; .item() выполняется быстро и не вызывает синхронизацию, поэтому вызывающий код передаёт значения в качестве скалярных аргументов ядра. Во время захвата (DevState, внутри torch.accelerator.Graph или torch.cuda.CUDAGraph) seed и offset — это тензоры CUDA, ссылающиеся на состояние генератора; при каждом повторном воспроизведении в них записываются значения, актуальные на этот момент, поэтому ядра должны считывать их из памяти устройства во время выполнения. intragraph_offset всегда является тензором CPU: вне захвата он содержит 0, а во время захвата — позицию этого резервирования внутри графа. Вызывающий код выбирает ветвь в зависимости от состояния захвата (например, используя torch.cuda.is_current_stream_capturing() или устройство возвращённых тензоров), так же как встроенные ядра выбирают ветвь на основе PhiloxCudaState с помощью at::cuda::philox::unpack.

Предупреждение

Тензоры, возвращённые во время захвата, ссылаются на состояние захвата: их содержимое не определено до первого повторного воспроизведения, и их нельзя использовать после уничтожения графа.

Параметры:

increment (int) – Число выходных значений Philox для резервирования. Должно быть неотрицательным и не превышать 2**64 - 1; смещение, на которое оно увеличивается, циклически переходит по модулю 2**64 (при захвате графа, когда внутреннее смещение графа начинается с 0, суммарное число зарезервированных значений в одном графе должно быть меньше 2**64).

Возвращает:

(seed, offset, intragraph_offset), каждый из которых является тензором int64 с одним элементом. seed и offset содержат seed генератора и позицию зарезервированного участка потока в виде битов uint64 (тензоры CPU вне захвата, тензоры CUDA, ссылающиеся на состояние генератора, во время захвата); intragraph_offset всегда является тензором CPU, содержащим позицию этого резервирования внутри захватываемого графа (вне захвата — 0).

Тип возвращаемого значения:

tuple[Tensor, Tensor, Tensor]

Пример

>>> g_cuda = torch.Generator(device='cuda')
>>> seed, offset, intragraph = g_cuda.philox_state(4)
seed() → int

Получает недетерминированное случайное число из std::random_device или текущего времени и использует его в качестве seed для Generator.

Пример:

>>> g_cpu = torch.Generator()
>>> g_cpu.seed()
1516516984916
set_state(new_state) → void

Задаёт состояние Generator.

Параметры:

new_state (torch.ByteTensor) – Требуемое состояние.

Пример:

>>> g_cpu = torch.Generator()
>>> g_cpu_other = torch.Generator()
>>> g_cpu.set_state(g_cpu_other.get_state())

© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.Generator.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API