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:
Их можно установить через 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 или других функций.
Диагностика проблем с 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 в памяти.
- Тип возвращаемого значения
Пример 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.
-
dynamic_shapes (Optional[bool]) – Подсказка о форме входных/выходных тензоров. Если
-
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.
- Тип возвращаемого значения
Пример:
# 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.
- Тип возвращаемого значения
Пример:
# 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.
-
destination (Union[str, BufferedIOBase]) – Место сохранения модели ONNX. Может быть строкой или объектом типа «поток». При использовании с
-
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.
- Тип возвращаемого значения
-
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