训练速度很慢,比torch的慢两倍之多,如何解决?
收藏
今天改了师兄给的一个模型。从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
收藏
请登录后评论
同样的batch size下看看两个框架的显存占用是不是类似呢?还有精度问题
显存占用只相差100兆左右。
注释掉模型训练的所有内容,只进行数据加载。发现:
测试数据加载速度,发现torch 加载速度为330-400it/s,而paddle加载速度为150-200it/s。
我认为是数据加载的问题。
如何像torch那样,在关键的地方(模型预测推理)用gpu处理,而数据加载先用cpu处理,训练时再送入GPU呢?你平时是怎么加载数据的呢?
数据读取器那里的线程数都是一样的嘛?
一样的。
刚刚做了一个测试,一些重要的操作要比torch的慢很多。。
数据加载这块。我解决了。把__getitem__中原来用paddle进行的计算,比如rot90什么的,改成np,最后处理完再to_tensor,这样数据加载的速度要快很多,甚至超越了torch。
解决完数据加载这块之后,发现训练速度还是慢。于是我把模块的每个部分进行耗时计算测试。
发现涉及到Conv2D这样的重要操作,让我这个模型慢了很多。
于是我把Conv2D操作和BatchNorm2D操作单独拎出来测试,发现果然是这些重要的操作出了问题。
https://github.com/PaddlePaddle/Paddle/issues/44682
刚刚在github上提出了issue
这是个大问题啊,看看到底因为啥吧
我遇到过
把cudnn版本升级一下
我猜你是cuda10.X
cudnn7.6.5
把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的动态图调度性能会大福提升。”
可能跟动态计算图有关。
请问这里是指数据增强吗?数据增强就是用transforms库里的啊
是的。就是把用paddle对tensor格式的数据增强,改为用Numpy来进行数据增强再转为tensor会快一点。
比如要对一个已经处理为tensor格式的图像进行旋转90度。
可以先使用numpy进行旋转,最后一步再转为tensor。
paddle.rot90(tensor数据)换成paddle.to_tensor(np.rot90(将tensor转为numpy的数据))会快一点。
懂了,想我的RandomResizedCrop,RandomHorizontalFlip等也可以用numpy实现,将结果to_tensor即可,谢谢楼主,我倒是去试试
看明白了,看起来是框架内的调用问题,估计是这些op的实现不够高效吧。
cy