Spec-Zone.ru › PyTorch 2.14

Совместный граф с дескрипторами

Создано: 11 авг. 2025 | Последнее обновление: 03 дек. 2025

Совместный граф с дескрипторами — это экспериментальный API для экспорта трассированного совместного графа, который в полной мере поддерживает все возможности torch.compile и после обработки может быть преобразован обратно в дифференцируемую вызываемую функцию, которую можно выполнять обычным образом. Например, он используется для реализации autoparallel — системы, которая принимает модель и перераспределяет шарды входных данных и параметров, превращая её в распределённую SPMD-программу.

torch._functorch.aot_autograd.aot_export_joint_with_descriptors(stack, mod, args, kwargs=None, *, decompositions=None, keep_inference_input_mutations=False, ignore_shape_env=False, disable_functionalization=False, _record_nn_module_stack=False, _disable_torch_fn_metadata_mode=False) [исходный код]

Этот API захватывает совместный граф для nn.Module. Однако, в отличие от aot_export_joint_simple или aot_export_module(trace_joint=True), соглашение о вызове созданного совместного графа не использует фиксированную позиционную схему; например, нельзя рассчитывать, что второй аргумент трассированного совместного графа будет соответствовать второму аргументу трассированного модуля. При этом входы и выходы трассированного графа описаны с помощью дескрипторов, аннотированных в meta[‘desc’] узлов-заполнителей и узлов возврата FX. С их помощью можно определить назначение аргументов.

Главное преимущество этого способа экспорта по сравнению с aot_export_joint_simple заключается в том, что он обеспечивает паритет функций во всех ситуациях, поддерживаемых torch.compile (через aot_module_simplified), включая обработку более сложных случаев, таких как несколько дифференцируемых выходов, мутации входных данных, которые нужно обрабатывать вне графа, подклассы тензоров и т. д.

Что можно делать с такими совместными графами с дескрипторами? Основной пример использования (autoparallel) предполагает получение совместного графа, его оптимизацию и последующее преобразование обратно в вызываемую функцию, чтобы позднее её можно было скомпилировать с помощью torch.compile. Это нельзя реализовать как традиционный проход по совместному графу torch.compile по двум причинам:

  1. Решение о распределении параметров по шардам необходимо принять до инициализации параметров или загрузки контрольной точки, то есть задолго до того, как обычно запускается torch.compile.
  2. Нужно изменить назначение параметров (например, заменить реплицированный параметр его шардированной версией, изменив размер входных данных). Обычно torch.compile сохраняет семантику и не может изменять назначение входных данных.

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

Примечание. При использовании этого API необходимо создать и войти в контекстный менеджер ExitStack, который будет передан этой функции. Этот контекстный менеджер должен оставаться активным, если вы вызываете функцию компиляции для завершения компиляции. (TODO: Возможно, мы ослабим это требование, научив AOTAutograd отслеживать способы восстановления всех контекстных менеджеров позднее.)

Примечание. На этапе stage2 не обязательно выполнять полную компиляцию; вместо этого можно не указывать компиляторы прямого и обратного проходов, и тогда секционированные графы FX будут выполняться напрямую. Можно разрешить использование общей autograd Function в графе, чтобы позднее повторно обработать её в контексте (потенциально более крупной) скомпилированной области.

Примечание. Эти API не используют кэш, поскольку мы кэшируем только результаты итоговой компиляции, а не промежуточный результат экспорта.

Если переданный nn.Module содержит параметры и буферы, мы создадим дополнительные неявные аргументы параметров и буферов и назначим им дескрипторы ParamAOTInput и BufferAOTInput. Однако если входной nn.Module создан с помощью такого механизма, как Dynamo, эти дескрипторы НЕ будут добавлены (поскольку Dynamo уже преобразовал параметры и буферы в аргументы). В этом случае необходимо проанализировать Sources входных данных, чтобы определить, являются ли они параметрами, и выяснить их FQN.

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

JointWithDescriptors

torch._functorch.aot_autograd.aot_compile_joint_with_descriptors(jd, *, partition_fn=<function default_partition>, fw_compiler=<function boxed_nop_preserve_node_meta>, bw_compiler=<function boxed_nop_preserve_node_meta>, serializable=False) [исходный код]

Вспомогательная функция для aot_export_joint_with_descriptors, которая компилирует совместный граф в вызываемую функцию со стандартным соглашением о вызове. Все элементы params_flat являются аргументами.

Примечание. Мы НЕ создаём экземпляр модуля; это позволяет создавать его подкласс и настраивать его поведение, не беспокоясь о переназначении FQN.

Параметры:

