调试方法

    使用动转静功能时,您可以使用断点调试代码。 例如,在代码中,调用 pdb.set_trace()

    1. import pdb
    2. @paddle.jit.to_static
    3. def func(x):
    4. x = paddle.to_tensor(x)
    5. pdb.set_trace()
    6. if x > 3:
    7. x = x - 1
    8. return x

    执行以下代码,将会在转化后的静态图代码中使用调试器:

    1. func(np.ones([3, 2]))

    运行结果:

    1. > /tmp/tmpR809hf.py(6)func()
    2. -> def true_fn_0(x):
    3. (Pdb) n
    4. > /tmp/tmpR809hf.py(6)func()
    5. -> def false_fn_0(x):
    6. ...

    如果您想在原始的动态图代码中使用调试器,请先调用 ,如下:

    1. paddle.jit.ProgramTranslator().enable(False)
    2. func(np.ones([3, 2]))

    运行结果:

    您可以打印转换后的静态图代码,有2种方法:

      1. @paddle.jit.to_static
      2. def func(x):
      3. x = paddle.to_tensor(x)
      4. if x > 3:
      5. x = x - 1
      6. return x
      7. print(func.code)

      运行结果:

      1. def func(x):
      2. def true_fn_0(x):
      3. x = x - 1
      4. return x
      5. def false_fn_0(x):
      6. return x
      7. x = paddle.jit.dy2static.convert_ifelse(x > 3, true_fn_0, false_fn_0, (x,), (x,), (x,))
      8. return x
    1. 使用 set_code_level(level=100, also_to_stdout=False) 或环境变量 TRANSLATOR_CODE_LEVEL=level

      通过调用 set_code_level 或设置环境变量 TRANSLATOR_CODE_LEVEL,可以在日志中查看转换后的代码:

      1. @paddle.jit.to_static
      2. def func(x):
      3. x = paddle.to_tensor(x)
      4. if x > 3:
      5. x = x - 1
      6. return x
      7. paddle.jit.set_code_level() # 也可设置 os.environ["TRANSLATOR_CODE_LEVEL"] = '100',效果相同
      8. func(np.ones([1]))

      运行结果:

      1. 2020-XX-XX 00:00:00,980 Dynamic-to-Static INFO: After the level 100 ast transformer: 'All Transformers', the transformed code:
      2. def func(x):
      3. x = paddle.nn.functional.assign(x)
      4. def true_fn_0(x):
      5. x = x - 1
      6. return x
      7. def false_fn_0(x):
      8. return x
      9. x = paddle.jit.dy2static.convert_ifelse(x > 3, true_fn_0, false_fn_0, (x,), (x,), (x,))
      10. return x

      此外,如果您想将转化后的代码也输出到 , 可以设置参数 also_to_stdout 为 True,否则将仅输出到 sys.stderrset_code_level 函数可以设置查看不同的 AST Transformer 转化后的代码,详情请见 。

    print 函数可以用来查看变量,该函数在动转静中会被转化。当仅打印 Paddle Tensor 时,实际运行时会被转换为 Paddle 算子 Print,否则仍然运行 print

    运行结果:

    1. Variable: assign_0.tmp_0
    2. - lod: {}
    3. - place: CPUPlace
    4. - shape: [1]
    5. - layout: NCHW
    6. - dtype: double
    7. - data: [1]
    8. Here call print function.

    ProgramTranslator在日志中记录了额外的调试信息,以帮助您了解动转静过程中函数是否被成功转换。 您可以调用 ) 或设置环境变量 TRANSLATOR_VERBOSITY=level 来设置日志详细等级,并查看不同等级的日志信息。目前,level 可以取值0-3:

    • 1: 包括了动转静转化流程的信息,如转换前的源码、转换的可调用对象

    • 2: 包括以上信息,还包括更详细函数转化日志

    • 3: 包括以上信息,以及更详细的动转静日志

    注意:

    日志中包括了源代码等信息,请在共享日志前确保它不包含敏感信息。

    可以在代码运行前调用 paddle.jit.set_verbosity 控制日志详细程度:

    1. paddle.jit.set_verbosity(3)

    或者设置环境变量 TRANSLATOR_VERBOSITY

    1. import os
    2. os.environ["TRANSLATOR_VERBOSITY"] = '3'

    运行结果:

    1. 2020-XX-XX 00:00:00,123 Dynamic-to-Static INFO: (Level 1) Source code:
    2. @paddle.jit.to_static
    3. def func(x):
    4. x = paddle.to_tensor(x)
    5. if len(x) > 3:
    6. x = x - 1
    7. else:
    8. x = paddle.ones(shape=[1])
    9. return x