From 6c330850188c9237b6d6d70674c1a0e087f779d9 Mon Sep 17 00:00:00 2001 From: liutuo Date: Wed, 20 Feb 2019 09:57:43 +0800 Subject: [PATCH] add dynamic lstm cell support kaldi tdnn-lstm support logsoftmax add ifdefined op add dynamic lstm docs --- docs/development/dynamic_lstm.md | 24 ++ docs/development/imgs/DynamicLSTM.png | Bin 0 -> 61424 bytes docs/development/imgs/FuseLSTM.png | Bin 0 -> 115261 bytes mace/benchmark/statistics.cc | 3 + mace/ops/arm/fp32/gemv.cc | 4 +- mace/ops/common/lstm.cc | 75 ++++ mace/ops/common/lstm.h | 37 ++ mace/ops/dynamic_lstm.cc | 332 ++++++++++++++++++ mace/ops/dynamic_lstm_benchmark.cc | 124 +++++++ mace/ops/lstm_nonlinear.cc | 113 ++++++ mace/ops/lstm_nonlinear_benchmark.cc | 85 +++++ mace/ops/opencl/buffer/softmax.h | 5 + mace/ops/opencl/cl/softmax.cl | 12 + mace/ops/opencl/cl/softmax_buffer.cl | 12 + mace/ops/opencl/image/softmax.h | 6 + mace/ops/ops_registry.cc | 8 +- mace/ops/{time_offset.cc => pad_context.cc} | 47 ++- mace/ops/pad_context_benchmark.cc | 79 +++++ mace/ops/pad_context_test.cc | 87 +++++ mace/ops/pnorm.cc | 2 - mace/ops/pnorm_benchmark.cc | 2 +- mace/ops/slice.cc | 11 +- mace/ops/slice_benchmark.cc | 76 ++++ mace/ops/softmax.cc | 45 ++- mace/ops/softmax_test.cc | 54 ++- mace/ops/splice.cc | 55 +-- mace/ops/splice_benchmark.cc | 9 +- mace/ops/splice_test.cc | 18 +- mace/ops/time_offset_benchmark.cc | 78 ---- mace/ops/time_offset_test.cc | 125 ------- .../tools/converter_tool/base_converter.py | 6 +- .../tools/converter_tool/onnx_converter.py | 108 +++++- .../tools/converter_tool/transformer.py | 13 +- mace/utils/math.h | 25 +- 34 files changed, 1356 insertions(+), 324 deletions(-) create mode 100644 docs/development/dynamic_lstm.md create mode 100644 docs/development/imgs/DynamicLSTM.png create mode 100644 docs/development/imgs/FuseLSTM.png create mode 100644 mace/ops/common/lstm.cc create mode 100644 mace/ops/common/lstm.h create mode 100644 mace/ops/dynamic_lstm.cc create mode 100644 mace/ops/dynamic_lstm_benchmark.cc create mode 100644 mace/ops/lstm_nonlinear.cc create mode 100644 mace/ops/lstm_nonlinear_benchmark.cc rename mace/ops/{time_offset.cc => pad_context.cc} (53%) create mode 100644 mace/ops/pad_context_benchmark.cc create mode 100644 mace/ops/pad_context_test.cc create mode 100644 mace/ops/slice_benchmark.cc delete mode 100644 mace/ops/time_offset_benchmark.cc delete mode 100644 mace/ops/time_offset_test.cc diff --git a/docs/development/dynamic_lstm.md b/docs/development/dynamic_lstm.md new file mode 100644 index 00000000..f7d24a62 --- /dev/null +++ b/docs/development/dynamic_lstm.md @@ -0,0 +1,24 @@ +Dynamic LSTM +================== + + +The DynamicLSTM in MACE is implemented for Kaldi's time delay RNN models. + +The following pictures explain how to fuse components into a DynamicLSTMCell. + +Before fusing: + +
+how to fuse lstm +
+ + +After fusing: + +
+DynamicLSTM +
+ + +For more details about LSTMNonlinear in Kaldi, +please refer to [LstmNonlinearComponent](http://kaldi-asr.org/doc/nnet-simple-component_8h_source.html#l02164) \ No newline at end of file diff --git a/docs/development/imgs/DynamicLSTM.png b/docs/development/imgs/DynamicLSTM.png new file mode 100644 index 0000000000000000000000000000000000000000..98351988b559aed3690252719181a57101bf866f GIT binary patch literal 61424 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