TensorCheckerConfig

class paddle.amp.debugging. TensorCheckerConfig ( enable, debug_mode=DebugMode.CHECK_NAN_INF_AND_ABORT, output_dir=None, checked_op_list=None, skipped_op_list=None, debug_step=None, stack_height_limit=1 ) [源代码]

该函数的目的是收集用于检查模块或运算符张量中 NaN 和 Inf 值的配置。

参数

  • enable(bool) : 布尔值,指示是否启用检测张量中的 NaN 和 Inf 值。默认值为 False,这意味着不使用这些工具。

  • debug_mode(DebugMode, 可选) : 确定要使用的调试类型的参数。默认 CHECK_NAN_INF_AND_ABORT,此模式打印或保存包含 NaN/Inf 的张量的关键信息,并中断程序。

  • output_dir(str, 可选) : 用于存储检查日志的文件路径,默认为 None。

  • checked_op_list(list|tuple, 可选) : 指定程序运行过程中需要检查的算子列表,例如 checked_op_list=['elementwise_add', 'conv2d'],表示程序运行过程中对 elementwise_add 和 conv2d 的输出结果进行 NaN/Inf 检查。默认为 None。

  • skipped_op_list(list|tuple, 可选) : 指定程序运行过程中不需要检查的算子列表,例如 skipped_op_list=['elementwise_add', 'conv2d'],表示程序运行过程中不对 elementwise_add 和 conv2d 的输出结果进行 NaN/Inf 检查。默认为 None。

  • debug_step(list|tuple, 可选) : 列表或元组,主要用于模型训练过程中的 NaN/Inf 检查。例如: debug_step=[1, 5] 表示只对模型训练迭代 1~5 之间进行 NaN/Inf 检查。默认为 None。

  • stack_height_limit(int, 可选) : 整数值,指定调用栈的最大深度。该功能支持在错误位置打印调用栈。目前仅支持开启或关闭调用栈打印。如果您想在 GPU Kernel 检测到 NaN 时打印相应的 C++ 调用栈,可以将 stack_height_limit 设置为 1,否则设置为 0。默认为 1。

代码示例

import paddle

checker_config = paddle.amp.debugging.TensorCheckerConfig(enable=True, debug_mode=paddle.amp.debugging.DebugMode.CHECK_NAN_INF)
paddle.amp.debugging.enable_tensor_checker(checker_config)

x = paddle.to_tensor([1, 0, 3], place=paddle.CPUPlace(), dtype='float32', stop_gradient=False)
y = paddle.to_tensor([0.2, 0, 0.5], place=paddle.CPUPlace(), dtype='float32')
res = paddle.pow(x, y)
paddle.autograd.backward(res, retain_graph=True)
paddle.amp.debugging.disable_tensor_checker()

#[PRECISION] [ERROR] in [device=cpu, op=elementwise_pow_grad, tensor=, dtype=fp32], numel=3, num_nan=1, num_inf=0, num_zero=0, max=2.886751e-01, min=2.000000e-01, mean=-nan

# when DebugMode.CHECK_NAN_INF_AND_ABORT and stack_height_limit = 1
#Traceback (most recent call last):
#    res = paddle.pow(x, y)
#  File "/usr/local/lib/python3.8/dist-packages/paddle/tensor/math.py", line 447, in pow
#    return _C_ops.elementwise_pow(x, y)