serializable (bool) – Если True, настраивает компиляцию для создания сериализуемой вызываемой функции с использованием механизма AOTAutogradCache. При этом настраивается необходимый cache_info и применяются параметры конфигурации, требуемые для сериализации. Если задано True, эта функция всегда возвращает BundledAOTAutogradSerializableCallable.

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

Callable[…, Any]

Дескрипторы

class torch._functorch._aot_autograd.descriptors.AOTInput [исходный код]

Описывает происхождение входных данных из графа FX, созданного AOTAutograd

is_buffer() [исходный код]

True, если эти входные данные являются буфером или производны от буфера (например, атрибута подкласса)

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

bool

is_param() [исходный код]

True, если эти входные данные являются параметром или производны от параметра (например, атрибута подкласса)

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

bool

is_tangent() [исходный код]

True, если эти входные данные являются касательным вектором или производны от касательного вектора (например, атрибута подкласса)

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

bool

class torch._functorch._aot_autograd.descriptors.AOTOutput [исходный код]

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

is_grad() [исходный код]

True, если этот выходной элемент является градиентом или производен от градиента (например, атрибута подкласса)

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

bool

class torch._functorch._aot_autograd.descriptors.BackwardTokenAOTInput(idx) [исходный код]

Токен состояния мира, передаваемый через операции с побочными эффектами; используется только для обратного прохода

class torch._functorch._aot_autograd.descriptors.BackwardTokenAOTOutput(idx) [исходный код]

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

class torch._functorch._aot_autograd.descriptors.BufferAOTInput(target) [исходный код]

Входные данные являются буфером, FQN которого — target

class torch._functorch._aot_autograd.descriptors.DummyAOTInput(idx) [исходный код]

В некоторых ситуациях нужно вызвать функцию, ожидающую AOTInput, хотя соответствующая логика нам не нужна (чаще всего потому, что некоторый код используется и во время компиляции, и во время выполнения; в такой ситуации обработка AOTInput не требуется). В этом случае передайте фиктивный объект; однако лучше использовать версию функции, в которой его вообще нет.

class torch._functorch._aot_autograd.descriptors.DummyAOTOutput(idx) [исходный код]

Для случаев, когда распространение дескрипторов не требуется; обычно не используйте.

class torch._functorch._aot_autograd.descriptors.GradAOTOutput(grad_of) [исходный код]

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

class torch._functorch._aot_autograd.descriptors.InputMutationAOTOutput(mutated_input) [исходный код]

Изменённое значение входного тензора возвращается для корректного распространения autograd.

class torch._functorch._aot_autograd.descriptors.IntermediateBaseAOTOutput(base_of) [исходный код]

Промежуточная базовая сущность для нескольких выходных элементов, которые ссылаются друг на друга. Мы сообщаем только об ОДНОМ из выходных элементов, участвовавших в создании этой базовой сущности.

class torch._functorch._aot_autograd.descriptors.ParamAOTInput(target) [исходный код]

Входные данные являются параметром, FQN которого — target

class torch._functorch._aot_autograd.descriptors.PhiloxBackwardBaseOffsetAOTInput [исходный код]

Смещение для функционализированных вызовов Philox RNG, предназначенное именно для графа обратного прохода.

class torch._functorch._aot_autograd.descriptors.PhiloxBackwardSeedAOTInput [исходный код]

Начальное значение для функционализированных вызовов Philox RNG, предназначенное именно для графа обратного прохода.

class torch._functorch._aot_autograd.descriptors.PhiloxForwardBaseOffsetAOTInput [исходный код]

Смещение для функционализированных вызовов Philox RNG, предназначенное именно для графа прямого прохода.

class torch._functorch._aot_autograd.descriptors.PhiloxForwardSeedAOTInput [исходный код]

Начальное значение для функционализированных вызовов Philox RNG, предназначенное именно для графа прямого прохода.

class torch._functorch._aot_autograd.descriptors.PhiloxUpdatedBackwardOffsetAOTOutput [исходный код]

Итоговое смещение после функционализированных вызовов RNG; используется только для обратного прохода

class torch._functorch._aot_autograd.descriptors.PhiloxUpdatedForwardOffsetAOTOutput [исходный код]

Итоговое смещение после функционализированных вызовов RNG; используется только для прямого прохода

class torch._functorch._aot_autograd.descriptors.PlainAOTInput(idx) [исходный код]

Входные данные являются обычным входом, соответствующим определённому позиционному индексу.

Обратите внимание: AOTInput всегда относится к функции с плоским соглашением о вызове, например, такому, которое принимает aot_module_simplified. Некоторые API AOTAutograd выполняют сплющивание pytrees, но мы не записываем пути ключей PyTree при сплющивании (хотя могли бы и должны были бы это делать!).

