Устройство meta
Создано: 17 июн. 2025 | Последнее обновление: 17 июн. 2025
Устройство «meta» — это абстрактное устройство, обозначающее тензор, который содержит только метаданные, но не фактические данные. У тензоров meta есть два основных варианта использования:
- Модели можно загружать на устройство meta, что позволяет загрузить представление модели, не загружая фактические параметры в память. Это может быть полезно, если перед загрузкой фактических данных необходимо преобразовать модель.
- Большинство операций можно выполнять над тензорами meta, получая новые тензоры meta, описывающие результат, который был бы получен при выполнении операции над реальным тензором. Это позволяет проводить абстрактный анализ, не тратя время на вычисления и место на хранение фактических тензоров. Поскольку тензоры meta не содержат реальных данных, для них нельзя выполнять операции, зависящие от данных, например
torch.nonzero()илиitem(). В некоторых случаях выходные метаданные операции различаются для разных типов устройств (например, CPU и CUDA); в таких ситуациях мы обычно предпочитаем точное представление поведения CUDA.
Предупреждение
Хотя в теории вычисления с тензорами meta всегда должны выполняться быстрее, чем аналогичные вычисления на CPU/CUDA, многие реализации операций с тензорами meta написаны на Python и не были перенесены на C++ для повышения скорости. Поэтому задержка работы фреймворка с небольшими тензорами CPU может оказаться меньше.
Типичные приемы работы с тензорами meta
Объект можно загрузить на устройство meta с помощью torch.load(), указав map_location='meta':
>>> torch.save(torch.randn(2), 'foo.pt')
>>> torch.load('foo.pt', map_location='meta')
tensor(..., device='meta', size=(2,))
Если у вас есть произвольный код, создающий тензоры без явного указания устройства, можно переопределить его так, чтобы тензоры создавались на устройстве meta, используя менеджер контекста torch.device():
>>> with torch.device('meta'):
... print(torch.randn(30, 30))
...
tensor(..., device='meta', size=(30, 30))
Это особенно полезно при создании модулей NN, когда обычно невозможно явно передать устройство для инициализации:
>>> from torch.nn.modules import Linear
>>> with torch.device('meta'):
... print(Linear(20, 30))
...
Linear(in_features=20, out_features=30, bias=True)
Нельзя напрямую преобразовать тензор meta в тензор CPU/CUDA, поскольку тензор meta не хранит данных, и мы не знаем, какими должны быть значения данных в новом тензоре:
>>> torch.ones(5, device='meta').to("cpu")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NotImplementedError: Cannot copy out of meta tensor; no data!
Используйте фабричную функцию, например torch.empty_like(), чтобы явно указать, чем заполнить отсутствующие данные.
Для модулей NN предусмотрен вспомогательный метод torch.nn.Module.to_empty(), который позволяет переместить модуль на другое устройство, оставив все параметры неинициализированными. Затем параметры необходимо явно инициализировать вручную:
>>> from torch.nn.modules import Linear
>>> with torch.device('meta'):
... m = Linear(20, 30)
>>> m.to_empty(device="cpu")
Linear(in_features=20, out_features=30, bias=True)
torch._subclasses.meta_utils содержит недокументированные утилиты для преобразования произвольного тензора в эквивалентный тензор meta с высокой точностью. Эти API являются экспериментальными и могут быть изменены в любой момент с нарушением обратной совместимости.
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/meta.html