ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PyTorch AOTInductor Minifier 完全指南:从报错到最小化复现

PyTorch AOTInductor Minifier 完全指南:从报错到最小化复现 PyTorch AOTInductor Minifier 完全指南从报错到最小化复现【免费下载链接】pytorchTensors and Dynamic neural networks in Python with strong GPU acceleration项目地址: https://gitcode.com/GitHub_Trending/py/pytorch导读本文讲解 PyTorch 内置的 AOTInductor Minifier 调试工具当torch._inductor.aoti_compile_and_package/torch._inductor.aoti_load_package编译或运行加载模型出错时如何一键生成能复现错误的最小化nn.Module与可执行脚本。读完本文你将掌握开启 minifier 的两种方式Python 配置与环境变量、minifier_launcher.py与repro.py两个产物的含义与用法、minify/run 两种命令模式的区别以及相关配置项在源码中的底层实现。AOTInductor Minifier 解决什么问题AOTInductorAOTI是 PyTorch 2.x 中将模型提前编译为独立共享库的路径核心 API 是torch._inductor.aoti_compile_and_package(ep)把torch.export导出的ExportedProgram编译打包为可分发文件torch._inductor.aoti_load_package(package_path)加载打包产物并返回可调用模型。一旦编译、加载或运行阶段抛错尤其是 Triton kernel 生成错误、C 编译错误、精度问题甚至段错误原始模型图通常很大难以定位是哪个算子导致。AOTInductor Minifier 的作用就是把出错的图自动裁剪成只包含触发错误的最少节点的nn.Module并生成可直接运行的复现脚本帮助开发者快速向 PyTorch 提交高质量 bug 报告。从源码结构看minifier 位于 torch/_dynamo/repro/aoti.py底层复用了functorch.compile.minifier的 delta-debugging 图裁剪算法因此其行为与 torch.compile 的通用 minifier 一脉相承。开启 Minifier两种等价方式使用前需开启aot_inductor.dump_aoti_minifier配置文档给出两种方式方式一Python 代码中修改配置from torch._inductor import config config.aot_inductor.dump_aoti_minifier True方式二设置环境变量export DUMP_AOTI_MINIFIER1在 torch/_inductor/config.py 中可以确认二者完全等价——该配置项本身就是用环境变量初始化的# dump an aoti minifier if program errors dump_aoti_minifier: bool os.environ.get(DUMP_AOTI_MINIFIER, 0) 1输出目录与 repro_levelminifier 产物默认写入torch_compile_debug/目录由torch._dynamo.config.debug_dir_root决定最终路径形如torch_compile_debug/run_2024_10_31_16_21_08_602433-pid_2861654/minifier/minifier_launcher.pydebug_dir_root可通过torch._dynamo.config.debug_dir_root指定为任意合法目录。此外 torch/_inductor/config.py 中的repro_level控制 dump 的触发策略默认 2repro_level行为1编译失败时仅 dump 原始图到repro.py2AOTI 失败时 dumpminifier_launcher.py默认3总是 dumpminifier_launcher.py适合段错误场景4仅当精度检查失败时 dumpminifier_launcher.py该开关同样有环境变量AOTINDUCTOR_REPRO_LEVEL可配。触发流程示例注入一个 relu 编译错误文档提供了一个完整的演示脚本通过torch._inductor.config.triton.inject_relu_bug_TESTING_ONLY compile_error故意在 relu 的 Triton kernel 生成中注入语法错误随后走完整的 export → compile_and_package → load_package 流程import torch from torch._inductor import config as inductor_config class Model(torch.nn.Module): def __init__(self): super().__init__() self.fc1 torch.nn.Linear(10, 16) self.relu torch.nn.ReLU() self.sigmoid torch.nn.Sigmoid() def forward(self, x): x self.fc1(x) x self.relu(x) x self.sigmoid(x) return x inductor_config.aot_inductor.dump_aoti_minifier True torch._inductor.config.triton.inject_relu_bug_TESTING_ONLY compile_error with torch.no_grad(): model Model().to(cuda) example_inputs (torch.randn(8, 10).to(cuda),) ep torch.export.export(model, example_inputs) package_path torch._inductor.aoti_compile_and_package(ep) compiled_model torch._inductor.aoti_load_package(package_path) result compiled_model(*example_inputs)运行后会得到如下错误RuntimeError: Failed to import /tmp/torchinductor_shangdiy/fr/cfrlf4smkwe4lub4i4cahkrb3qiczhf7hliqqwpewbw3aplj5g3s.py SyntaxError: invalid syntax (cfrlf4smkwe4lub4i4cahkrb3qiczhf7hliqqwpewbw3aplj5g3s.py, line 29)原因在于inject_relu_bug_TESTING_ONLY让 relu 生成的 Triton kernel 中relu被替换成了compile error!从而产生非法 Python 语法。生成的 kernel 如下注意第 3 行triton.jit def triton_poi_fused_addmm_relu_sigmoid_0(in_out_ptr0, in_ptr0, xnumel, XBLOCK : tl.constexpr): xnumel 128 xoffset tl.program_id(0) * XBLOCK xindex xoffset tl.arange(0, XBLOCK)[:] xmask xindex xnumel x2 xindex x0 xindex % 16 tmp0 tl.load(in_out_ptr0 (x2), xmask) tmp1 tl.load(in_ptr0 (x0), xmask, eviction_policyevict_last) tmp2 tmp0 tmp1 tmp3 compile error! tmp4 tl.sigmoid(tmp3) tl.store(in_out_ptr0 (x2), tmp4, xmask)触发 dump 的底层调用链从 torch/_inductor/debug.py 的aot_inductor_minifier_wrapper可以看到 dump 逻辑检查config.aot_inductor.dump_aoti_minifieruse_minifier若repro_level 3无论是否报错都先把原始模块 dump 下来应对段错误若repro_level 4先做一次精度检查正常编译用load_and_runuse_minifier参数捕获AccuracyError或任意Exception后调用dump_to_minify(...)再重新抛出原始异常。dump_to_minify定义于 torch/_dynamo/repro/aoti.pycommandminify时把minifier_launcher.py写到debug_dir/minifier/下commandrun时把repro.py写到当前工作目录。开启 minifier 后报错同时还会输出一段日志指明minifier_launcher.py的写入位置W1031 16:21:08.612000 2861654 pytorch/torch/_dynamo/debug_utils.py:279] Writing minified repro to: W1031 16:21:08.612000 2861654 pytorch/torch/_dynamo/debug_utils.py:279] /data/users/shangdiy/pytorch/torch_compile_debug/run_2024_10_31_16_21_08_602433-pid_2861654/minifier/minifier_launcher.py该日志由 torch/_dynamo/debug_utils.py 中的helper_for_dump_minify输出产物路径由get_minifier_repro_path()决定。Minifier Launcher产物与两种命令模式生成的minifier_launcher.py核心结构如下文档原文路径与版本信息因环境而异import torch import torch._inductor.inductor_prims import torch._dynamo.config import torch._inductor.config import torch._functorch.config import torch.fx.experimental._config torch._inductor.config.triton.inject_relu_bug_TESTING_ONLY compile_error torch._inductor.config.aot_inductor.dump_aoti_minifier True isolate_fails_code_str None # torch version: 2.6.0a0gitcd9c6e9 # torch cuda version: 12.0 # torch git version: cd9c6e9408dd79175712223895eed36dbdc84f84 # CUDA Info: # nvcc: NVIDIA (R) Cuda compiler driver # Copyright (c) 2005-2023 NVIDIA Corporation # Built on Fri_Jan__6_16:45:21_PST_2023 # Cuda compilation tools, release 12.0, V12.0.140 # Build cuda_12.0.r12.0/compiler.32267302_0 # GPU Hardware Info: # NVIDIA PG509-210 : 8 exported_program torch.export.load(/data/users/shangdiy/pytorch/torch_compile_debug/run_2024_11_06_13_52_35_711642-pid_3567062/minifier/checkpoints/exported_program.pt2) # print(exported_program.graph) config_patches{} if __name__ __main__: from torch._dynamo.repro.aoti import run_repro with torch.no_grad(): run_repro(exported_program, config_patchesconfig_patches, accuracyFalse, commandminify, save_dir/data/users/shangdiy/pytorch/torch_compile_debug/run_2024_11_06_13_52_35_711642-pid_3567062/minifier/checkpoints, check_strNone)对该脚本的理解要点exported_program是torch._inductor.aoti_compile_and_package的输入已通过torch.export.save序列化到checkpoints/exported_program.pt2再由torch.export.load恢复见 aoti.py 中generate_compiler_repro_exported_programcommandminify表示运行 minifier把图裁剪到最小并复现错误commandrun表示不做裁剪直接编译、加载并运行模型文件头部注释自动记录了 torch 版本、CUDA 版本、nvcc 与 GPU 硬件信息便于提交 bug 时附上环境accuracy参数控制是否做精度对比False/只检查是否报错accuracy比较与 fp64 参考的 RMSE。run_repro 的命令分派torch/_dynamo/repro/aoti.py 中的run_repro使用 argparse 定义了两个子命令run调用repro_run——通过_aoti_compile_and_package_inner(..., load_and_runTrue)编译、加载并执行若输入含 CUDA tensor 还会synchronize()以确保段错误暴露出来minify调用repro_minify——进入 minifier 循环并额外支持多个控制参数--check-str要求最小化程序报错信息包含指定字符串、--offload-to-diskOOM 时把中间结果卸载到磁盘、--skip-sanity跳过原始图 sanity 检查、--max-granularity指定起始裁剪粒度须为 2 的幂、--minifier-export-modedynamo 对应 strictTruepython 对应 strictFalse、--skip-export-error跳过无法 export 的中间图。minifier 循环中module_fails会对每个裁剪候选图重新执行torch.export.export_aoti_compile_and_package_inner并运行只有仍能复现错误的裁剪才会被保留无法 export 的图会被视为“不失败”minifier 继续搜索见export_for_aoti_minifier。运行 minify 命令的输出保持commandminify运行minifier_launcher.py输出如下... W1031 16:48:08.938000 3598491 torch/_dynamo/repro/aoti.py:89] Writing checkpoint with 3 nodes to /data/users/shangdiy/pytorch/torch_compile_debug/run_2024_10_31_16_48_02_720863-pid_3598491/minifier/checkpoints/3.py W1031 16:48:08.975000 3598491 torch/_dynamo/repro/aoti.py:101] Copying repro file for convenience to /data/users/shangdiy/pytorch/repro.py Wrote minimal repro out to repro.pyminifier 每裁剪到一个更小的图就会写一个带节点数的 checkpointcheckpoints/N.pyN 为节点数最终把最小复现拷贝到当前目录的repro.py。对应实现在 aoti.py 的dump_compiler_graph_statecheckpoint 命名使用len(gm.graph.nodes)并shutil.copyfile到cwd/repro.py。遇到 AOTIMinifierError 时如果运行minifier_launcher.py本身抛出AOTIMinifierError说明 minifier 自身存在 bug而非被调试模型的问题。该异常定义于 aoti.py其消息明确提示“This error is caused by a bug in the AOTI minifier, please report a bug to PyTorch”并保留原始异常供排查。此时应携带minifier_launcher.py与相关 checkpoint 向 PyTorch 提交 bug 报告。最小化结果repro.pyminifier 运行成功后生成的repro.py头部以注释形式打印裁剪后的图文档示例# from torch.nn import * # class Repro(torch.nn.Module): # def __init__(self) - None: # super().__init__() # # def forward(self, linear): # relu torch.ops.aten.relu.default(linear); linear None # return (relu,)可以看到原始Linear → ReLU → Sigmoid的模型被成功裁剪到只剩 relu 一个节点——因为注入的错误正是发生在 relu 的 kernel 生成阶段minifier 精确锁定了出错算子。随后是完整可执行代码与minifier_launcher.py结构类似但注意两点差异增加了torch._inductor.config.generate_intermediate_hooks True便于在裁剪过程中保存/比较 eager 中间值config_patches{aot_inductor.package: True}且commandrun——即对最小图直接执行编译、打包、加载与运行验证错误可复现。repro.py可直接运行python repro.py。它与minifier_launcher.py的区别在于前者针对的是已经最小化的图复现用后者针对的是原始完整图继续裁剪用。配置项速查配置项环境变量默认值作用aot_inductor.dump_aoti_minifierDUMP_AOTI_MINIFIERFalse出错时是否 dump minifier 产物aot_inductor.repro_levelAOTINDUCTOR_REPRO_LEVEL2dump 触发策略1~4见上文表格torch._dynamo.config.debug_dir_root—torch_compile_debug/minifier 产物输出根目录triton.inject_relu_bug_TESTING_ONLY—无测试专用向 relu kernel 注入错误以验证 minifier总结AOTInductor Minifier 是 PyTorch 2.6 中调试 AOTI 编译错误的一站式工具开启aot_inductor.dump_aoti_minifier后任何 AOTI 编译/加载/运行异常都会自动生成minifier_launcher.py运行它即可通过 delta-debugging 自动把出错图裁剪到最小算子并产出可独立执行的repro.py。结合repro_level、--check-str、--offload-to-disk等参数开发者可以高效定位段错误、编译错误与精度问题并将最小复现随 bug 报告一起提交给 PyTorch 维护者。【免费下载链接】pytorchTensors and Dynamic neural networks in Python with strong GPU acceleration项目地址: https://gitcode.com/GitHub_Trending/py/pytorch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表