class torch._functorch._aot_autograd.descriptors.PlainAOTOutput(idx) [исходный код]

Обычный тензорный выходной элемент с индексом idx в кортеже выходных данных

class torch._functorch._aot_autograd.descriptors.SavedForBackwardsAOTOutput(idx: int) [исходный код]
class torch._functorch._aot_autograd.descriptors.SubclassGetAttrAOTInput(base, attr) [исходный код]

Перед передачей в граф FX входные данные-подклассы разбираются на составляющие их части. Этот дескриптор указывает, какому именно атрибуту подкласса соответствует данный вход (исходного аргумента-подкласса «base»).

class torch._functorch._aot_autograd.descriptors.SubclassGetAttrAOTOutput(base, attr) [исходный код]

Этот выходной элемент будет включён в подкласс в указанном месте

class torch._functorch._aot_autograd.descriptors.SubclassSizeAOTInput(base, idx) [исходный код]

Подкласс, из которого получен этот внешний вход SymInt размера (для измерения с индексом dim).

class torch._functorch._aot_autograd.descriptors.SubclassSizeAOTOutput(base, idx) [исходный код]

Этот размер выходных данных будет включён в подкласс в указанном месте

class torch._functorch._aot_autograd.descriptors.SubclassStrideAOTInput(base, idx) [исходный код]

Подкласс, из которого получен этот внешний вход SymInt шага (для измерения с индексом dim).

class torch._functorch._aot_autograd.descriptors.SubclassStrideAOTOutput(base, idx) [исходный код]

Этот шаг выходных данных будет включён в подкласс в указанном месте

class torch._functorch._aot_autograd.descriptors.SyntheticBaseAOTInput(base_of) [исходный код]

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

class torch._functorch._aot_autograd.descriptors.ViewBaseAOTInput(base_of) [исходный код]

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

TODO: В принципе, мы могли бы сообщать обо ВСЕХ входных данных, для которых этот объект является базовым.

Утилиты FX

