Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

建议exporter.py中translate_graph函数采用deepcopy(model)避免deepcopy出现Dynamic-to-Static信息 #1237

Open
GuoQuanhao opened this issue Mar 21, 2023 · 1 comment

Comments

@GuoQuanhao
Copy link

在使用add_graph后使用deepcopy出现Dynamic-to-Static

import paddle
from copy import deepcopy

from visualdl import LogWriter

net = paddle.nn.Linear(10, 10)
with LogWriter(logdir="./log/graph_test/") as writer:
    writer.add_graph(
        model=net,
        input_spec=[paddle.static.InputSpec([-1, 10], 'float32')],
        verbose=True)

B = deepcopy(net)
Tue Mar 21 17:23:47 Dynamic-to-Static INFO: (Level -1) Not recommend to deepcopy 'Linear' decorated with @to_static, it has side effect that will rollback into original state before @to_static. Please deepcopy 'Linear' before applying @to_static.
-------------------------Graph Summary--------------------------
total operators: 4	total layers:1
--------------------  --------------------  --------------------  
Name                  Type                  Count                 
--------------------  --------------------  --------------------  
feed                  operator              1                     
matmul_v2             operator              1                     
elementwise_add       operator              1                     
fetch                 operator              1                     
Linear                layer                 1                     
----------------------------------------------------------------

发现在exporter.py中translate_graph中采用model = paddle.jit.to_static(model, input_spec),如果使用deepcopy(model),就不会出现警告

import paddle
from copy import deepcopy

from visualdl import LogWriter

net = paddle.nn.Linear(10, 10)
with LogWriter(logdir="./log/graph_test/") as writer:
    writer.add_graph(
        model=deepcopy(net), # 采用deepcopy
        input_spec=[paddle.static.InputSpec([-1, 10], 'float32')],
        verbose=True)

B = deepcopy(net)
-------------------------Graph Summary--------------------------
total operators: 4	total layers:1
--------------------  --------------------  --------------------  
Name                  Type                  Count                 
--------------------  --------------------  --------------------  
feed                  operator              1                     
matmul_v2             operator              1                     
elementwise_add       operator              1                     
fetch                 operator              1                     
Linear                layer                 1                     
----------------------------------------------------------------

建议translate_graph使用deepcopy(model)

def translate_graph(model, input_spec, verbose=True):
    model = deepcopy(model)
    import paddle
    with tempfile.TemporaryDirectory() as tmp:
        model._full_name = '{}[{}]'.format(model.__class__.__name__, "model")
        create_opname_scope(model)
        model = paddle.jit.to_static(model, input_spec)
        paddle.jit.save(model, os.path.join(tmp, 'temp'))
        model_data = open(os.path.join(tmp, 'temp.pdmodel'), 'rb').read()
        result = analyse_model(model_data)
    if verbose:
        print_model(result)
    result = json.dumps(result, indent=2)
    return result
@rainyfly
Copy link
Collaborator

rainyfly commented Apr 2, 2023

请问出现需要deepcopy的场景一般是什么呢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants