Spec-Zone.ru › PyTorch 2.14

Атрибуты тензора

Создано: 08 мая 2026 | Последнее обновление: 15 июня 2026

Каждый torch.Tensor имеет torch.dtype, torch.device и torch.layout.

torch.dtype

class torch.dtype

torch.dtype — это объект, представляющий тип данных torch.Tensor. PyTorch поддерживает несколько различных типов данных:

Типы данных с плавающей точкой

тип данных

описание

torch.float32 или torch.float

32-разрядное число с плавающей точкой согласно определению в https://en.wikipedia.org/wiki/IEEE_754

torch.float64 или torch.double

64-разрядное число с плавающей точкой согласно определению в https://en.wikipedia.org/wiki/IEEE_754

torch.float16 или torch.half

16-разрядное число с плавающей точкой согласно определению в https://en.wikipedia.org/wiki/IEEE_754, S-E-M 1-5-10

torch.bfloat16

16-разрядное число с плавающей точкой, иногда называемое числом с плавающей точкой Brain, S-E-M 1-8-7

torch.complex32 или torch.chalf

32-разрядное комплексное число с двумя компонентами float16

torch.bcomplex32 [4]

32-разрядное комплексное число с двумя компонентами bfloat16

torch.complex64 или torch.cfloat

64-разрядное комплексное число с двумя компонентами float32

torch.complex128 или torch.cdouble

128-разрядное комплексное число с двумя компонентами float64

torch.float8_e4m3fn [4] [1]

8-разрядное число с плавающей точкой, S-E-M 1-4-3, из https://arxiv.org/abs/2209.05433

torch.float8_e5m2 [4]

8-разрядное число с плавающей точкой, S-E-M 1-5-2, из https://arxiv.org/abs/2209.05433

torch.float8_e4m3fnuz [4] [1]

8-разрядное число с плавающей точкой, S-E-M 1-4-3, из https://arxiv.org/pdf/2206.02915

torch.float8_e5m2fnuz [4] [1]

8-разрядное число с плавающей точкой, S-E-M 1-5-2, из https://arxiv.org/pdf/2206.02915

torch.float8_e8m0fnu [4] [1]

8-разрядное число с плавающей точкой, S-E-M 0-8-0, из https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf

torch.float4_e2m1fn_x2 [4] [1] [3]

упакованное 4-разрядное число с плавающей точкой, S-E-M 1-2-1, из https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf

Целочисленные типы данных

тип данных

описание

torch.uint8

8-разрядное целое число (без знака)

torch.int8

8-разрядное целое число (со знаком)

torch.uint16 [4] [2]

16-разрядное целое число (без знака)

torch.int16 или torch.short

16-разрядное целое число (со знаком)

torch.uint32 [4] [2]

32-разрядное целое число (без знака)

torch.int32 или torch.int

32-разрядное целое число (со знаком)

torch.uint64 [4] [2]

64-разрядное целое число (без знака)

torch.int64 или torch.long

64-разрядное целое число (со знаком)

torch.bool

Логическое значение

[4] (1,2,3,4,5,6,7,8,9,10)

Тип данных shell — это специализированный тип данных с ограниченной поддержкой операций и бэкендов. В частности, поддерживаются операции, создающие тензоры (torch.empty, torch.fill, torch.zeros), и операции, которые не обращаются к отдельным элементам данных (torch.cat, torch.view, torch.reshape). Операции, обращающиеся к отдельным элементам данных, такие как приведение типов, умножение матриц и проверки nan/inf, поддерживаются только в отдельных случаях — в зависимости от степени готовности, наличия ядер с аппаратным ускорением и сформировавшихся вариантов использования.

[1] (1,2,3,4,5)

Суффиксы типов данных «fn», «fnu» и «fnuz» означают: «f» — только конечные значения, без бесконечности; «n» — кодирование значений nan отличается от спецификации IEEE; «uz» — только «беззнаковый ноль», то есть без кодирования отрицательного нуля.

[2] (1,2,3)

В настоящее время для типов без знака, кроме uint8, планируется лишь ограниченная поддержка в eager-режиме (они существуют главным образом для поддержки использования с torch.compile). Если вам нужна поддержка eager-режима и дополнительный диапазон значений не требуется, рекомендуем использовать соответствующие типы со знаком. Подробнее см. pytorch/pytorch#58734.

[3]

Тип данных torch.float4_e2m1fn_x2 представляет собой два 4-разрядных значения, упакованных в один байт. Обратите внимание: операции PyTorch, изменяющие форму/шаги тензора (например, транспонирование), выполняются на границе байта и не распаковывают и не упаковывают повторно значения меньше байта.

Примечание: устаревшие конструкторы, такие как torch.*.FloatTensor, torch.*.DoubleTensor, torch.*.HalfTensor, torch.*.BFloat16Tensor, torch.*.ByteTensor, torch.*.CharTensor, torch.*.ShortTensor, torch.*.IntTensor, torch.*.LongTensor, torch.*.BoolTensor, сохранены только для обратной совместимости, и их больше не следует использовать.

Чтобы определить, является ли torch.dtype типом данных с плавающей точкой, можно использовать свойство is_floating_point. Оно возвращает True, если тип данных является типом с плавающей точкой.

Чтобы определить, является ли torch.dtype комплексным типом данных, можно использовать свойство is_complex. Оно возвращает True, если тип данных является комплексным.

Каждый torch.dtype имеет свойство abbr, возвращающее краткую строку-аббревиатуру типа данных (например, torch.float32.abbr возвращает "f32").

Если типы данных входных значений арифметической операции (add, sub, div, mul) различаются, мы выполняем повышение типа, выбирая минимальный тип данных, удовлетворяющий следующим правилам:

  • Если тип скалярного операнда относится к категории выше, чем категория тензорных операндов (комплексные > с плавающей точкой > целочисленные > логические), тип повышается до типа, размер которого достаточен для хранения всех скалярных операндов этой категории.
  • Если категория операнда-тензора нулевой размерности выше, чем категория операндов с размерностью, тип повышается до типа, размер и категория которого достаточны для хранения всех тензорных операндов нулевой размерности этой категории.
  • Если нет операндов нулевой размерности из категорий выше, тип повышается до типа, размер и категория которого достаточны для хранения всех операндов с размерностью.

Для скалярного операнда с плавающей точкой используется тип данных torch.get_default_dtype(), а для целочисленного скалярного операнда, не являющегося логическим значением, — тип данных torch.int64. В отличие от numpy, при определении минимальных типов данных операнда мы не проверяем значения. Комплексные типы пока не поддерживаются. Правила повышения типов для shell-типов данных не определены.

Примеры повышения типов:

>>> float_tensor = torch.ones(1, dtype=torch.float)
>>> double_tensor = torch.ones(1, dtype=torch.double)
>>> complex_float_tensor = torch.ones(1, dtype=torch.complex64)
>>> complex_double_tensor = torch.ones(1, dtype=torch.complex128)
>>> int_tensor = torch.ones(1, dtype=torch.int)
>>> long_tensor = torch.ones(1, dtype=torch.long)
>>> uint_tensor = torch.ones(1, dtype=torch.uint8)
>>> bool_tensor = torch.ones(1, dtype=torch.bool)
# zero-dim tensors
>>> long_zerodim = torch.tensor(1, dtype=torch.long)
>>> int_zerodim = torch.tensor(1, dtype=torch.int)

>>> torch.add(5, 5).dtype
torch.int64
# 5 is an int64, but does not have higher category than int_tensor so is not considered.
>>> (int_tensor + 5).dtype
torch.int32
>>> (int_tensor + long_zerodim).dtype
torch.int32
>>> (long_tensor + int_tensor).dtype
torch.int64
>>> (bool_tensor + long_tensor).dtype
torch.int64
>>> (bool_tensor + uint_tensor).dtype
torch.uint8
>>> (float_tensor + double_tensor).dtype
torch.float64
>>> (complex_float_tensor + complex_double_tensor).dtype
torch.complex128
>>> (bool_tensor + int_tensor).dtype
torch.int32
# Since long is a different kind than float, result dtype only needs to be large enough
# to hold the float.
>>> torch.add(long_tensor, float_tensor).dtype
torch.float32

