
PyPTO 精度调试之 pass_verify_printPass 验证阶段的条件化中间数据打印实战【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pyptopypto.pass_verify_print是 CANN PyPTO 提供的 Pass 验证Verify调试接口用于在精度调试过程中将指定 Tensor、符号标量或任意 Python 对象的计算值打印到控制台与日志。本文以该接口为核心完整介绍其产品支持范围、函数原型、参数语义与约束并结合仓库源码与测试用例说明其底层实现PrintIf / OP_DUMP、与pass_verify_save的差异以及从开关使能到结果分析的完整实战流程帮助开发者在算子输出异常时快速定位首个出现问题的计算节点。产品支持情况pass_verify_print当前在以下产品上获得支持Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品支持Atlas A2 训练系列产品/Atlas A2 推理系列产品支持支持情况在仓库的 API 文档中通过 npu 标识950、A3、910b分别标记与同目录下的 pypto-pass_verify_save、pypto-set_verify_options 保持一致即这些产品上均可使用整套 Verify 精度调试能力。功能说明在精度调试 Verify 特性使能时pass_verify_print用于保存/输出指定 Tensor 计算的结果到数据文件文档表述或直接打印到控制台与日志从源码实现看其底层为条件打印。它是 PyPTO 精度定位“中间结果分析”环节的关键工具当 Tensor Graph 校验粗检失败时可使用pass_verify_print/pass_verify_save打印、保存模拟计算的中间数据通过对比中间数据找出潜在出问题的计算操作实现 Pass 阶段的正确性自检详见 精度调试指南。需要特别说明的是从源码实现看该接口只影响日志输出不改变任何计算结果属于纯调试副作用操作。在 verify.py 的 docstring 中明确写道This API is intended forpass verificationand has no effect on numerical results. It only affects log output.因此可以安全地插入到任意计算流程中无需担心影响算子数值。函数原型pass_verify_print(*values, cond: Union[int, SymbolicScalar] 1) - None位置参数*values可变长参数可同时传入多个待打印对象关键字参数cond打印条件默认值为 1即默认无条件打印。参数说明参数名输入/输出说明*values输入含义指定打印的数据或信息。说明pypto.Tensor打印 tensor 的数据int/pypto.SymbolicScalar打印相应的值其他 Python 对象打印相应的字符串表示。类型List[pypto.Tensor, int, pypto.SymbolicScalar, Object]取值范围NA默认值NAcond输入含义指定打印数据满足的条件。说明表达式计算结果为 1打印指定数据表达式计算结果为 0不打印数据该参数可省略省略时使用默认值不支持显式传入 None。类型Union[int, pypto.SymbolicScalar]取值范围0, 1默认值1参数处理细节源码视角从 verify.py 的实现可以看到*values中的每个元素在打印前会被分类格式化pypto.Tensor包括底层_impl.Tensor收集到 tensor 列表格式串中对应{T}由后端以紧凑的 tensor 格式打印int/pypto.SymbolicScalar通过to_sym()转为符号标量格式串中对应{S}其他 Python 对象直接str(v)转为字符串拼入格式串例如pass_verify_print(tensor_a, step, 10)中的 step与10。最终拼接出完整格式串fmt将cond也经to_sym()归一化后调用底层_impl.PrintIf(cond_base, fmt, tensors, scalars)。该绑定在 operation.cpp 中定义最终落到框架侧npu::tile_fwk::experimental::Print(cond, format, tensors, scalars)。cond支持传入SymbolicScalar意味着可以在pypto.loop循环中使用循环变量构造打印条件例如cond(idx 5)实现“仅在某次迭代打印”。返回值说明无None。约束说明该函数需在设置pypto.set_verify_options(enable_pass_verifyTrue)后生效。也就是说如果没有使能 Verify 特性pass_verify_print调用不会产生预期的打印输出。使能方式有两种见 set_verify_options 文档全局调用pypto.set_verify_options(enable_pass_verifyTrue)在pypto.frontend.jit(verify_options{...})装饰器中传入verify_options字典。此外还有一条重要事实依据从 ir.cpp 的 AggressiveDCE激进死代码消除Pass 实现可见pass_verify_print/pass_verify_save对应的 IR opcode 为OP_DUMPOP_PRINT 类其在 DCE 中被显式判定为“不可删除”——因为该类语句没有 result tensor 但属于副作用操作side-effect ops必须保留。这从编译器层面保证了插入的打印/保存语句不会被优化掉。调用示例原文档示例完整保留verify_options { enable_pass_verify: True, } pypto.frontend.jit(verify_optionsverify_options) def user_kernel(input0: pypto.Tensor, input1: pypto.Tensor, output: pypto.Tensor): ... for idx in pypto.loop(10): t0 pypto.tensor(...) t1 pypto.tensor(...) t2 pypto.SOME_OP1(t0, t1) pypto.pass_verify_print(t2) t3 pypto.SOME_OP2(t0, t2) pypto.pass_verify_print(t3, cond(idx 5)) ...该示例展示了两个典型用法pypto.pass_verify_print(t2)无条件打印中间张量t2pypto.pass_verify_print(t3, cond(idx 5))仅当循环变量idx 5时打印t3避免大量无关迭代刷屏。混合打印标量与文本结合源码 docstring 中的示例pass_verify_print还支持在一条调用中混合打印 Tensor、标量与文本 pass_verify_print(tensor_a, step, 10) # 打印 tensor 与文本、整数 for idx in pypto.loop(10): ... pass_verify_print(idx, idx, cond(idx 0)) # 仅打印 idx0 的迭代与 pass_verify_save 的配合使用pass_verify_print负责打印中间数据pass_verify_save负责将 Tensor存盘{fname}.data为数据、{fname}.csv为 shape/dtype 元数据二者同属 Verify 的“中间结果分析”能力函数原型与参数风格高度一致cond语义相同均默认 1、均不支持显式 None。当需要逐元素数值分析如检查 inf/nan、偏移规律时通常用pass_verify_save落盘后用torch.from_file()、numpy.load()读取当需要快速人工观察某次迭代的结果时用pass_verify_print直接打印。详见 pypto-pass_verify_save。完整实战流程从使能到结果分析1. 开启 Verify 开关verify_options { enable_pass_verify: True, pass_verify_save_tensor: True, ... } pypto.frontend.jit(verify_optionsverify_options) def add_kernel( input0: pypto.Tensor((1, 4, 1, 64), pypto.DT_FP32), input1: pypto.Tensor((1, 4, 1, 64), pypto.DT_FP32), out: pypto.Tensor((1, 4, 1, 64), pypto.DT_FP32), ): pypto.set_vec_tile_shapes(1, 4, 1, 64) out[:] input0 input1相关verify_options参数完整说明见 set_verify_options 文档参数名类型默认值说明enable_pass_verifyboolFalse总体使能开关决定所有pass_verify_*选项和接口是否生效。必须为True才能让其他参数生效pass_verify_save_tensorboolFalse是否将模拟计算数据存盘为True时在{work_path}/output/output_*/下生成verify_*目录pass_verify_save_tensor_dirstr{RUNNING_DIR}/output/output_{TS}检测结果及数据的保存路径可指定绝对路径pass_verify_pass_filterList[str]空待自检的 Pass 名称列表。默认校验 pass:[ExpandFunction, ProcessAtomic, L1CopyInReuseMerge, InferDynShape, PreGraphProcess, InferParamIndex, CodegenPreproc]指定all校验所有 pass指定[]不校验 pass 只校验 tensor_graph指定非法名称则忽略pass_verify_error_tolList[float][1e-3, 1e-3]精度对比容差第一个值为 rtol第二个值为 atol列表长度不等于 2 时使用默认值2. 在 kernel 中插入 pass_verify_printpypto.frontend.jit(verify_optionsverify_options) def add_kernel( input0: pypto.Tensor((1, 4, 1, 64), pypto.DT_FP32), input1: pypto.Tensor((1, 4, 1, 64), pypto.DT_FP32), out: pypto.Tensor((1, 4, 1, 64), pypto.DT_FP32), ): pypto.set_vec_tile_shapes(1, 4, 1, 64) # 打印中间结果到控制台 pypto.pass_verify_print(input0) out[:] input0 input1 def add(input_data0, input_data1, out): add_kernel(input_data0, input_data1, out) def test_add(): shape (1, 4, 1, 64) input_data0 torch.rand(shape, dtypetorch.float, devicenpu) input_data1 torch.rand(shape, dtypetorch.float, devicenpu) out torch.empty(shape, dtypetorch.float, devicenpu) add(input_data0, input_data1, out)3. 执行用例并观察输出python3 examples/00_hello_world/hello_world.py控制台打印示例Tensor 以紧凑格式输出首行包含 shape 与 dtype 信息input0:1x4x1x64xFP32/1x4x1x64xFP32 [[0.03955 0.6094 0.1519 ... 0.7339 0.8789 0.8662] [0.6284 0.01465 0.6333 ... 0.2422 0.03516 0.8423] ... [0.3184 0.8047 0.833 ... 0.7734 0.2578 0.1392]]注意pass_verify_print/pass_verify_save输出的是tensor graph 验证阶段在主机 CPU 上模拟计算的结果与实际在 NPU 上板执行的结果可能存在差异其定位用途是算法逻辑验证见 精度调试指南。4. 结合 Verify 结果日志定位问题校验结果默认写入{work_path}/output/output_*/verify_*/interpreter.logcat $(ls -td output/output_*/verify_* 2/dev/null | head -n 1)/interpreter.log[EVENT]行表示通过PASS或跳过NO_COMPARE[ERROR]行表示未通过FAILED例如Pass_09_SplitLargeFanoutTensor ... result FAILED如需将日志同时镜像到终端可设置环境变量ASCEND_SLOG_PRINT_TO_STDOUT1。当 tensor_graph 校验失败时结合pass_verify_print打印的中间数据逐段对比即可定位首个出现异常的计算节点。仓库中的相关测试用例可参考 test_verify_frontend_jit.pyNPU 上板的 verify golden 对比与 test_verify.py含pass_verify_print/pass_verify_save在 loop 中的使用样例。常见问题与注意事项打印无输出确认enable_pass_verifyTrue已通过set_verify_options或jit(verify_options...)正确使能cond传 None 报错该参数不支持显式传入None省略即使用默认值 1打印不影响数值该接口仅作用于日志/输出OP_DUMP类语句在 AggressiveDCE 中被保留不会影响计算图优化结果循环中打印过多建议使用cond(idx N)之类的条件仅打印关键迭代避免日志刷屏定位场景优先用于 Tensor Graph 校验失败后的中间结果分析若需落盘做数值级分析改用 pass_verify_save。总结pass_verify_print是 PyPTO 精度调试链路中成本最低、最直接的“观测探针”通过verify_options使能、在 kernel 中一行插入、按需用cond控制打印节奏即可在 Pass 模拟计算阶段快速观测任意中间 Tensor 与符号标量。其底层由PrintIfOP_DUMP 副作用语句支撑在编译器 DCE 中不会被误删配合 set_verify_options、pass_verify_save 与 精度调试整体流程可帮助开发者系统化地完成“粗检 → Pass 自检 → 中间结果分析”的精度问题定界。【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考