首页 Paddle框架 帖子详情
训练速度很慢,比torch的慢两倍之多,如何解决?
收藏
快速回复
Paddle框架 问答炼丹技巧 2281 17
训练速度很慢,比torch的慢两倍之多,如何解决?
收藏
快速回复
Paddle框架 问答炼丹技巧 2281 17

今天改了师兄给的一个模型。从torch转为paddle了,大多数地方没有变动。做的大多数就是把torch.cat为paddle.concat,conv2d换为conv2D之类的操作。在一个60000张图像的训练集进行训练。torch每秒能进行2.7次迭代处理,paddle只能每秒1.2次迭代。总体训练一轮,用paddle框架要比torch慢8小时。 你们有没有遇到过这样的情况。

我个人感觉是因为paddle一开始就用的是gpu,全局为gpu感觉确实会比torch那样慢很多。因为torch在关键的地方会进行.cuda操作,有一部分数据运行是用cpu处理的。而paddle默认就指定用GPU了,所以就很慢。我也这只是进行理论分析,不知道合理不合理。

所有操作都是在自己本机操作的,GPU为3080.

你们有没有遇到过类似的情况。如何处理的?

 

 

0
收藏
回复
全部评论(17)
时间顺序
老狼Max
#2 回复于2022-07

同样的batch size下看看两个框架的显存占用是不是类似呢?还有精度问题

0
回复
d
dreamTyou
#3 回复于2022-07
同样的batch size下看看两个框架的显存占用是不是类似呢?还有精度问题

显存占用只相差100兆左右。

注释掉模型训练的所有内容,只进行数据加载。发现:

测试数据加载速度,发现torch 加载速度为330-400it/s,而paddle加载速度为150-200it/s。

我认为是数据加载的问题。

如何像torch那样,在关键的地方(模型预测推理)用gpu处理,而数据加载先用cpu处理,训练时再送入GPU呢?你平时是怎么加载数据的呢?

0
回复
李长安
#4 回复于2022-07

数据读取器那里的线程数都是一样的嘛?

0
回复
d
dreamTyou
#5 回复于2022-07
数据读取器那里的线程数都是一样的嘛?

一样的。

刚刚做了一个测试,一些重要的操作要比torch的慢很多。。

0
回复
d
dreamTyou
#6 回复于2022-07
数据读取器那里的线程数都是一样的嘛?

数据加载这块。我解决了。把__getitem__中原来用paddle进行的计算,比如rot90什么的,改成np,最后处理完再to_tensor,这样数据加载的速度要快很多,甚至超越了torch。

解决完数据加载这块之后,发现训练速度还是慢。于是我把模块的每个部分进行耗时计算测试。

发现涉及到Conv2D这样的重要操作,让我这个模型慢了很多。

于是我把Conv2D操作和BatchNorm2D操作单独拎出来测试,发现果然是这些重要的操作出了问题。

https://github.com/PaddlePaddle/Paddle/issues/44682

刚刚在github上提出了issue

0
回复
李长安
#7 回复于2022-07

这是个大问题啊,看看到底因为啥吧

0
回复
z
zzzzhelp995
#8 回复于2022-07

我遇到过

0
回复
z
zzzzhelp995
#9 回复于2022-07

把cudnn版本升级一下

我猜你是cuda10.X

cudnn7.6.5

0
回复
z
zzzzhelp995
#10 回复于2022-07

把cudnn升到8.0.4左右

0
回复
李长安
#11 回复于2022-07

所以是底层依赖的问题?

0
回复
d
dreamTyou
#12 回复于2022-07
把cudnn升到8.0.4左右

用的是11.1的cuda,配套的8.xx的cudnn。

我提了2个issue

https://github.com/PaddlePaddle/Paddle/issues/44682

这个的回答是“照理说不应该出现这种情况,调用的cudnn接口是一样的”

https://github.com/PaddlePaddle/Paddle/issues/44675

另一个issue的回答是,“这个会在2.4解决。2.4的动态图调度性能会大福提升。”

 
0
回复
d
dreamTyou
#13 回复于2022-07
李长安 #11
所以是底层依赖的问题?

可能跟动态计算图有关。

0
回复
thgpddl
#14 回复于2022-07
数据加载这块。我解决了。把__getitem__中原来用paddle进行的计算,比如rot90什么的,改成np,最后处理完再to_tensor,这样数据加载的速度要快很多,甚至超越了torch。 解决完数据加载这块之后,发现训练速度还是慢。于是我把模块的每个部分进行耗时计算测试。 发现涉及到Conv2D这样的重要操作,让我这个模型慢了很多。 于是我把Conv2D操作和BatchNorm2D操作单独拎出来测试,发现果然是这些重要的操作出了问题。 https://github.com/PaddlePaddle/Paddle/issues/44682 刚刚在github上提出了issue
展开

请问这里是指数据增强吗?数据增强就是用transforms库里的啊

0
回复
d
dreamTyou
#15 回复于2022-07
thgpddl #14
请问这里是指数据增强吗?数据增强就是用transforms库里的啊

是的。就是把用paddle对tensor格式的数据增强,改为用Numpy来进行数据增强再转为tensor会快一点。

比如要对一个已经处理为tensor格式的图像进行旋转90度。

可以先使用numpy进行旋转,最后一步再转为tensor。

paddle.rot90(tensor数据)换成paddle.to_tensor(np.rot90(将tensor转为numpy的数据))会快一点。

 

0
回复
thgpddl
#16 回复于2022-07
dreamTyou #15
是的。就是把用paddle对tensor格式的数据增强,改为用Numpy来进行数据增强再转为tensor会快一点。 比如要对一个已经处理为tensor格式的图像进行旋转90度。 可以先使用numpy进行旋转,最后一步再转为tensor。 paddle.rot90(tensor数据)换成paddle.to_tensor(np.rot90(将tensor转为numpy的数据))会快一点。  
展开

懂了,想我的RandomResizedCrop,RandomHorizontalFlip等也可以用numpy实现,将结果to_tensor即可,谢谢楼主,我倒是去试试

0
回复
李长安
#17 回复于2022-07
dreamTyou #13
可能跟动态计算图有关。

看明白了,看起来是框架内的调用问题,估计是这些op的实现不够高效吧。

0
回复
T
Tedoliy
#18 回复于2022-09

cy

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户