PaddleSOT icon indicating copy to clipboard operation
PaddleSOT copied to clipboard

调整 `paddle.jit.not_to_static` 装饰范围

Open SigureMo opened this issue 2 years ago • 1 comments

我们目前会将整个 SIR 函数用 paddle.jit.to_static 包装

https://github.com/PaddlePaddle/PaddleSOT/blob/3ca867a6ac2254063ff103ca0b53e63f0d014d50/symbolic_trace/symbolic/compile_cache.py#L43-L48

将其转换为动转静的 StaticFunction,转换的函数中主体逻辑就是利用 Interpreter 解释 SIR,进行组网,由于这部分可能有些动转静会出问题的语法,因此使用了 paddle.jit.not_to_static 进行装饰

https://github.com/PaddlePaddle/PaddleSOT/blob/3ca867a6ac2254063ff103ca0b53e63f0d014d50/symbolic_trace/symbolic/interpreter.py#L71-L83

然而实际情况我们有些 API 仍然需要 to_static 的代码转换,比如 paddle.to_tensor,因此我们希望不利用 paddle.jit.not_to_static 将整个函数装饰,而是只装饰部分,避免部分代码动转静转写出问题,并将组网代码进行转换

SigureMo avatar Jun 06 '23 07:06 SigureMo

一些思路

paddle.jit.not_to_static 的实现原理是:会给被装饰的函数动态添加一个CONVERSION_OPTIONS 的属性,然后在动转静触发代码AST转写的convert_call 函数里的convert_to_static 模块里优先判断一个 function/method 对象是否有CONVERSION_OPTIONS 属性,如果有,则直接返回,不做AST Transformer。

此Task的目的是通过额外的一些标记手段(比如扩展CONVERSION_OPTIONS),以保证在convert_call函数里,仅不对当前被装饰的函数做AST Transformer,但内层调用的其他函数依旧进行AST Transformer,即@not_to_static 仅生效在当前函数,忽略内层函数调用。

Aurelius84 avatar Jun 13 '23 09:06 Aurelius84