Created by: GaoWei8
PR types
Bug fixes
PR changes
OPs
Describe
- 修改的问题:
- 去除了kernel中scope的使用。
- 修改了cudnn维度参数的重复使用,去除不必要的cudnn定义。
- 为了保持原来模型不出现问题,Python端接口保留max_len接口,但是c++ kernel的相关使用用seq_len替代。
- 新增支持double类型。
- 增加输入Input和InitH的维度判断。
- 目前存在的问题:
- 和pytorch对比,目前数据类型为float时,单层多向的精度到e-4, 多层单向的精度到e-5, 单层单向和多层多向的结果和pytorch一致。数据类型为double时,可以对齐到e-16。根据代码修改内容,初步判断是反向计算存在问题,在下一个PR中进一步排查。
- 和pytorch对齐的过程中,有两个地方不太一样,一个是cudnnRNNBackwardData接口的使用;另外一个是pytorch存在bias接口的使用。
需要approve的用法list:
-
no_check_set_white_list.py,LSTM需要StateOut端口保存前向计算的中间结果用于反向计算,不需要进行输出结果检查。@cryoco
-
Op accuracy problem,目前为了项目进展,先设置阈值较大,下一个PR会进一步排查精度问题,去除特殊设置阈值,使用默认值。@juncaipeng
-
const_cast<Tensor *>(state_out)是因为cudnn接口只接受非const指针,因此先将state_out转换为非const Tensor,自动调用非const data()函数。 @Xreki
-
此接口是LSTM的cudnn版本,因此只用于GPU上,因此使用+@unittest.skipIf(not core.is_compiled_with_cuda()。@kolinwei
-
FP64反向精度存在问题,暂时设置max_relative_error=1e-4,后期会去掉阈值特殊设置,使用默认值。@Xreki
Profiler结果
- 修改前:
------------------------- Overhead Summary -------------------------
Total time: 9742.42
Computation time Total: 9250.88 Ratio: 94.9546%
Framework overhead Total: 491.54 Ratio: 5.04535%
------------------------- GpuMemCpy Summary -------------------------
GpuMemcpy Calls: 0 Total: 0 Ratio: 0%
------------------------- Event Summary -------------------------
Event Calls Total CPU Time (Ratio) GPU Time (Ratio) Min. Max. Ave. Ratio.
thread0::cudnn_lstm 10000 8817.09 7337.540486 (0.832195) 1479.549055 (0.167805) 0.821531 14.6746 0.881709 0.90502
thread0::fill_constant 20000 874.6 849.240787 (0.971005) 25.359282 (0.028995) 0.027807 4.73596 0.04373 0.0897723
thread0::feed 10000 50.7322 50.732196 (1.000000) 0.000000 (0.000000) 0.004421 0.030364 0.00507322 0.00520735
- 修改后profiler结果:
------------------------- Overhead Summary -------------------------
Total time: 9602.53
Computation time Total: 9164.98 Ratio: 95.4433%
Framework overhead Total: 437.557 Ratio: 4.55668%
------------------------- GpuMemCpy Summary -------------------------
GpuMemcpy Calls: 0 Total: 0 Ratio: 0%
------------------------- Event Summary -------------------------
Event Calls Total CPU Time (Ratio) GPU Time (Ratio) Min. Max. Ave. Ratio.
thread0::cudnn_lstm 10000 8728.52 7257.042156 (0.831417) 1471.476728 (0.168583) 0.804817 16.0509 0.872852 0.908981
thread0::fill_constant 20000 828.185 802.617943 (0.969129) 25.566844 (0.030871) 0.025697 4.09784 0.0414092 0.0862465
thread0::feed 10000 45.8286 45.828579 (1.000000) 0.000000 (0.000000) 0.003988 0.099758 0.00458286 0.00477255