快捷方式

委托调试

委托后端 由于它们在定义行为方面的灵活性,因此是设备上模型的重要组成部分。这种灵活性的副作用是它作为不透明转换起作用。这掩盖了在后处理中很有价值的丰富关联和突变。

  • 例如,如果在委托中发生两种不同的算子融合,那么后处理将无法分离这两种转换。

具体来说,这使得通过委托图关联运行时信息(例如分析结果)变得困难。委托调试标识符提供了一个框架,通过该框架,委托作者可以传播此信息并将其用于运行后分析。

准备工作分为三个阶段

  • **提前(AOT)**:委托作者生成一个**调试句柄映射**。

  • **运行时**:委托作者使用 AOT 中注册的**委托调试标识符**在**调试句柄映射**中进行日志记录。

  • **反序列化**:委托作者提供一个解析器来解析委托事件中的自定义元数据。

提前集成

委托作者通过从后端实现返回**调试句柄映射**来传播降低的后端中发生的转换。

生成调试句柄映射

**调试句柄映射**通过将**委托调试标识符**映射到调试句柄来传达在后端发生的转换。

**委托调试标识符**是在运行时表示兴趣点的生成或用户提供的标识符。回想一下,调试句柄是模型图中算子实例的唯一标识符。

例如

  • **{ 0: (10, 11), 1: (11, 12) }: ** 运行时中的标识符 0 和 1 分别对应于调试句柄为 (10, 11) 和 (11, 12) 的算子。

  • **{ “fused_op_1_2_3”: (11, 12, 15) } **:运行时中的标识符 “fused_op_1_2_3” 对应于调试句柄为 (11, 12, 15) 的算子,而 11、12、15 对应于 op 1、op 2 和 op 3。

注意

标识符是将运行时结果连接到模型图的一种手段;标识符的解释由委托作者定义。

**调试句柄映射**是通过使用**DelegateMappingBuilder** 构建的,并作为 PreprocessResult 的一部分返回。

class PreprocessResult:
    processed_bytes: bytes = bytes()

    debug_handle_map: Optional[
        Union[Dict[int, Tuple[int]], Dict[str, Tuple[int]]]
    ] = None

PreprocessResult 在 此处 定义。

DelegateMappingBuilder

DelegateMappingBuilder 是用于管理和构建调试句柄映射的辅助类。构建器结果应在构建 PreprocessResult 时传入。

DelegateMappingBuilder此处 定义

可以以两种模式之一构建 DelegateMappingBuilder 实例:手动标识符或生成标识符。

# Manual Identifiers, Default
builder = DelegateMappingBuilder(generated_identifiers=False)

# Generated Identifiers
builder = DelegateMappingBuilder(generated_identifiers=True)

使用**手动标识符**,用户在创建条目时传入**委托调试标识符**。使用**生成标识符**,构建器将自动分配**委托调试标识符**。

要向**调试句柄映射**添加条目,请使用 insert_delegate_mapping_entry。它将 fx.Node(s) 或调试句柄(s)(源自 node.meta[“debug_handle”]) 之一与可选的**委托调试标识符**(用于手动标识符)相关联。记录的标识符将从调用中返回。

def insert_delegate_mapping_entry(
    self,
    nodes: Optional[Union[Node, List[Node]]] = None,
    handles: Optional[Union[int, List[int]]] = None,
    identifier: Optional[Union[int, str]] = None,
) -> Union[int, str]:

要检索**调试句柄映射**,请使用 get_delegate_mapping

def get_delegate_mapping(
    self,
) -> Union[Dict[int, Tuple[int]], Dict[str, Tuple[int]]]

AOT 映射的演示可以在 此处 找到

运行时日志记录

对应于 AOT 映射,运行时然后定义通过该映射记录这些事件的功能。

实时日志记录

ExecuTorch 允许您实时记录日志。**实时日志记录**在执行发生时有时间戳可用时很有用。它提供最小的开销,并且作者直观地调用。

要实时记录事件(例如,明确表示分析的开始和停止),event_tracer_start_profiling_delegate 用于创建 EventEntry,而 event_tracer_end_profiling_delegate 用于为提供的 EventTracer 结束 EventEntry

要使用 event_tracer_start_profiling_delegate 启动 EventTracerEntry委托调试标识符(通过 AOT 提供给 debug_handle_map)作为名称或 delegate_debug_id 参数传递,具体取决于委托调试标识符类型(分别为字符串和整数)。

EventTracerEntry event_tracer_start_profiling_delegate(
    EventTracer* event_tracer,
    const char* name,
    DebugHandle delegate_debug_id)

要结束 EventTracerEntry,只需向 event_tracer_end_profiling_delegate 提供原始 EventTracerEntry

此外,还可以选择在此时记录其他运行时 metadata

void event_tracer_end_profiling_delegate(
    EventTracer* event_tracer,
    EventTracerEntry event_tracer_entry,
    const void* metadata = nullptr,
    size_t metadata_len = 0)

后期时间日志记录

ExecuTorch 还允许您在后期时间记录日志。某些运行时设置在执行过程中无法访问时间戳。后期时间日志记录使作者能够仍然记录这些事件。

要在后期记录事件(例如,同时记录开始时间和结束时间),请使用 event_tracer_log_profiling_delegate 并结合实时日志记录 API 中使用的参数和时间戳调用。

void event_tracer_log_profiling_delegate(
    EventTracer* event_tracer,
    const char* name,
    DebugHandle delegate_debug_id,
    et_timestamp_t start_time,
    et_timestamp_t end_time,
    const void* metadata = nullptr,
    size_t metadata_len = 0)

运行时代码演示可在此处找到 此处

从委托事件中提取自定义元数据

如上所述的运行时日志记录 API 中所示,用户可以在委托分析事件中记录字节数组。我们将此数据通过 Inspector API 提供给用户,供其进行后期处理。

用户可以在创建 Inspector 实例时传递一个元数据解析器。解析器是一个可调用对象,用于反序列化数据并返回字符串列表或包含键值对的字典。反序列化后的数据随后被添加到事件块中的相应事件中,以便用户使用。以下是编写此解析器的示例。

注意:反序列化器的输入是一个列表,其中每个条目是一系列字节(本质上每个条目都是一个不可变的字节数组)。用户需要迭代此列表,反序列化每个条目,然后以预期格式返回它,该格式要么是字符串列表,要么是字典。

Inspector(
    etdump_path=etdump_path,
    # Optional
    etrecord=etrecord_path,
    # Optional, only needed if debugging was enabled.
    buffer_path=buffer_path,
    delegate_metadata_parser=parse_delegate_metadata
)


def parse_delegate_metadata(delegate_metadatas: List[bytes]) -> Union[List[str], Dict[str, Any]]:
    metadata_str = []
    for metadata_bytes in delegate_metadatas:
        metadata_str += str(metadata_bytes)
    return metadata_str

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取针对初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并获得问题的答案

查看资源