Этот модуль содержит вспомогательные функции для работы с совместными графами FX с дескрипторами, создаваемыми AOTAutograd. Они НЕ будут работать с произвольными графами FX. См. также torch._functorch.aot_autograd.aot_export_joint_with_descriptors(). Также рекомендуем ознакомиться с :mod:torch._functorch._aot_autograd.descriptors`.

torch._functorch._aot_autograd.fx_utils.get_all_input_and_grad_nodes(g) [источник]

Для совместного графа с дескрипторами (meta[‘desc’] для заполнителей и выходных данных) возвращает узел для каждого входа и соответствующий ему узел градиента на выходе, если он существует. Эти кортежи помещаются в словарь, индексируемый дескриптором AOTInput, который описывает вход.

Примечание: возвращаются все тензорные входы прямого прохода, включая недифференцируемые входы (для которых градиент равен None), поэтому эту функцию можно безопасно использовать для выполнения операций над всеми входами. (Эта функция НЕ обходит нетензорные входы, например символические целые числа, токены или состояние RNG.)

Параметры:

g (Graph) – Совместный граф FX с дескрипторами

Возвращает:

Словарь, сопоставляющий каждому дескриптору DifferentiableAOTInput кортеж, содержащий: - Сам узел входа - Узел градиента (выхода), если он существует, иначе None

Вызывает исключение:
  • RuntimeError – Если совместный граф содержит тензорные входы или выходы подклассов; это
  • не поддерживается API, поскольку при использовании подклассов соответствие между –
  • входами и градиентами не обязательно является взаимно однозначным. –
Тип возвращаемого значения:

dict[DifferentiableAOTInput, tuple[Node, Node | None]]

torch._functorch._aot_autograd.fx_utils.get_all_output_and_tangent_nodes(g) [источник]

Получает все узлы выходных данных и соответствующие им узлы касательных векторов из совместного графа.

Аналогична get_all_input_and_grad_nodes, но возвращает пары из узлов выходных данных и соответствующих им узлов касательных векторов (если они существуют). Эта функция обходит граф, чтобы найти все дифференцируемые выходные данные и сопоставить их с соответствующими касательными входами, используемыми при автоматическом дифференцировании в прямом режиме.

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

Параметры:

g (Graph) – Совместный граф FX с дескрипторами

Возвращает:

Словарь, сопоставляющий каждому дескриптору DifferentiableAOTOutput кортеж, содержащий: - Сам узел выходных данных - Узел касательного вектора (входа), если он существует, иначе None

Вызывает исключение:
  • RuntimeError – Если совместный граф содержит тензорные входы или выходы подклассов; это
  • не поддерживается API, поскольку при использовании подклассов соответствие между –
  • выходными данными и касательными векторами не обязательно является взаимно однозначным. –
Тип возвращаемого значения:

dict[DifferentiableAOTOutput, tuple[Node, Node | None]]

torch._functorch._aot_autograd.fx_utils.get_buffer_nodes(graph) [источник]

Получает все узлы буферов графа в виде списка.

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

Параметры:

graph (Graph) – Совместный граф FX с дескрипторами

Возвращает:

Список узлов FX, представляющих все буферы в графе.

Вызывает исключение:
  • RuntimeError – Если встретились тензоры подклассов (пока не поддерживаются), поскольку
  • неясно, нужны ли вам отдельные составляющие части подклассов или –
  • их следует каким-либо образом сгруппировать. –
Тип возвращаемого значения:

list[Node]

torch._functorch._aot_autograd.fx_utils.get_named_buffer_nodes(graph) [источник]

Получает узлы буферов, сопоставленные с их полными именами.

Эта функция обходит граф, чтобы найти все входные узлы буферов, и возвращает их в словаре, где ключами являются имена буферов (FQN), а значениями — соответствующие узлы FX.

Параметры:

graph (Graph) – Совместный граф FX с дескрипторами

Возвращает:

Словарь, сопоставляющий имена буферов (str) с соответствующими узлами FX.

Вызывает исключение:
  • RuntimeError – Если встретились тензоры подклассов (пока не поддерживаются), поскольку
  • для подклассов FQN не обязательно соответствует одному обычному тензору. –
Тип возвращаемого значения:

dict[str, Node]

torch._functorch._aot_autograd.fx_utils.get_named_param_nodes(graph) [источник]

Получает узлы параметров, сопоставленные с их полными именами.

Эта функция обходит граф, чтобы найти все входные узлы параметров, и возвращает их в словаре, где ключами являются имена параметров (FQN), а значениями — соответствующие узлы FX.

Параметры:

graph (Graph) – Совместный граф FX с дескрипторами

Возвращает:

Словарь, сопоставляющий имена параметров (str) с соответствующими узлами FX.

Вызывает исключение:
  • RuntimeError – Если встретились тензоры подклассов (пока не поддерживаются), поскольку
  • для подклассов FQN не обязательно соответствует одному обычному тензору. –
Тип возвращаемого значения:

dict[str, Node]

torch._functorch._aot_autograd.fx_utils.get_param_and_grad_nodes(graph) [источник]

Получает узлы параметров и соответствующие им узлы градиентов из совместного графа.

Параметры:

graph (Graph) – Совместный граф FX с дескрипторами

Возвращает:
  • Входной узел параметра
  • Узел градиента (выхода), если он существует, иначе None
Тип возвращаемого значения:

Словарь, сопоставляющий каждому дескриптору ParamAOTInput кортеж, содержащий

torch._functorch._aot_autograd.fx_utils.get_param_nodes(graph) [источник]

Получает все узлы параметров графа в виде списка.

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

Параметры:

graph (Graph) – Совместный граф FX с дескрипторами

Возвращает:

Список узлов FX, представляющих все параметры в графе.

Вызывает исключение:
  • RuntimeError – Если встретились тензоры подклассов (пока не поддерживаются), поскольку
  • неясно, нужны ли вам отдельные составляющие части подклассов или –
  • их следует каким-либо образом сгруппировать. –
Тип возвращаемого значения:

list[Node]

torch._functorch._aot_autograd.fx_utils.get_plain_input_and_grad_nodes(graph) [источник]

Получает узлы обычных входов и соответствующие им узлы градиентов из совместного графа.

Параметры:

graph (Graph) – Совместный граф FX с дескрипторами

Возвращает:
  • Узел обычного входа
  • Узел градиента (выхода), если он существует, иначе None
Тип возвращаемого значения:

Словарь, сопоставляющий каждому дескриптору PlainAOTInput кортеж, содержащий

torch._functorch._aot_autograd.fx_utils.get_plain_output_and_tangent_nodes(graph) [источник]

Получает узлы обычных выходных данных и соответствующие им узлы касательных векторов из совместного графа.

Параметры:

graph (Graph) – Совместный граф FX с дескрипторами

Возвращает:
  • Узел обычного выходного значения
  • Узел касательного вектора (входа), если он существует, иначе None
Тип возвращаемого значения:

Словарь, сопоставляющий каждому дескриптору PlainAOTOutput кортеж, содержащий

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

Spec-Zone.ru

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