Spec-Zone.ru › PyTorch 2.14
fullgraph=False">
error_on_graph_break">

Переключение error_on_graph_break

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

Краткое описание:

  • Когда fullgraph=False, мы можем использовать torch._dynamo.error_on_graph_break() для большей гибкости при работе с разрывами графа.

До сих пор мы рассмотрели два способа работы с разрывами графа в torch.compile:

  1. fullgraph=True вызывает ошибку при первом разрыве графа и дополнительно гарантирует, что для кода будет построен только один граф.
  2. fullgraph=False продолжает трассировку даже при возникновении разрывов графа.

Что, если мы хотим запретить разрывы графа в большей части кода, но есть несколько проблемных функций, в которых разрывы графа сложно устранить, и мы готовы их допустить? Для этого можно использовать torch._dynamo.error_on_graph_break().

У torch.compile есть настройка error_on_graph_break (изначально установленная в False). Если в коде происходит разрыв графа или ошибка компилятора, пока error_on_graph_break установлено в False, то torch.compile попытается продолжить компиляцию после разрыва графа или ошибки. Если error_on_graph_break установлено в True, то torch.compile прервет компиляцию и передаст ошибку пользовательскому коду.

Существенное различие между error_on_graph_break=True и fullgraph=True заключается в том, что первый вариант не гарантирует захват одного графа. error_on_graph_break можно произвольно переключать во время компиляции с помощью менеджера контекста/декоратора torch._dynamo.error_on_graph_break(). В отличие от этого, после установки fullgraph в True его нельзя снова установить в False. Наконец, error_on_graph_break имеет более низкий приоритет, чем fullgraph: error_on_graph_break действует только при fullgraph=False.

Пример error_on_graph_break(False)

@torch._dynamo.error_on_graph_break(False)
def code_with_a_difficult_graph_break(x):
    x = x + 1
    torch._dynamo.graph_break()
    return x + 2

def inner(x):
    return code_with_a_difficult_graph_break(x)

# NOTE: fullgraph=False
@torch._dynamo.error_on_graph_break(True)
@torch.compile
def fn(x):
    return inner(x)

# No error, but there is a graph break
fn(torch.randn(3))

Использование error_on_graph_break(False) внутри error_on_graph_break(True) полезно, когда мы хотим свести к минимуму разрывы графа (то есть следовать модели программирования fullgraph=True), но в некоторых участках кода есть разрывы графа, не критичные для производительности, которые сложно устранить.

error_on_graph_break() также можно использовать как менеджер контекста:

# NOTE: fullgraph=False
@torch._dynamo.error_on_graph_break(True)
@torch.compile
def fn(x):
    x = x + 1
    with torch._dynamo.error_on_graph_break(False):
        torch._dynamo.graph_break()  # no error
    return x + 2

# No error, but there is a graph break
fn(torch.randn(3))

Для переключения error_on_graph_break в коде, исходный код которого нельзя редактировать (например, в коде фреймворка), можно использовать monkey patching:

class ThirdPartyModule(torch.nn.Module):
    def forward(self, x):
        x = x + 1
        torch._dynamo.graph_break()
        return x + 2

tp_mod = ThirdPartyModule()
tp_mod.forward = torch._dynamo.error_on_graph_break(False)(tp_mod.forward)

@torch._dynamo.error_on_graph_break(True)
@torch.compile
def fn(x):
    return tp_mod.forward(x)

# No error, but there is a graph break
fn(torch.randn(3))

Пример error_on_graph_break(True)

@torch._dynamo.error_on_graph_break(True)
def inner2(x):
    x = x + 1
    torch._dynamo.graph_break()  # error
    return x + 2

def inner(x):
    return inner2(x)

# fullgraph=False, error_on_graph_break=False
@torch.compile
def fn(x):
    x = x + 4
    torch._dynamo.graph_break()  # no error
    return inner(x)

try:
    fn(torch.randn(3))
except Exception as e:
    print(e)

