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
phi::Device::SynchronizeStream传入的stream的raw_stream成员为空指针是否是正常的? #63804
Comments
@ronny1996 辛苦大佬帮忙看一下 |
你好,出现raw_stream=0并且传到了插件runtime中是不正常的,能否打开 GLOG_v=10 上传下第一次出现raw_stream=0并传到memcpy中的日志 |
尝试过开启GLOG_v=10,但是可能是因为这个问题是偶现的,或者是别的原因,开启GLOG时没有遇到coreddump的情况。目前尝试了下注释掉phi::CustomDevice::Finalize和phi::CustomDevice::DeInitDevice,跑了几次没遇到coredump,怀疑可能是设备已经去初始化了导致stream被置空?我再打印下Finalize和DeInitDevice的信息,有进展再同步给您吧 |
另外补充一下,应该是raw_stream还没传入插件侧就已经挂了,因为raw stream为空的话应当是同步null 流,同步null流应该不会导致coredump。并且报错调用栈信息也是没有进到插件侧的流同步api的 |
@continue-coding 你好,请问下,raw_stream为空只有训练完成才出现,还是过程中也会出现? 这里好像是过程中也会出现? |
目前是只有训练完成时会出现,因为都是以训练100步的场景来触发的,所以这张图里其实是已经在训练快结束的时候了。 |
能在 Paddle/paddle/phi/backends/stream.cc 这个文件里会导致修改 stream_ 值的函数里都打下日志吗?怀疑可能哪个地方修改了 |
set_stream这里吗?已经加过了 Paddle/paddle/phi/backends/stream.cc Line 111 in 13caba9
|
raw_stream被置空的原因找到了,虽然我注释掉了destroy stream的操作,但是phi::stream::Stream::Destroy()还有将stream_置为空指针的操作。 Paddle/paddle/phi/backends/stream.cc Line 111 in 13caba9
那么问题就剩下为什么会去同步一个已被销毁的stream了?不知道把这里的锁提到Destroy前面能不能解决这个问题 Paddle/paddle/phi/backends/stream.cc Line 39 in 13caba9
|
@ronny1996 大佬,这个问题有什么好的解决方法吗?我之前在SynchronizeStream中增加遇到raw_stream为空即返回的方式只是个权宜之计,有什么从根本上解决问题的方法吗? |
@continue-coding 能把Paddle/PaddleCustomDevice的commit以及复现的方法发下吗?我们查一下 你们可以临时解决下,可以在python里手动把dataloader清理掉 |
1.我们是内部基于Paddle自定义硬件接入功能实现的插件,代码还没开源,所以无法提供给您。主框架我们是基于paddle的release/2.6分支做的。 |
@ronny1996 能麻烦您评估下我们目前的处理方式,即在SynchronizeStream中增加遇到raw_stream为空即返回的逻辑,可以临时解决这个问题吗?这个方法有没有什么风险? |
这样也可以,但是后续的操作可能还会抛错,这和硬件的runtime有关。还有一种方式是finalize被调用时设置一个标志位,插件runtime里接入的api都去判断这个标志位,true就直接返回,不去调用硬件runtime 手动调用直接del dataloader对象,应该能保证python退出时,dataloader线程都结束了 |
您说的finalize是这里吗?
目前打印的日志看到finalize在memcpyh2d之后,所以不太能确定设置标志位是否可以拦截到。不过我打印finalize的位置是在调用插件的finalize api返回之后,我试下在finalize一开始就设置标志位看看是否可行吧。 手动del dataloader对象,您是指比如在下面这个位置,train返回时手动销毁dataloader吗?如果是的话可能需要修改的模型套件会比较多,可能不是通用的解决方法? |
你好,finalize确实可能在memcpyh2d之后,可以先按照你们的方法,在sync_stream里判断stream是否为空,如果有其他api报错,应该是相似问题,可能也得修改下。这个问题我们后面会修复。 |
大佬好,我试过在Finalize和DeInitDevice中设置标志位,但是没有奏效。 |
请提出你的问题 Please ask your question
我在使用custom device训练ppocr-det模型时遇到了训练结束时偶尔会发生coredump的情况,报错调用栈如下:
因为是在SynchronizeStream处挂掉的,我打印了传入SynchronizeStream的stream,发现发生coredump时传入SynchronizeStream的raw_stream都是空指针。
之后我在SynchronizeStream的开始阶段加入判断逻辑:如果传入的raw_stream是空指针就返回,不做流同步。
这样修改后不会再发生coredump,可见coredump是因为传入SynchronizeStream的raw_stream为空指针导致的。
所以我比较好奇传给SynchronizeStream的raw_stream为空是正常的行为吗?如果是异常行为,那我在SynchronizeStream中添加的遇空返回的处理方式是否是可行的?会不会造成别的影响?
烦请飞桨的大佬帮助解答我的疑惑,谢谢!
The text was updated successfully, but these errors were encountered: