Spec-Zone.ru › PyTorch 2

TorchDynamo-based ONNX Exporter

  • Обзор
  • Зависимости
  • Простой пример
  • Просмотр ONNX модели с помощью графического интерфейса
  • Диагностика проблем с SARIF
  • Справочник по API

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

Экспортер ONNX для TorchDynamo — это быстро развивающаяся бета-технология.

Обзор

Экспортер ONNX использует движок TorchDynamo для подключения к API оценки фреймов Python и динамического переписывания его байткода в граф FX. Полученный граф FX затем дорабатывается, прежде чем окончательно преобразуется в граф ONNX.

Основное преимущество этого подхода заключается в том, что граф FX определяется с помощью анализа байткода, сохраняющего динамическую природу модели, вместо использования традиционных статических методов прослеживания.

Экспортер разработан как модульный и расширяемый. Он состоит из следующих компонентов:

  • Экспортер ONNX: Exporter главный класс, который организует процесс экспорта.
  • Параметры экспорта ONNX: ExportOptions имеет набор параметров, которые контролируют процесс экспорта.
  • Реестр ONNX: OnnxRegistry — это реестр операторов и функций ONNX.
  • Экстрактор графа FX: FXGraphExtractor извлекает граф FX из модели PyTorch.
  • Режим имитации: ONNXFakeContext — это контекстный менеджер, который активирует режим имитации для моделей большого размера.
  • Выход экспорта ONNX: ExportOutput — это выход экспортера, содержащий экспортированный граф ONNX и диагностическую информацию.
  • Сериализатор вывода ONNX экспорта: ExportOutputSerializer сериализует экспортированную модель в файл.
  • Параметры диагностики ONNX: DiagnosticOptions имеет набор параметров, которые контролируют диагностику, выводимую экспортером.

Зависимости

Экспортер ONNX зависит от дополнительных пакетов Python:

  • ONNX
  • ONNX Script

Их можно установить через pip:

pip install --upgrade onnx onnxscript

Простой пример

Ниже представлен пример использования API экспортера с простой многослойной перцептронной сетью (MLP):

import torch

class MLPModel(nn.Module):
  def __init__(self):
      super().__init__()
      self.fc0 = nn.Linear(8, 8, bias=True)
      self.fc1 = nn.Linear(8, 4, bias=True)
      self.fc2 = nn.Linear(4, 2, bias=True)
      self.fc3 = nn.Linear(2, 2, bias=True)

  def forward(self, tensor_x: torch.Tensor):
      tensor_x = self.fc0(tensor_x)
      tensor_x = torch.sigmoid(tensor_x)
      tensor_x = self.fc1(tensor_x)
      tensor_x = torch.sigmoid(tensor_x)
      tensor_x = self.fc2(tensor_x)
      tensor_x = torch.sigmoid(tensor_x)
      output = self.fc3(tensor_x)
      return output

model = MLPModel()
tensor_x = torch.rand((97, 8), dtype=torch.float32)
export_output = torch.onnx.dynamo_export(model, tensor_x)

Как показано в коде выше, всё, что вам нужно, это предоставить torch.onnx.dynamo_export() с экземпляром модели и её входными данными. Затем экспортер вернёт экземпляр torch.onnx.ExportOutput, содержащий экспортированный граф ONNX вместе с дополнительной информацией.

Модель в памяти, доступная через export_output.model_proto, — это объект onnx.ModelProto, соответствующий спецификации ONNX IR. Затем ONNX модель может быть сериализована в файл Protobuf с помощью API torch.onnx.ExportOutput.save().

export_output.save("mlp.onnx")

Просмотр ONNX модели с помощью графического интерфейса

Вы можете просмотреть экспортированную модель с помощью Netron.

<img alt="MLP модель, просмотренная с помощью Netron" src="data:image/png;base64,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

Обратите внимание, что каждый слой представлен прямоугольной рамкой с иконкой f в правом верхнем углу.

Выделенная функция ONNX в модели MLP

При раскрытии отображается тело функции.

Тело функции ONNX

Тело функции — это последовательность операторов ONNX или других функций.

Диагностика проблем с SARIF

