-
Notifications
You must be signed in to change notification settings - Fork 5.6k
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
There is bug when use parallel executor and memory optimization in some case. #11605
Comments
感觉memory optimizer这种改名字的方法让人夜不能寐呀。很多地方都有用var名字作为map key,或者把var name放开set里面,感觉就是assume名字是唯一的 |
我觉得是某些Op读了它的输出导致的。。我们改下单测框架,让这个测试严格一些。 |
https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/layers/nn.py#L4220
reshape_op这里默认是in-place操作,C++里输入、输出Tensor共享了指针,输入输出的Variable name不同。 测试将这里 inplace 默认设置为False,使用 |
in-place还是需要用memory_optimize统一管理,重新写的memory_optimize从图上分析依赖,接管了inplace。 如果真的是inplace导致的问题,推导一下过程。 假设inplace的内存刚好也被memory reuse了(替换为其他non-live的内存,记为op_x的输出)。那么就相当于要求当前执行的op不仅和被复用的op满足上述条件,而且要求和op_x输出变量的消费者也满足上述条件。因为在memory_optimize之后,相当于有更多op输入消费了同一块内存。拓扑排序满足这个条件更难了,所以可能出错。 这个猜测需要验证一下 |
感觉memory_optimize assume所有op都不能inplace操作。如果op inplace操作,memory_optimize分析出来将来不会被消费的var1,他的空间可能会被其他的var2使用 (memory optimize无法发现)。memory_optimize如果判读var3复用var1,就可能出错。 但是,并没有什么东西限制op inplace操作 |
This issue has been fixed, it is caused by the reshape op inplace. |
related PR. #12414 |
在人脸检测模型中,有2个复杂的loss,如下:
使用了 fluid.memory_optimize,即使设置上面要fetch的face_loss, head_loss, loss的persistable=True,输出的loss结果依然不对。
为了验证问题,做了一下实验:
fluid.memory_optimize
他时,输出的face_loss和fead_loss【相同】:fluid.memory_optimize
】, 也设置上述需要fetch的变量persistable=True,输出face_loss和head_loss输出【不同】:fluid.memory_optimize
】也设置上述需要fetch的变量persistable=True,输出face_loss和head_loss输出【相同】。所以,
fluid.memory_optimize
有对graph的分析,复用一些Var。ParallelExecutor
中也有依赖一个SSA的graph来运行op。ParallelExecutor+fluid.memory_optimize
结合在这种复杂的、有很多分支的网络中有bug。The text was updated successfully, but these errors were encountered: