• 文件 >
  • Debug Backend Delegate
快捷鍵

Debug Backend Delegate

我們提供了一系列實用函式,讓使用者深入了解在 to_backend() 階段期間,圖形模組發生了什麼事。

取得委派摘要

get_delegation_info() 方法提供在 to_backend() 呼叫後,模型所發生情況的摘要。

from executorch.devtools.backend_debug import get_delegation_info
from tabulate import tabulate

# ... After call to to_backend(), but before to_executorch()
graph_module = edge_manager.exported_program().graph_module
delegation_info = get_delegation_info(graph_module)
print(delegation_info.get_summary())
df = delegation_info.get_operator_delegation_dataframe()
print(tabulate(df, headers="keys", tablefmt="fancy_grid"))

範例輸出

Total  delegated  subgraphs:  86
Number  of  delegated  nodes:  473
Number  of  non-delegated  nodes:  430

op_type

occurrences_in_delegated_graphs

occurrences_in_non_delegated_graphs

0

aten__softmax_default

12

0

1

aten_add_tensor

37

0

2

aten_addmm_default

48

0

3

aten_arange_start_step

0

25

23

aten_view_copy_default

170

48

26

總計

473

430

從表中可以看出,運算子 aten_view_copy_default 在委派圖形中出現 170 次,在非委派圖形中出現 48 次。使用者可以使用此類資訊進行偵錯。

視覺化委派圖

若要查看更詳細的視圖,請使用 format_delegated_graph() 方法來取得整個圖的列印輸出的字串,或使用 print_delegated_graph() 直接列印

from executorch.exir.backend.utils import format_delegated_graph
graph_module = edge_manager.exported_program().graph_module
print(format_delegated_graph(graph_module)) # or call print_delegated_graph(graph_module)

它將列印整個模型以及後端使用的子圖。fx 提供的通用除錯函數,如 print_tabular()print_readable(),只會顯示 call_delegate,但隱藏後端使用的子圖,而此函數會公開子圖內的內容。

在下面的範例列印輸出中,觀察到 embeddingadd 運算符被委派給 XNNPACK,而 sub 運算符則沒有。

%aten_unsqueeze_copy_default_22 : [num_users=1] = call_function[target=executorch.exir.dialects.edge._ops.aten.unsqueeze_copy.default](args = (%aten_arange_start_step_23, -2), kwargs = {})
  %aten_unsqueeze_copy_default_23 : [num_users=1] = call_function[target=executorch.exir.dialects.edge._ops.aten.unsqueeze_copy.default](args = (%aten_arange_start_step_24, -1), kwargs = {})
  %lowered_module_0 : [num_users=1] = get_attr[target=lowered_module_0]
    backend_id: XnnpackBackend
    lowered graph():
      %aten_embedding_default : [num_users=1] = placeholder[target=aten_embedding_default]
      %aten_embedding_default_1 : [num_users=1] = placeholder[target=aten_embedding_default_1]
      %aten_add_tensor : [num_users=1] = call_function[target=executorch.exir.dialects.edge._ops.aten.add.Tensor](args = (%aten_embedding_default, %aten_embedding_default_1), kwargs = {})
      return (aten_add_tensor,)
  %executorch_call_delegate : [num_users=1] = call_function[target=torch.ops.higher_order.executorch_call_delegate](args = (%lowered_module_0, %aten_embedding_default, %aten_embedding_default_1), kwargs = {})
  %aten_sub_tensor : [num_users=1] = call_function[target=executorch.exir.dialects.edge._ops.aten.sub.Tensor](args = (%aten_unsqueeze_copy_default, %aten_unsqueeze_copy_default_1), kwargs = {})

文件

存取 PyTorch 的完整開發者文件

檢視文件

教學

取得適合初學者和高級開發者的深入教學課程

檢視教學課程

資源

尋找開發資源並獲得您的問題解答

檢視資源