Debugger#
FlagPrism Debugger 用于观察 Triton kernel 内部的数值、内存访问和 operation 执行状态。它将编译期静态 metadata 与 device 运行期记录关联,导出 Triton 语句级报告、IR op 级报告和 level-2 NumPy artifact,用于定位数值异常、异常访存和 kernel 内部数据流问题。
动态采集和 hidden-argument launch 路径已在昇腾/CANN9、天数/CoreX 4.4(LLVM 22)、MUSA/mthreads 4.3.5 与 NVIDIA CUDA 后端验证。
公开 API#
唯一的公开 Python 导入路径是:
import flagtree.debugger as debugger
不再提供 triton.debugger 公开命名空间。Triton JIT kernel 内的采集边界由 FlagTree language 扩展提供:
ftl.debug_collect_start(level=1, addr_level=1)
# Triton operations to collect
ftl.debug_collect_end()
flagtree.debugger 负责 Python 配置、编译模式和导出;ftl.debug_collect_start/end 只负责界定 @triton.jit 内需要采集的 IR 区域。debug_collect_start 可通过 level 为该区域单独指定采集等级;addr_level=None 时继承 activate() 的地址采集等级。
快速开始#
from pathlib import Path
import torch
import torch_npu
import triton
import flagtree.debugger as debugger
import flagtree.language as ftl
import triton.language as tl
debugger.configure(
output_dir=Path("/tmp/flagtree_debugger_example"),
record_capacity=4096,
export_raw_records=False,
)
debugger.activate(level=1, addr_level=1)
@triton.jit
def debug_abs_kernel(x_ptr, y_ptr, n: tl.constexpr, BLOCK_SIZE: tl.constexpr):
offsets = tl.program_id(0) * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE)
mask = offsets < n
ftl.debug_collect_start(level=1, addr_level=1)
x = tl.load(x_ptr + offsets, mask=mask, other=0.0)
y = tl.abs(x)
z = y + 1.0
tl.store(y_ptr + offsets, z, mask=mask)
ftl.debug_collect_end()
n = 16
x = torch.linspace(-8, 7, n, dtype=torch.float32, device="npu")
y = torch.empty_like(x)
debug_abs_kernel[(1,)](x, y, n, BLOCK_SIZE=16)
torch_npu.npu.synchronize()
for run in debugger.take_exported_runs():
print("report_path=", run.get("report_path"))
应在编译需要调试的 kernel 之前调用 debugger.activate()。它开启进程级 Debugger pipeline,但不记录 Python、PyTorch 或 torch_npu operation;只有 collect marker 之间的 Triton operation 才会被采集。
配置#
debugger.configure() 修改后续 activate() 使用的默认配置,未传入的字段保持当前值。
debugger.configure(
output_dir="/tmp/flagtree_debugger_manual",
record_capacity=4096,
export_mode="POST_KERNEL_EXPORT",
export_on_error=False,
export_raw_records=False,
timeline=False,
)
选项 |
默认值 |
含义 |
|---|---|---|
|
|
报告输出目录; |
|
|
device record slot 容量,必须为正整数。 |
|
|
kernel 完成后导出;也接受 |
|
|
kernel 报错后是否仍尝试导出。 |
|
|
是否额外写出 decoded raw-record sidecar。 |
|
|
在支持的后端插入 device timestamp timeline record。 |
查询和恢复配置:
print(debugger.get_config())
debugger.reset_config()
采集等级#
level 和 addr_level 属于采集策略,通过 activate() 配置:
debugger.activate(level=1, addr_level=1, timeline=True)
level=1:采集数值摘要。level=2:采集摘要并导出支持的完整 tensor value。addr_level=0:不插入动态地址采集。addr_level=1:采集 load/store 的地址摘要。addr_level=2:当level=2且后端支持当前 pointer/mask pattern 时,额外导出完整 lane address。timeline=True:采集 device-wide 纳秒级时间戳(NVIDIA CUDA 使用 PTX%globaltimer;昇腾使用SYS_CNT)。默认关闭,以免给普通调试 session 增加额外 device-side 记录开销。
长进程、notebook 或测试套件可在不再编译 debug kernel 时关闭 pipeline:
debugger.deactivate()
可用性#
成功导入后,debugger.is_available() 可检查编译器和运行时 native binding 是否同时可用。core-only wheel(TRITON_BUILD_FLAGPRISM=OFF)不包含 flagtree.debugger。