Диагностика ONNX выходит за рамки обычных журналов, используя Формат обмена результатами статического анализа (SARIF), чтобы помочь пользователям отлаживать и улучшать свои модели с помощью графического интерфейса, например, Просмотрщика SARIF от Visual Studio Code.

Основные преимущества:

  • Диагностика выдаётся в машинно-читаемом формате Формат обмена результатами статического анализа (SARIF).
  • Новый более понятный и структурированный способ добавления и отслеживания правил диагностики.
  • Служат основой для будущих улучшений, использующих диагностическую информацию.

Правила диагностики ONNX в формате SARIF

  • FXE0007:fx-graph-to-onnx
  • FXE0008:fx-node-to-onnx
  • FXE0010:fx-pass
  • FXE0011:отсутствует символическая функция для вызова функции
  • FXE0012:неподдерживаемый анализ узла fx
  • FXE0013:отладка на уровне операций
  • FXE0014:найти совпадение схемы оператора и символической функции
  • FXE0015:вставка узла fx для повышения типа
  • FXE0016:поиск перегрузок операторов в реестре ONNX

Справочник по API

torch.onnx.dynamo_export(model, /, *model_args, export_options=None, **model_kwargs)

Экспорт модели torch.nn.Module в граф ONNX.

Параметры
  • model (Union[Модуль, Callable]) – Модель PyTorch, подлежащая экспорту в ONNX.
  • model_args – Позиционные входные данные для model.
  • model_kwargs – Именованные входные данные для model.
  • export_options (Optional[ExportOptions]) – Параметры, влияющие на экспорт в ONNX.
Возвращает

Представление экспортированной модели ONNX в памяти.

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

ExportOutput

Пример 1 — Простейший экспорт

class MyModel(torch.nn.Module):
    def __init__(self) -> None:
        super().__init__()
        self.linear = torch.nn.Linear(2, 2)
    def forward(self, x, bias=None):
        out = self.linear(x)
        out = out + bias
        return out
model = MyModel()
kwargs = {"bias": 3.}
args = (torch.randn(2, 2, 2),)
export_output = torch.onnx.dynamo_export(
    model,
    *args,
    **kwargs).save("my_simple_model.onnx")

Пример 2 — Экспорт с динамическими форматами

# The previous model can be exported with dynamic shapes
export_options = torch.onnx.ExportOptions(dynamic_shapes=True)
export_output = torch.onnx.dynamo_export(
    model,
    *args,
    **kwargs,
    export_options=export_options)
export_output.save("my_dynamic_model.onnx")

Выводом динамических размеров входных данных мы видим, что форма входных данных больше не (2,2,2)

>>> print(export_output.model_proto.graph.input[0])
name: "arg0"
type {
  tensor_type {
    elem_type: 1
    shape {
      dim {
        dim_param: "arg0_dim_0"
      }
      dim {
        dim_param: "arg0_dim_1"
      }
      dim {
        dim_param: "arg0_dim_2"
      }
    }
  }
}
class torch.onnx.ExportOptions(*, dynamic_shapes=None, op_level_debug=None, fake_context=None, onnx_registry=None, diagnostic_options=None)

Параметры, влияющие на экспорт TorchDynamo в ONNX.

Переменные
  • dynamic_shapes (Optional[bool]) – Подсказка о форме входных/выходных тензоров. Если None, экспортер определяет наиболее подходящее значение. Если True, все формы входных данных считаются динамическими. Если False, все формы входных данных считаются статическими.
  • op_level_debug (Optional[bool]) – Экспортировать ли модель с информацией об отладке на уровне операций
  • diagnostic_options (DiagnosticOptions) – Параметры диагностики для экспортера.
  • fake_context (Optional[ONNXFakeContext]) – Ложная среда, используемая для символического трассирования.
  • onnx_registry (Optional[OnnxRegistry]) – Реестр ONNX, используемый для регистрации операторов ATen в функции ONNX.
torch.onnx.enable_fake_mode()

Включить режим имитации на время выполнения контекста.

Внутренне он создаёт объект-менеджер контекста torch._subclasses.fake_tensor.FakeTensorMode, который преобразует пользовательские входные данные и параметры модели в torch._subclasses.fake_tensor.FakeTensor.

Объект имитации — это torch.Tensor с возможностью выполнения кода PyTorch без фактического выполнения вычислений с тензорами, выделенными на устройстве meta. Поскольку на устройстве не выделяется фактических данных, этот API позволяет экспортировать большие модели без фактической потребности в памяти для их выполнения.

Рекомендуется включать режим имитации при экспорте моделей, слишком больших для размещения в памяти.

Возвращает

Объект ONNXFakeContext, который необходимо передать в dynamo_export() через аргумент ExportOptions.fake_context.

Пример:

# xdoctest: +REQUIRES(env:TORCH_DOCTEST_ONNX)
>>> import torch
>>> import torch.onnx
>>> class MyModel(torch.nn.Module):  # Dummy model
...     def __init__(self) -> None:
...         super().__init__()
...         self.linear = torch.nn.Linear(2, 2)
...     def forward(self, x):
...         out = self.linear(x)
...         return out
>>> with torch.onnx.enable_fake_mode() as fake_context:
...     my_nn_module = MyModel()
...     arg1 = torch.randn(2, 2, 2)  # positional input 1
>>> export_options = torch.onnx.ExportOptions(fake_context=fake_context)
>>> export_output = torch.onnx.dynamo_export(
...     my_nn_module,
...     arg1,
...     export_options=export_options
... )
>>> # Saving model WITHOUT initializers
>>> export_output.save("my_model_without_initializers.onnx")
>>> # Saving model WITH initializers
>>> export_output.save("my_model_with_initializers.onnx", model_state_dict=MyModel().state_dict())

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

Этот API экспериментальный и НЕ совместим с предыдущими версиями.

class torch.onnx.ExportOutput(model_proto, input_adapter, output_adapter, diagnostic_context, *, fake_context=None, export_exception=None)

Представление модели PyTorch, экспортированной в ONNX, в оперативной памяти.

adapt_torch_inputs_to_onnx(*model_args, **model_kwargs) [source]

Преобразует входные данные модели PyTorch в формат входных данных экспортированной модели ONNX.

Из-за различий в проектировании формат входных/выходных данных модели PyTorch и экспортированной модели ONNX часто различаются. Например, None допускается для модели PyTorch, но не поддерживается ONNX. Вложенные структуры тензоров допускаются для модели PyTorch, но ONNX поддерживает только плоские тензоры и т.д.

Фактические шаги адаптации связаны с каждым отдельным экспортом. Они зависят от модели PyTorch, конкретного набора model_args и model_kwargs, используемых для экспорта, и параметров экспорта.

Этот метод воспроизводит шаги адаптации, записанные во время экспорта.

Параметры
  • model_args – Входные данные модели PyTorch.
  • model_kwargs – Параметрические входные данные модели PyTorch.
Возвращает

Последовательность тензоров, преобразованных из входных данных модели PyTorch.

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

Sequence[Union[Tensor, int, float, bool]]

Пример:

# xdoctest: +REQUIRES(env:TORCH_DOCTEST_ONNX)
>>> import torch
>>> import torch.onnx
>>> from typing import Dict, Tuple
>>> def func_with_nested_input_structure(
...     x_dict: Dict[str, torch.Tensor],
...     y_tuple: Tuple[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]
... ):
...     if "a" in x_dict:
...         x = x_dict["a"]
...     elif "b" in x_dict:
...         x = x_dict["b"]
...     else:
...         x = torch.randn(3)
...
...     y1, (y2, y3) = y_tuple
...
...     return x + y1 + y2 + y3
>>> x_dict = {"a": torch.tensor(1.)}
>>> y_tuple = (torch.tensor(2.), (torch.tensor(3.), torch.tensor(4.)))
>>> export_output = torch.onnx.dynamo_export(func_with_nested_input_structure, x_dict, y_tuple)
>>> print(x_dict, y_tuple)
{'a': tensor(1.)} (tensor(2.), (tensor(3.), tensor(4.)))
>>> print(export_output.adapt_torch_inputs_to_onnx(x_dict, y_tuple))
(tensor(1.), tensor(2.), tensor(3.), tensor(4.))

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

Этот API является экспериментальным и НЕ обратной совместимым.

adapt_torch_outputs_to_onnx(model_outputs) [source]

