Переключение error_on_graph_break
Создано: 03 сен 2025 | Последнее обновление: 03 дек 2025
Краткое описание:
- Когда
fullgraph=False, мы можем использоватьtorch._dynamo.error_on_graph_break()для большей гибкости при работе с разрывами графа.
До сих пор мы рассмотрели два способа работы с разрывами графа в torch.compile:
-
fullgraph=Trueвызывает ошибку при первом разрыве графа и дополнительно гарантирует, что для кода будет построен только один граф. -
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:
|
| |
|---|---|---|
| Разрывы графа приводят к ошибкам. Сообщается только о первом разрыве графа. Гарантируется один граф. | То же, что и |
| Разрывы графа приводят к ошибкам. Сообщается только о первом разрыве графа. Нет гарантии одного графа. | Компиляция продолжается после обнаружения разрывов графа. Сообщается обо всех разрывах графа. |
© 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