Использование error_on_graph_break(True) внутри error_on_graph_break(False) полезно, когда мы хотим гибко использовать torch.compile (то есть следовать модели программирования fullgraph=False), но некоторые участки кода критичны для производительности, и мы хотим убедиться, что в них нет разрывов графа.

Поведение вложенных вызовов error_on_graph_break

torch._dynamo.error_on_graph_break() также влияет на настройку error_on_graph_break вложенных вызовов:

def inner(x):
    x = x + 1
    torch._dynamo.graph_break()
    return x + 2

def inner2(x):
    with torch._dynamo.error_on_graph_break(False):
        return inner(x)

@torch._dynamo.error_on_graph_break(True)
@torch.compile
def fn(x):
    return inner2(x)

# no error
fn(torch.randn(3))

torch._dynamo.error_on_graph_break() можно использовать внутри другой области torch._dynamo.error_on_graph_break():

def inner(x):
    x = x + 1
    with torch._dynamo.error_on_graph_break(False):
        torch._dynamo.graph_break()
    return x + 2

def inner2(x):
    with torch._dynamo.error_on_graph_break(True):
        return inner(x)

@torch.compile
def fn(x):
    return inner2(x)

# no error
fn(torch.randn(3))

Взаимодействие с fullgraph

fullgraph=True имеет более высокий приоритет, чем error_on_graph_break:

@torch._dynamo.error_on_graph_break(False)
def inner(x):
    x = x + 1
    torch._dynamo.graph_break()
    return x + 2

@torch.compile(fullgraph=True)
def fn(x):
    return inner(x)

try:
    fn(torch.randn(3))
except Exception as e:
    print(e)

fullgraph=True нельзя снова переключить на fullgraph=False:

@torch.compile(fullgraph=False)
def inner(x):
    x = x + 1
    torch._dynamo.graph_break()
    return x + 2

@torch.compile(fullgraph=True)
def fn(x):
    return inner(x)

try:
    fn(torch.randn(3))
except Exception as e:
    print(e)
@torch.compile(fullgraph=True)
def inner(x):
    x = x + 1
    torch._dynamo.graph_break()
    return x + 2

@torch.compile(fullgraph=False)
def fn(x):
    return inner(x)

try:
    fn(torch.randn(3))
except Exception as e:
    print(e)

Сравнение fullgraph=True/False и error_on_graph_break

В таблице ниже приведено сравнение fullgraph=True/False и error_on_graph_break:

error_on_graph_break=True

error_on_graph_break=False (по умолчанию)

fullgraph=True

Разрывы графа приводят к ошибкам. Сообщается только о первом разрыве графа. Гарантируется один граф.

fullgraph нельзя переключить на False. error_on_graph_break не действует.

Пользовательский код должен быть полностью совместим с torch.compile. Гарантируется отсутствие снижения производительности из-за разрывов графа (поскольку разрывов графа нет).

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

То же, что и fullgraph=True и error_on_graph_break=True, поскольку error_on_graph_break не действует при fullgraph=True.

fullgraph=False (по умолчанию)

Разрывы графа приводят к ошибкам. Сообщается только о первом разрыве графа. Нет гарантии одного графа.

error_on_graph_break можно переключить на False.

Пользовательский код должен быть полностью совместим с torch.compile. Гарантируется отсутствие снижения производительности из-за разрывов графа (поскольку разрывов графа нет).

Идеально подходит для пользовательского кода, чувствительного к разрывам графа. error_on_graph_break можно переключить на False для работы с участками, в которых есть разрывы графа, сложные для устранения.

Компиляция продолжается после обнаружения разрывов графа. Сообщается обо всех разрывах графа.

error_on_graph_break можно переключить на True.

Для работы не требуется вносить много изменений в пользовательский код. Разрывы графа могут отрицательно повлиять на производительность.

Идеально подходит для использования без дополнительной настройки, для «обычного» кода или случаев, когда максимальная производительность не является необходимостью

© 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/compile/programming_model.error_on_graph_break.html

Spec-Zone.ru

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