Преобразует выходные данные модели PyTorch в формат выходных данных экспортированной модели ONNX.

Из-за различий в проектировании формат входных/выходных данных модели PyTorch и экспортированной модели ONNX часто различаются. Например, None допускается для модели PyTorch, но не поддерживается ONNX. Вложенные структуры тензоров допускаются для модели PyTorch, но ONNX поддерживает только плоские тензоры и т.д.

Фактические шаги адаптации связаны с каждым отдельным экспортом. Они зависят от модели PyTorch, конкретного набора model_args и model_kwargs, используемых для экспорта, и параметров экспорта.

Этот метод воспроизводит шаги адаптации, записанные во время экспорта.

Параметры

model_outputs (Any) – Выходные данные модели PyTorch.

Возвращает

Выходные данные модели PyTorch в формате выходных данных экспортированной модели ONNX.

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

Sequence[Union[Tensor, int, float, bool]]

Пример:

# xdoctest: +REQUIRES(env:TORCH_DOCTEST_ONNX)
>>> import torch
>>> import torch.onnx
>>> def func_returning_tuples(x, y, z):
...     x = x + y
...     y = y + z
...     z = x + y
...     return (x, (y, z))
>>> x = torch.tensor(1.)
>>> y = torch.tensor(2.)
>>> z = torch.tensor(3.)
>>> export_output = torch.onnx.dynamo_export(func_returning_tuples, x, y, z)
>>> pt_output = func_returning_tuples(x, y, z)
>>> print(pt_output)
(tensor(3.), (tensor(5.), tensor(8.)))
>>> print(export_output.adapt_torch_outputs_to_onnx(pt_output))
[tensor(3.), tensor(5.), tensor(8.)]

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

Этот API является экспериментальным и НЕ обратной совместимым.

property diagnostic_context: diagnostics.DiagnosticContext

Контекст диагностики, связанный с экспортом.

property fake_context: Optional[ONNXFakeContext]

Фейковый контекст, связанный с экспортом.

property model_proto: onnx.ModelProto

Экспортированная модель ONNX в формате onnx.ModelProto.

save(destination, *, model_state_dict=None, serializer=None) [source]

Сохраняет модель ONNX в оперативной памяти в destination с указанными serializer.

Параметры
  • destination (Union[str, BufferedIOBase]) – Место сохранения модели ONNX. Может быть строкой или объектом типа «поток». При использовании с model_state_dict, это должна быть строка с полным путем к месту назначения. В этом случае помимо сохранения модели ONNX, будет создана папка с суффиксом «_initializers» (без расширения) для хранения каждого инициализатора модели ONNX в отдельном файле. Например, если место назначения — «/path/model.onnx», инициализаторы будут сохранены в папке «/path/model_initializers/».
  • model_state_dict (Optional[Union[Dict[str, Any], str]]) – state_dict модели PyTorch, содержащий все веса. Может быть словарем, возвращаемым model.state_dict(), или строкой с именем файла. Требуется при использовании enable_fake_mode(), но реальные инициализаторы требуются в графе ONNX. Может быть либо строкой с путем к контрольной точке, либо словарем с фактическим состоянием модели.
  • serializer (Optional[ExportOutputSerializer]) – Использовать сериализатор. Если не указано, модель будет сериализована как Protobuf.
save_diagnostics(destination) [source]

Сохраняет диагностику экспорта в журнал SARIF по указанному пути.

Параметры

destination (str) – Место сохранения журнала диагностики SARIF. Должен иметь расширение .sarif.

Исключения

ValueError – Если путь к месту назначения не заканчивается расширением .sarif.

class torch.onnx.ExportOutputSerializer(*args, **kwargs)

Протокол для сериализации графа ONNX в определённый формат (например, Protobuf). Обратите внимание, что это продвинутый сценарий использования.

serialize(export_output, destination) [source]

Метод протокола, который должен быть реализован для сериализации.

Параметры
  • export_output (ExportOutput) – Представляет модель ONNX, экспортированную в оперативной памяти.
  • destination (BufferedIOBase) – Бинарный поток ввода-вывода или предварительно выделенный буфер, в который следует записать сериализованную модель.

Пример

