torch.Storage
Создано: 30 дек. 2016 г. | Последнее обновление: 06 мая 2026 г.
В PyTorch обычный тензор — это многомерный массив, определяемый следующими компонентами:
- Хранилище (Storage): фактические данные тензора, хранящиеся в виде непрерывного одномерного массива байтов.
-
dtype: тип данных элементов тензора, например torch.float32 или torch.int64. -
shape: кортеж, указывающий размер тензора в каждом измерении. - Шаг (Stride): размер шага, необходимый для перехода от одного элемента к следующему в каждом измерении.
- Смещение (Offset): начальная точка в хранилище, откуда начинаются данные тензора. Для вновь созданных тензоров обычно равно 0.
Вместе эти компоненты определяют структуру и данные тензора: хранилище содержит фактические данные, а остальные компоненты служат метаданными.
API нетипизированного хранилища
torch.UntypedStorage — это непрерывный одномерный массив элементов. Его длина равна количеству байтов тензора. Хранилище служит базовым контейнером данных для тензоров. Как правило, тензор, созданный в PyTorch с помощью обычных конструкторов, таких как zeros(), zeros_like() или new_zeros(), будет иметь взаимно-однозначное соответствие между хранилищем тензора и самим тензором.
Однако одно хранилище может использоваться несколькими тензорами. Например, любое представление тензора (полученное с помощью view() или некоторых, но не всех видов индексирования, таких как целые числа и срезы) будет указывать на то же базовое хранилище, что и исходный тензор. При сериализации и десериализации тензоров, использующих общее хранилище, эта связь сохраняется, и тензоры продолжают указывать на одно и то же хранилище. Примечательно, что десериализация нескольких тензоров, указывающих на одно хранилище, может выполняться быстрее, чем десериализация нескольких независимых тензоров.
Доступ к хранилищу тензора можно получить с помощью метода untyped_storage(). Он возвращает объект типа torch.UntypedStorage. К счастью, у хранилищ есть уникальный идентификатор, доступный через метод torch.UntypedStorage.data_ptr(). В обычных условиях два тензора с одним и тем же хранилищем данных будут иметь одинаковый data_ptr хранилища. Однако сами тензоры могут указывать на два отдельных хранилища: одно для атрибута данных, а другое — для атрибута grad. Каждому из них потребуется собственный data_ptr(). В общем случае нет гарантии, что torch.Tensor.data_ptr() и torch.UntypedStorage.data_ptr() совпадают; не следует исходить из того, что это так.
Нетипизированные хранилища в некоторой степени независимы от построенных на них тензоров. На практике это означает, что тензоры с разными типами данных или формами могут указывать на одно и то же хранилище. Это также означает, что хранилище тензора можно изменить, как показано в следующем примере:
>>> t = torch.ones(3) >>> s0 = t.untyped_storage() >>> s0 0 0 128 63 0 0 128 63 0 0 128 63 [torch.storage.UntypedStorage(device=cpu) of size 12] >>> s1 = s0.clone() >>> s1.fill_(0) 0 0 0 0 0 0 0 0 0 0 0 0 [torch.storage.UntypedStorage(device=cpu) of size 12] >>> # Fill the tensor with a zeroed storage >>> t.set_(s1, storage_offset=t.storage_offset(), stride=t.stride(), size=t.size()) tensor([0., 0., 0.])
Предупреждение
Обратите внимание: непосредственное изменение хранилища тензора, как показано в этом примере, не рекомендуется. Эта низкоуровневая манипуляция приведена исключительно в учебных целях, чтобы продемонстрировать связь между тензорами и их базовыми хранилищами. В общем случае для достижения того же результата эффективнее и безопаснее использовать стандартные методы torch.Tensor, такие как clone() и fill_().
Помимо data_ptr, у нетипизированного хранилища есть и другие атрибуты, например filename (если хранилище указывает на файл на диске), device или is_cuda для проверки устройства. Хранилище также можно изменять на месте или создавать его копии с помощью таких методов, как copy_, fill_ или pin_memory. Дополнительные сведения см. в справочнике API ниже. Помните, что изменение хранилищ — это низкоуровневый API, связанный с рисками! Большинство таких API также существуют на уровне тензоров: если они доступны, им следует отдавать предпочтение перед соответствующими API хранилищ.
Особые случаи
Мы упоминали, что тензор с атрибутом grad, значение которого не равно None, фактически содержит две части данных. В этом случае untyped_storage() вернёт хранилище атрибута data, а хранилище градиента можно получить через tensor.grad.untyped_storage().
>>> t = torch.zeros(3, requires_grad=True) >>> t.sum().backward() >>> assert list(t.untyped_storage()) == [0] * 12 # the storage of the tensor is just 0s >>> assert list(t.grad.untyped_storage()) != [0] * 12 # the storage of the gradient isn't
Существуют также особые случаи, когда у тензоров нет обычного хранилища или хранилища нет вовсе:
- Тензоры на устройстве
"meta": тензоры на устройстве"meta"используются для вывода формы и не содержат фактических данных. - Фиктивные тензоры: другой внутренний инструмент компилятора PyTorch — FakeTensor, основанный на аналогичной идее.
Подклассы тензоров и объекты, подобные тензорам, также могут демонстрировать необычное поведение. В общем случае мы не ожидаем, что многим сценариям использования потребуется работа на уровне Storage!
-
class torch.UntypedStorage(*args, **kwargs)[исходный код] -
-
bfloat16()[исходный код] -
Преобразует это хранилище к типу bfloat16.
-
bool()[исходный код] -
Преобразует это хранилище к типу bool.
-
byte()[исходный код] -
Преобразует это хранилище к типу byte.
-
byteswap(dtype)[исходный код] -
Меняет порядок байтов в базовых данных.
-
char()[исходный код] -
Преобразует это хранилище к типу char.
-
clone()[исходный код] -
Возвращает копию этого хранилища.
-
complex_double()[исходный код] -
Преобразует это хранилище к типу complex double.
-
complex_float()[исходный код] -
Преобразует это хранилище к типу complex float.
-
copy_()
-
cpu()[исходный код] -
Возвращает копию этого хранилища в памяти CPU, если оно ещё не находится в памяти CPU.
-
cuda(device=None, non_blocking=False)[исходный код] -
Возвращает копию этого объекта в памяти CUDA.
Если этот объект уже находится в памяти CUDA на нужном устройстве, копирование не выполняется и возвращается исходный объект.
- Параметры:
- Тип возвращаемого значения:
-
_StorageBase | TypedStorage
-
data_ptr()
-
device: device
-
double()[исходный код] -
Преобразует это хранилище к типу double.
-
element_size()
-
property filename: str | None -
Возвращает имя файла, связанного с этим хранилищем.
Имя файла будет строкой, если хранилище находится на CPU и было создано с помощью
from_file()сsharedв качествеTrue. В противном случае значение этого атрибута —None.
-
fill_()
-
float()[исходный код] -
Преобразует это хранилище к типу float.
-
float8_e4m3fn()[исходный код] -
Преобразует это хранилище к типу float8_e4m3fn
-
float8_e4m3fnuz()[исходный код] -
Преобразует это хранилище к типу float8_e4m3fnuz
-
float8_e5m2()[исходный код] -
Преобразует это хранилище к типу float8_e5m2
-
float8_e5m2fnuz()[исходный код] -
Преобразует это хранилище к типу float8_e5m2fnuz
-
static from_buffer()
-
static from_file(filename, shared=False, nbytes=0) → Storage -
Создаёт хранилище CPU, основанное на файле, отображённом в память.
Если
sharedравноTrue, память является общей для всех процессов. Все изменения записываются в файл. ЕслиsharedравноFalse, изменения в хранилище не влияют на файл.nbytes— это количество байтов хранилища. ЕслиsharedравноFalse, файл должен содержать не менееnbytesбайтов. ЕслиsharedравноTrue, при необходимости файл будет создан. (Обратите внимание, что дляUntypedStorageэтот аргумент отличается от аргументаTypedStorage.from_file.)
-
get_device()[исходный код] -
- Тип возвращаемого значения:
-
half()[исходный код] -
Преобразует это хранилище к типу half.
-
hpu(device=None, non_blocking=False)[исходный код] -
Возвращает копию этого объекта в памяти HPU.
Если этот объект уже находится в памяти HPU на нужном устройстве, копирование не выполняется и возвращается исходный объект.
- Параметры:
- Тип возвращаемого значения:
-
_StorageBase | TypedStorage
-
int()[исходный код] -
Преобразует это хранилище к типу int.
-
property is_cuda
-
property is_hpu
-
is_pinned(device=None)[исходный код] -
Определяет, закреплено ли уже хранилище CPU в памяти устройства.
- Параметры:
-
device (str или torch.device) – устройство, в памяти которого следует закрепить данные (по умолчанию:
None). Использование этого аргумента не рекомендуется; он подлежит устареванию. - Возвращает:
-
Логическое значение.
-
is_sparse: bool = False
-
is_sparse_csr: bool = False
-
long()[исходный код] -
Преобразует это хранилище к типу long.
-
mps()[исходный код] -
Возвращает копию этого хранилища в памяти MPS, если оно ещё не находится в памяти MPS.
-
nbytes()
-
new()
-
pin_memory(device=None)[исходный код] -
Копирует хранилище CPU в закреплённую память, если оно ещё не закреплено.
- Параметры:
-
device (str или torch.device) – устройство, в памяти которого следует закрепить данные (по умолчанию:
None). Использование этого аргумента не рекомендуется; он подлежит устареванию. - Возвращает:
-
Хранилище CPU в закреплённой памяти.
-
resizable()
-
resize_()
-
Перемещает хранилище в разделяемую память.
Операция ничего не делает для хранилищ, уже находящихся в разделяемой памяти, а также для хранилищ CUDA, которые не требуется перемещать для совместного использования между процессами. Хранилища в разделяемой памяти нельзя изменять по размеру.
Обратите внимание: для предотвращения таких проблем, как эта, эту функцию можно безопасно вызывать из нескольких потоков для одного объекта. Однако вызов любой другой функции для self без надлежащей синхронизации НЕ является потокобезопасным. Подробнее см. в разделе Рекомендации по использованию многопроцессности.
Примечание
Когда все ссылки на хранилище в разделяемой памяти удаляются, связанный с ним объект разделяемой памяти также удаляется. В PyTorch предусмотрен специальный процесс очистки, гарантирующий это даже в случае неожиданного завершения текущего процесса.
Следует учитывать разницу между
share_memory_()иfrom_file()сshared = True-
share_memory_использует shm_open(3) для создания объекта разделяемой памяти POSIX, тогда какfrom_file()использует open(2) для открытия имени файла, переданного пользователем. - Оба метода используют вызов mmap(2) с
MAP_SHAREDдля отображения файла/объекта в текущее виртуальное адресное пространство. -
share_memory_вызываетshm_unlink(3)для объекта после его отображения, чтобы гарантировать освобождение объекта разделяемой памяти, когда ни один процесс не держит его открытым.torch.from_file(shared=True)не удаляет файл. Этот файл является постоянным и будет существовать, пока пользователь его не удалит.
- Возвращает:
-
self
-
-
short()[исходный код] -
Преобразует это хранилище к типу short.
-
size()[исходный код] -
- Тип возвращаемого значения:
-
to(*, device, non_blocking=False)[исходный код]
-
tolist()[исходный код] -
Возвращает список, содержащий элементы этого хранилища.
-
type(dtype=None, non_blocking=False)[исходный код] -
- Тип возвращаемого значения:
-
_StorageBase | TypedStorage
-
untyped()[исходный код]
-
Устаревшее типизированное хранилище
Предупреждение
Для понимания исторического контекста: ранее в PyTorch использовались классы типизированного хранилища, которые теперь объявлены устаревшими и которых следует избегать. Ниже описан этот API на случай, если вы с ним столкнётесь, хотя его использование крайне не рекомендуется. В будущем все классы хранилища, кроме torch.UntypedStorage, будут удалены, а во всех случаях будет использоваться torch.UntypedStorage.
torch.Storage — это псевдоним класса хранилища, соответствующего типу данных по умолчанию (torch.get_default_dtype()). Например, если тип данных по умолчанию — torch.float, то torch.Storage соответствует torch.FloatStorage.
Классы torch.<type>Storage и torch.cuda.<type>Storage, такие как torch.FloatStorage, torch.IntStorage и т. д., фактически никогда не создаются как экземпляры. Вызов их конструкторов создаёт объект torch.TypedStorage с соответствующими torch.dtype и torch.device. Классы torch.<type>Storage имеют все те же методы класса, что и torch.TypedStorage.
torch.TypedStorage — это непрерывный одномерный массив элементов определённого torch.dtype. Ему можно задать любой torch.dtype, и внутренние данные будут интерпретироваться соответствующим образом. torch.TypedStorage содержит torch.UntypedStorage, в котором данные хранятся в виде нетипизированного массива байтов.
Каждый тензор torch.Tensor со страйдами содержит torch.TypedStorage, в котором хранятся все данные, просматриваемые тензором torch.Tensor.
-
class torch.TypedStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
bfloat16()[исходный код] -
Преобразует это хранилище к типу bfloat16.
-
bool()[исходный код] -
Преобразует это хранилище к типу bool.
-
byte()[исходный код] -
Преобразует это хранилище к типу byte.
-
char()[исходный код] -
Преобразует это хранилище к типу char.
-
clone()[исходный код] -
Возвращает копию этого хранилища.
-
complex_double()[исходный код] -
Преобразует это хранилище к типу complex double.
-
complex_float()[исходный код] -
Преобразует это хранилище к типу complex float.
-
copy_(source, non_blocking=None)[исходный код]
-
cpu()[исходный код] -
Возвращает копию этого хранилища на CPU, если оно ещё не находится в памяти CPU.
-
cuda(device=None, non_blocking=False)[исходный код] -
Возвращает копию этого объекта в памяти CUDA.
Если этот объект уже находится в памяти CUDA на нужном устройстве, копирование не выполняется и возвращается исходный объект.
- Параметры:
- Тип возвращаемого значения:
-
Self
-
data_ptr()[исходный код]
-
property device
-
double()[исходный код] -
Преобразует это хранилище к типу double.
-
dtype: dtype
-
element_size()[исходный код]
-
property filename: str | None -
Возвращает имя файла, связанного с этим хранилищем, если оно было создано с помощью отображения файла в память, или
None, если хранилище не было создано таким способом.
-
fill_(value)[исходный код]
-
float()[исходный код] -
Преобразует это хранилище к типу float.
-
float8_e4m3fn()[исходный код] -
Преобразует это хранилище к типу float8_e4m3fn
-
float8_e4m3fnuz()[исходный код] -
Преобразует это хранилище к типу float8_e4m3fnuz
-
float8_e5m2()[исходный код] -
Преобразует это хранилище к типу float8_e5m2
-
float8_e5m2fnuz()[исходный код] -
Преобразует это хранилище к типу float8_e5m2fnuz
-
classmethod from_buffer(*args, **kwargs)[исходный код]
-
classmethod from_file(filename, shared=False, size=0) → Storage[исходный код] -
Создаёт хранилище CPU, размещённое в файле, отображённом в память.
Если
sharedравноTrue, память совместно используется всеми процессами. Все изменения записываются в файл. ЕслиsharedравноFalse, изменения в хранилище не влияют на файл.size— количество элементов в хранилище. ЕслиsharedравноFalse, файл должен содержать не менееsize * sizeof(Type)байт (Type— тип хранилища). ЕслиsharedравноTrue, файл будет создан при необходимости.
-
get_device()[исходный код] -
- Тип возвращаемого значения:
-
half()[исходный код] -
Преобразует это хранилище к типу half.
-
hpu(device=None, non_blocking=False)[исходный код] -
Возвращает копию этого объекта в памяти HPU.
Если этот объект уже находится в памяти HPU на нужном устройстве, копирование не выполняется и возвращается исходный объект.
- Параметры:
- Тип возвращаемого значения:
-
Self
-
int()[исходный код] -
Преобразует это хранилище к типу int.
-
property is_cuda
-
property is_hpu
-
is_pinned(device=None)[исходный код] -
Определяет, закреплено ли уже типизированное хранилище CPU в памяти устройства.
- Параметры:
-
device (str или torch.device) – Устройство, на котором следует закрепить память (по умолчанию:
None). Использование этого аргумента не рекомендуется; он объявлен устаревшим. - Возвращает:
-
Логическое значение.
-
is_sparse: bool = False
-
long()[исходный код] -
Преобразует это хранилище к типу long.
-
nbytes()[исходный код]
-
pickle_storage_type()[исходный код]
-
pin_memory(device=None)[исходный код] -
Копирует типизированное хранилище CPU в закреплённую память, если оно ещё не закреплено.
- Параметры:
-
device (str или torch.device) – Устройство, на котором следует закрепить память (по умолчанию:
None). Использование этого аргумента не рекомендуется; он объявлен устаревшим. - Возвращает:
-
Закреплённое хранилище CPU.
-
resizable()[исходный код]
-
resize_(size)[исходный код]
-
short()[исходный код] -
Преобразует это хранилище к типу short.
-
size()[исходный код]
-
to(*, device, non_blocking=False)[исходный код] -
Возвращает копию этого объекта в памяти устройства.
Если этот объект уже находится на нужном устройстве, копирование не выполняется и возвращается исходный объект.
-
tolist()[исходный код] -
Возвращает список, содержащий элементы этого хранилища.
-
type(dtype=None, non_blocking=False)[исходный код] -
Возвращает тип, если
dtypeне задан; в противном случае преобразует этот объект к указанному типу.Если объект уже имеет нужный тип, копирование не выполняется и возвращается исходный объект.
- Параметры:
-
- dtype (type или строка) – Требуемый тип
-
non_blocking (bool) – Если
True, а источник находится в закреплённой памяти и целевое устройство — GPU, или наоборот, копирование выполняется асинхронно относительно хоста. В противном случае аргумент не влияет на результат. -
**kwargs – Для совместимости может содержать ключ
asyncвместо аргументаnon_blocking. Аргументasyncобъявлен устаревшим.
- Тип возвращаемого значения:
-
_StorageBase | TypedStorage | str
-
untyped()[исходный код] -
Возвращает внутреннее
torch.UntypedStorage.
-
-
class torch.DoubleStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.float64
-
-
class torch.FloatStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.float32
-
-
class torch.HalfStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.float16
-
-
class torch.LongStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.int64
-
-
class torch.IntStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.int32
-
-
class torch.ShortStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.int16
-
-
class torch.CharStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.int8
-
-
class torch.ByteStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.uint8
-
-
class torch.BoolStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.bool
-
-
class torch.BFloat16Storage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.bfloat16
-
-
class torch.ComplexDoubleStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.complex128
-
-
class torch.ComplexFloatStorage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.complex64
-
-
class torch.QUInt8Storage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.quint8
-
-
class torch.QInt8Storage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.qint8
-
-
class torch.QInt32Storage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.qint32
-
-
class torch.QUInt4x2Storage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.quint4x2
-
-
class torch.QUInt2x4Storage(*args, wrap_storage=None, dtype=None, device=None, _internal=False)[исходный код] -
-
dtype: torch.dtype = torch.quint2x4
-
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/storage.html