Если выходной тензор арифметической операции задан явно, мы допускаем приведение к его типу данных, за исключением следующих случаев:

  • Выходной целочисленный тензор не может принимать тензор с плавающей точкой.
  • Выходной логический тензор не может принимать тензор, не являющийся логическим.
  • Выходной тензор некомплексного типа не может принимать комплексный тензор.

Примеры приведения типов:

# allowed:
>>> float_tensor *= float_tensor
>>> float_tensor *= int_tensor
>>> float_tensor *= uint_tensor
>>> float_tensor *= bool_tensor
>>> float_tensor *= double_tensor
>>> int_tensor *= long_tensor
>>> int_tensor *= uint_tensor
>>> uint_tensor *= int_tensor

# disallowed (RuntimeError: result type can't be cast to the desired output type):
>>> int_tensor *= float_tensor
>>> bool_tensor *= int_tensor
>>> bool_tensor *= uint_tensor
>>> float_tensor *= complex_float_tensor

torch.device

class torch.device

torch.device — это объект, представляющий устройство, на котором torch.Tensor размещён или будет размещён.

torch.device содержит тип устройства (чаще всего «cpu» или «cuda», но также могут использоваться «mps», «xpu», «xla» или «meta») и необязательный порядковый номер устройства для этого типа. Если порядковый номер устройства не указан, этот объект всегда будет представлять текущее устройство данного типа, даже после вызова torch.cuda.set_device(); например, torch.Tensor, созданный с устройством 'cuda', эквивалентен 'cuda:X', где X — результат вызова torch.cuda.current_device().

Доступ к устройству torch.Tensor можно получить через свойство Tensor.device.

torch.device можно создать одним из следующих способов:

  • С помощью строки устройства — строкового представления типа устройства и, при необходимости, его порядкового номера.
  • С помощью типа устройства и его порядкового номера.
  • С помощью порядкового номера устройства; при этом используется текущий тип ускорителя.

С помощью строки устройства:

>>> torch.device('cuda:0')
device(type='cuda', index=0)

>>> torch.device('cpu')
device(type='cpu')

>>> torch.device('mps')
device(type='mps')

>>> torch.device('cuda')  # implicit index is the "current device index"
device(type='cuda')

С помощью типа устройства и его порядкового номера:

>>> torch.device('cuda', 0)
device(type='cuda', index=0)

>>> torch.device('mps', 0)
device(type='mps', index=0)

>>> torch.device('cpu', 0)
device(type='cpu', index=0)

С помощью порядкового номера устройства:

Примечание

Этот метод вызовет RuntimeError, если в данный момент не обнаружен ни один ускоритель.

>>> torch.device(0)  # the current accelerator is cuda
device(type='cuda', index=0)

>>> torch.device(1)  # the current accelerator is xpu
device(type='xpu', index=1)

>>> torch.device(0)  # no current accelerator detected
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: Cannot access accelerator device when none is available.

Объект устройства также можно использовать как менеджер контекста для изменения устройства по умолчанию, на котором размещаются тензоры:

>>> with torch.device('cuda:1'):
...     r = torch.randn(2, 3)
>>> r.device
device(type='cuda', index=1)

Этот менеджер контекста не действует, если фабричной функции передан явный аргумент device, отличный от None. Чтобы изменить устройство по умолчанию глобально, см. также torch.set_default_device().

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

Эта функция немного снижает производительность каждого вызова API torch из Python (а не только фабричных функций). Если это вызывает проблемы, оставьте комментарий в pytorch/pytorch#92701.

Примечание

Аргумент torch.device в функциях обычно можно заменить строкой. Это упрощает быстрое прототипирование кода.