Простой сериализатор, записывающий экспортированный onnx.ModelProto в формате Protobuf в destination.

# xdoctest: +REQUIRES(env:TORCH_DOCTEST_ONNX)
>>> import io
>>> import torch
>>> import torch.onnx
>>> class MyModel(torch.nn.Module):  # Dummy model
...     def __init__(self) -> None:
...         super().__init__()
...         self.linear = torch.nn.Linear(2, 2)
...     def forward(self, x):
...         out = self.linear(x)
...         return out
>>> class ProtobufExportOutputSerializer:
...     def serialize(
...         self, export_output: torch.onnx.ExportOutput, destination: io.BufferedIOBase
...     ) -> None:
...         destination.write(export_output.model_proto.SerializeToString())
>>> model = MyModel()
>>> arg1 = torch.randn(2, 2, 2)  # positional input 1
>>> torch.onnx.dynamo_export(model, arg1).save(
...     destination="exported_model.onnx",
...     serializer=ProtobufExportOutputSerializer(),
... )
class torch.onnx.OnnxExporterError(export_output, message)

Возникает при ошибке экспортера ONNX.

Это исключение выбрасывается при ошибке во время процесса экспорта ONNX. Оно инкапсулирует объект ExportOutput, созданный до момента возникновения ошибки, позволяя получить частичные результаты экспорта и связанную метаданные.

class torch.onnx.OnnxRegistry

Реестр функций ONNX.

Реестр поддерживает сопоставление квалифицированных имен с символическими функциями в рамках фиксированной версии opset. Он поддерживает регистрацию пользовательских функций onnx-script и для диспетчера, чтобы перенаправлять вызовы на соответствующую функцию.

get_op_functions(namespace, op_name, overload=None) [source]

Возвращает список ONNXFunctions для данного оператора: torch.ops.<namespace>.<op_name>.<overload>.

Список упорядочен по времени регистрации. Пользовательские операторы должны быть во второй половине списка.

Параметры
  • namespace (строка) – Имя пространства имен оператора.
  • op_name (строка) – Имя оператора.
  • overload (Необязательный[строка]) – Перегрузка оператора. Если это стандартная перегрузка, оставьте None.
Возвращает

Список ONNXFunctions, соответствующих заданному имени, или None, если имя отсутствует в реестре.

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

Необязательный[Список[ONNXFunction]]

is_registered_op(namespace, op_name, overload=None) [source]

Возвращает, зарегистрирован ли данный оператор: torch.ops.<namespace>.<op_name>.<overload>.

Параметры
  • namespace (строка) – Имя пространства имен оператора.
  • op_name (строка) – Имя оператора.
  • overload (Необязательный[строка]) – Перегрузка оператора. Если это стандартная перегрузка, оставьте None.
Возвращает

True, если оператор зарегистрирован, иначе False.

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

bool

property opset_version: int

Версия ONNX opset, на которую должен ориентироваться экспортер. По умолчанию это последняя поддерживаемая версия ONNX opset: 18. Значение по умолчанию будет увеличиваться со временем по мере развития ONNX.

register_op(function, namespace, op_name, overload=None, is_complex=False) [source]

Регистрирует пользовательский оператор: torch.ops.<namespace>.<op_name>.<overload>.

Параметры
  • function (Объединение[onnxscript.OnnxFunction, onnxscript.TracedOnnxFunction]) – Функция onnx-script для регистрации.
  • namespace (строка) – Имя пространства имен оператора.
  • op_name (строка) – Имя оператора.
  • overload (Необязательный[строка]) – Перегрузка оператора. Если это стандартная перегрузка, оставьте None.
  • is_complex (bool) – Является ли функция функцией, обрабатывающей комплексные входные данные.
Исключения

ValueError – Если имя не имеет вида «namespace::op».

class torch.onnx.DiagnosticOptions(verbosity_level=20, warnings_as_errors=False)

Параметры для диагностического контекста.

Переменные
  • verbosity_level (целое число) – Устанавливает количество информации, регистрируемой для каждой диагностики, эквивалентно «уровню» в модуле Python logging.
  • warnings_as_errors (bool) – Когда True, предупреждения-диагностики рассматриваются как ошибки-диагностики.

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

Spec-Zone.ru

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