Canjie-Luo / MORAN_v2

MORAN: A Multi-Object Rectified Attention Network for Scene Text Recognition
MIT License
638 stars 152 forks source link

cpu占用率过高 #57

Closed starsummer closed 5 years ago

starsummer commented 5 years ago

32核服务器 num_workers为2的时候,cpu占用率1600%,100batch平均21s num_workers为0的时候,cpu占用率1300%,100batch平均29s 你们的也是如此吗?

gzhcv commented 5 years ago

差不多,我也是。 32核服务器 workers=2 的时候 cpu占用率1500%左右, 100batch平均24s。(Titan X)

starsummer commented 5 years ago

占用的GPU内存也就两个G左右,可能是部分计算没有放到GPU上跑

gzhcv commented 5 years ago

@starsummer 是吗,你找到是哪部分了吗。训练速度受CPU性能影响很大啊,一台服务器上同时跑多个模型速度降的很多。 @Canjie-Luo 这个问题有改进的办法吗

Canjie-Luo commented 5 years ago

@gzhcv 这个恐怕是PyTorch的分布式训练问题,多卡训练不是线性加速的,但是速度降的有点快...我也有点困惑

gzhcv commented 5 years ago

@Canjie-Luo 我不是指的多卡训练,这个代码本来只支持单卡嘛? 因为CPU占用率很高,我同时开两个程序训练模型的话速度会降很多(因为每个程序能占用的CPU核数变少了,而训练速度直接受制于CPU核数的使用量)

gzhcv commented 5 years ago

@Canjie-Luo 这个问题的原因是不是 @starsummer 所说的那样呢?(我对pytorch不熟,刚用)

Canjie-Luo commented 5 years ago

@gzhcv 每张图片进去的时候都要resize一下,这个处理过程也是follow CRNN的,可能是这个地方耗费了CPU的算力?

gzhcv commented 5 years ago

@Canjie-Luo 我再跟一下代码

starsummer commented 5 years ago

是FP的地方消耗了算力,去掉FP就正常了,是不是因为FP中每一次forward都有大量的numpy操作? torch被称为numpy的GPU替代,不知是因为torch能够让numpy的操作可以在gpu中运行,还是torch能够替代numpy

Canjie-Luo commented 5 years ago

我这边关掉了FP,好像还是差不多。FP应该也有更快速的实现,不过目前我粗略看了一下PyTorch的文档,还没有这么快速的操作。另外,我更新了一下代码,修复了一个关于FP的bug。

starsummer commented 5 years ago

是我理解错了,只计算MORAN的前向过程的话,test为True的话,cpu占用100%,正常。test为False的话,cpu占用就会飙升到1600%。代码中这两块的区别主要有两处,一个是FP过程,还有一个是attention那。我刚刚试了一下,去掉FP后cpu占用率还是超高,难不成是attention那?emmmm,看不出attention这有什么问题啊

Canjie-Luo commented 5 years ago

最近和另一位朋友在修改并行化代码,不知道您有没有意愿参与?或许也可以解决这个问题。

vc384 commented 5 years ago

我有把您的Attention 直接并行话,基本没有提速,不知道是不是Attention解码里面有某些操作打破了并行特性。另外,pytorch的并行话不友好,CTC上我有做多GPU加速,单卡0.2s/iter,双卡就到0.3s/iter,四卡也是0.3/iter,我用mxnet可以达到基本线性的并行效果

gzhcv commented 5 years ago

@vc384 我也是,没有提速。我还怀疑瓶颈在数据读取那里呢,正在尝试改进。您要是有兴趣的话,咱们拉个群讨论一下

starsummer commented 5 years ago

好啊,非常乐意,可以加下我微信哇kee5216 @Canjie-Luo

vc384 commented 5 years ago

@gzhcv 可以,WeChat ID: vc384384, 不过我空余时间不多,交流一下倒是没问题

starsummer commented 5 years ago

image 把asrn_res.py中三个torch.zeros函数都加上device=torch.device('cuda'),就正常了。 可能时因为在计算num_steps和num_labels时,用的是cpu,torch.zeros默认使用the current device