几个月前,我将基于LSTM的低级图重写为热切的形式,并且性能上的差异令人惊讶。
我使用tqdm来确定运行时间,并且它急切地要慢20:1。我两者都使用tf.data.Dataset,当然,区别在于在图形中使用迭代器,在渴望中使用循环。
所有应该放在类的初始化中的东西(我为LSTM创建了一个自定义的tf.keras.Model类。
所有矩阵乘法都是通过张量完成的,而不是numpy数组,因此我认为这不是CPU-> GPU问题。
还有其他想法供我尝试吗?我从下面的eager程序中获得了来自cProfile的最昂贵呼叫的前50行。这是在gtx 1070上运行的。
Ordered by: cumulative time
List reduced from 4335 to 50 due to restriction <50>
ncalls tottime percall cumtime percall filename:lineno(function)
1435/1 0.100 0.000 145.364 145.364 {built-in method builtins.exec}
1 0.001 0.001 145.364 145.364 <string>:1(<module>)
1 0.000 0.000 145.361 145.361 rnn.py:153(main)
1 0.075 0.075 140.358 140.358 rnn.py:108(train)
2800 0.077 0.000 136.772 0.049 rnn.py:94(update)
2920 0.032 0.000 65.949 0.023 base_layer.py:677(__call__)
2920 1.429 0.000 65.879 0.023 rnn_models.py:184(call)
2055097 58.464 0.000 58.568 0.000 {built-in method _pywrap_tensorflow_internal.TFE_Py_FastPathExecute}
2800 0.035 0.000 34.264 0.012 backprop.py:823(gradient)
2800 0.003 0.000 34.091 0.012 imperative_grad.py:31(imperative_grad)
2800 5.599 0.002 34.088 0.012 {built-in method _pywrap_tensorflow_internal.TFE_Py_TapeGradient}
753200 1.628 0.000 26.387 0.000 backprop.py:97(_gradient_function)
17520 0.107 0.000 20.513 0.001 rnn_models.py:5(predict)
664560 0.971 0.000 19.277 0.000 gen_math_ops.py:4527(mat_mul)
2800 0.600 0.000 18.325 0.007 rnn.py:80(logger)
66125 0.149 0.000 15.834 0.000 deprecation.py:454(new_func)
227760 2.082 0.000 15.713 0.000 math_ops.py:1875(matmul)
20320 0.241 0.000 13.568 0.001 nn_ops.py:1635(_softmax)
17520 0.071 0.000 13.486 0.001 nn_ops.py:1719(softmax)
218400 0.814 0.000 13.307 0.000 math_grad.py:1087(_MatMulGrad)
111974 0.160 0.000 13.132 0.000 summary_ops_v2.py:410(scalar)
111974 0.603 0.000 12.972 0.000 summary_ops_v2.py:357(summary_writer_function)
2800 0.376 0.000 12.848 0.005 optimizer.py:526(apply_gradients)
99400 1.276 0.000 12.661 0.000 array_ops.py:395(_slice_helper)
1034571 2.396 0.000 11.690 0.000 ops.py:1055(internal_convert_to_tensor)
35040 0.181 0.000 10.079 0.000 nn_ops.py:1657(_swap_axis)
111974 0.164 0.000 9.743 0.000 smart_cond.py:27(smart_cond)
36400 0.113 0.000 9.633 0.000 optimizer.py:159(update_op)
36400 0.347 0.000 9.489 0.000 adam.py:163(_resource_apply_dense)
825485 0.430 0.000 8.853 0.000 ops.py:993(convert_to_tensor)
227066 0.958 0.000 8.475 0.000 math_ops.py:859(binary_op_wrapper)
230409 0.276 0.000 7.261 0.000 ops.py:834(_copy_nograd)
36400 0.068 0.000 7.056 0.000 gen_training_ops.py:1195(resource_apply_adam)
2800 0.037 0.000 7.018 0.003 losses_impl.py:740(softmax_cross_entropy)
230409 6.930 0.000 6.930 0.000 {method '_copy_to_device' of 'tensorflow.python.framework.ops.EagerTensor' objects}
22374 0.188 0.000 6.925 0.000 summary_ops_v2.py:373(record)
858687 0.984 0.000 6.811 0.000 constant_op.py:116(constant)
18 0.000 0.000 6.320 0.351 __init__.py:16(<module>)
87600 0.785 0.000 6.276 0.000 math_ops.py:1177(range)
22374 0.075 0.000 5.786 0.000 summary_ops_v2.py:430(function)
10 0.000 0.000 5.671 0.567 __init__.py:21(<module>)
99400 0.249 0.000 5.612 0.000 array_ops.py:582(strided_slice)
99400 0.169 0.000 5.327 0.000 gen_array_ops.py:8176(strided_slice)
864527 3.574 0.000 4.944 0.000 constant_op.py:71(convert_to_eager_tensor)
184665 0.478 0.000 4.836 0.000 ops.py:724(numpy)
40640 0.079 0.000 4.664 0.000 array_ops.py:1030(concat)
663506 0.315 0.000 4.587 0.000 constant_op.py:225(_constant_tensor_conversion_function)
40640 0.205 0.000 4.567 0.000 gen_array_ops.py:1010(concat_v2)
45744 0.217 0.000 4.547 0.000 ops.py:849(_copy)
298200 0.194 0.000 4.396 0.000 array_ops.py:820(stack)