>>> # Example of a function that takes in a torch.device
>>> cuda1 = torch.device('cuda:1')
>>> torch.randn((2,3), device=cuda1)
>>> # You can substitute the torch.device with a string
>>> torch.randn((2,3), device='cuda:1')

Примечание

Методы, принимающие устройство, обычно допускают строку (в правильном формате) или целочисленный порядковый номер устройства; то есть все следующие варианты эквивалентны:

>>> torch.randn((2,3), device=torch.device('cuda:1'))
>>> torch.randn((2,3), device='cuda:1')
>>> torch.randn((2,3), device=1)  # equivalent to 'cuda:1' if the current accelerator is cuda

Примечание

Тензоры никогда не перемещаются между устройствами автоматически: для этого требуется явный вызов со стороны пользователя. Единственное исключение — скалярные тензоры (для которых tensor.dim()==0): при необходимости они автоматически переносятся с CPU на GPU, поскольку эту операцию можно выполнить «бесплатно». Пример:

>>> # two scalars
>>> torch.ones(()) + torch.ones(()).cuda()  # OK, scalar auto-transferred from CPU to GPU
>>> torch.ones(()).cuda() + torch.ones(())  # OK, scalar auto-transferred from CPU to GPU
>>> # one scalar (CPU), one vector (GPU)
>>> torch.ones(()) + torch.ones(1).cuda()  # OK, scalar auto-transferred from CPU to GPU
>>> torch.ones(1).cuda() + torch.ones(())  # OK, scalar auto-transferred from CPU to GPU
>>> # one scalar (GPU), one vector (CPU)
>>> torch.ones(()).cuda() + torch.ones(1)  # Fail, scalar not auto-transferred from GPU to CPU and non-scalar not auto-transferred from CPU to GPU
>>> torch.ones(1) + torch.ones(()).cuda()  # Fail, scalar not auto-transferred from GPU to CPU and non-scalar not auto-transferred from CPU to GPU

torch.layout

class torch.layout

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

Класс torch.layout находится в бета-версии и может измениться.

torch.layout — это объект, представляющий расположение данных torch.Tensor в памяти. В настоящее время поддерживается torch.strided (плотные тензоры), а torch.sparse_coo (разреженные тензоры COO) поддерживается в бета-режиме.

torch.strided представляет плотные тензоры и является наиболее распространённым способом размещения данных в памяти. С каждым тензором со strides связан torch.Storage, в котором хранятся его данные. Такие тензоры предоставляют многомерное представление с шагами хранилища. Шаги — это список целых чисел: k-й шаг задаёт смещение в памяти, необходимое для перехода от одного элемента к следующему в k-м измерении тензора. Благодаря этому понятию многие операции над тензорами можно выполнять эффективно.

Пример:

>>> x = torch.tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> x.stride()
(5, 1)

>>> x.t().stride()
(1, 5)

Дополнительную информацию о тензорах torch.sparse_coo см. в разделе torch.sparse.

torch.memory_format

class torch.memory_format

torch.memory_format — это объект, представляющий формат памяти, в котором torch.Tensor размещён или будет размещён.

Возможные значения:

  • torch.contiguous_format: тензор размещён или будет размещён в плотной памяти без перекрытий. Шаги представлены значениями в порядке убывания.
  • torch.channels_last: тензор размещён или будет размещён в плотной памяти без перекрытий. Шаги представлены значениями в порядке strides[0] > strides[2] > strides[3] > strides[1] == 1, то есть в порядке NHWC.
  • torch.channels_last_3d: тензор размещён или будет размещён в плотной памяти без перекрытий. Шаги представлены значениями в порядке strides[0] > strides[2] > strides[3] > strides[4] > strides[1] == 1, то есть в порядке NDHWC.
  • torch.preserve_format: используется в таких функциях, как clone, для сохранения формата памяти входного тензора. Если входной тензор размещён в плотной памяти без перекрытий, шаги выходного тензора будут скопированы из входного. В противном случае шаги выходного тензора будут соответствовать torch.contiguous_format

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

Spec-Zone.ru

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