Skip to content
This repository has been archived by the owner on Jan 24, 2024. It is now read-only.

部分涉及property的运算存在问题 #169

Closed
zrr1999 opened this issue Jun 16, 2023 · 2 comments · Fixed by #171
Closed

部分涉及property的运算存在问题 #169

zrr1999 opened this issue Jun 16, 2023 · 2 comments · Fixed by #171

Comments

@zrr1999
Copy link
Member

zrr1999 commented Jun 16, 2023

def foo(cond: paddle.Tensor, x: paddle.Tensor):
    x += 1
    return x + x.size


def main():
    cond = paddle.to_tensor(True)
    x = paddle.to_tensor(0)
    dygraph_out = foo(cond, x)
    print("dygraph_out:", dygraph_out)

    symbolic_translate_out = symbolic_translate(foo)(cond, x)
    print("symbolic_translate_out:", symbolic_translate_out)
    np.testing.assert_allclose(
        dygraph_out.numpy(), symbolic_translate_out.numpy()
    )

期望和动态图有相同结果
image

实际上会报错
image

此时如果是 x + x.size() 结果会是正确的,但是动态图会报错(因为x.size是整数)

@SigureMo @2742195759

@SigureMo
Copy link
Member

SigureMo commented Jun 16, 2023

def getattr(self, name: str):
if name in ["shape", "dtype", "stop_gradient"]:
return VariableFactory.from_value(
getattr(self.meta, name),
self.graph,
tracker=GetAttrTracker(self, name),
)
elif name in paddle_tensor_methods:
from .callable import TensorFunctionVariable
fn_var = TensorFunctionVariable(
name, graph=self.graph, tracker=DanglingTracker()
)
return fn_var.bind(self, name)
elif name in ["T", "ndim", "size"]:
return getattr(self, name)
else:
raise InnerError(f"Unknown Tensor attribute: {name}")

elif name in ["T", "ndim", "size"]:

将这个分支上调即可

这是因为 paddle_tensor_methods 是从 paddle.static.Variable 自动获取的,在 Variable 上 size 是一个 method 而不是 property,故而走错分支

我之后的 PR 应该会顺手修一下这个~

@zrr1999
Copy link
Member Author

zrr1999 commented Jun 16, 2023

def getattr(self, name: str):
if name in ["shape", "dtype", "stop_gradient"]:
return VariableFactory.from_value(
getattr(self.meta, name),
self.graph,
tracker=GetAttrTracker(self, name),
)
elif name in paddle_tensor_methods:
from .callable import TensorFunctionVariable
fn_var = TensorFunctionVariable(
name, graph=self.graph, tracker=DanglingTracker()
)
return fn_var.bind(self, name)
elif name in ["T", "ndim", "size"]:
return getattr(self, name)
else:
raise InnerError(f"Unknown Tensor attribute: {name}")

elif name in ["T", "ndim", "size"]:

将这个分支上调即可

这是因为 paddle_tensor_methods 是从 paddle.static.Variable 自动获取的,在 Variable 上 size 是一个 method 而不是 property,故而走错分支

我之后的 PR 应该会顺手修一下这个~

好滴,明白啦

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

Successfully merging a pull request may close this issue.

2 participants