From 1a1c54f3642f98f4265c72dec17acbe3d2588d2b Mon Sep 17 00:00:00 2001 From: Francesco Gatti Date: Sun, 16 Feb 2020 17:08:19 +0100 Subject: [PATCH] structure ok, result wrong --- include/tkDNN/Layer.h | 9 +++- src/LSTM.cpp | 103 ++++++++++++++++---------------------- tests/imuodom/imuodom.cpp | 4 +- 3 files changed, 55 insertions(+), 61 deletions(-) diff --git a/include/tkDNN/Layer.h b/include/tkDNN/Layer.h index f12027f..7e827d8 100644 --- a/include/tkDNN/Layer.h +++ b/include/tkDNN/Layer.h @@ -207,7 +207,9 @@ protected: /** Bidirectional LSTM layer - + ONLY BIDIRECTIONAL (TODO: more configurable) + currently implemented as 2 inferences: forward and backward (TODO: only 1 cudnn inference) + implementation info: https://github.com/jiangnanhugo/seq2seq_cuda/blob/e4dbdcfa0517c972bfd4beea9f11a5233954093c/src/rnn.cpp https://github.com/Jeffery-Song/mxnet-test/blob/aab666faad44011f7a67b527b5f6c960367d0422/src/operator/cudnn_rnn-inl.h @@ -261,6 +263,11 @@ protected: dnnType *w_ptr; dnnType *w_h; dnnType *wf_ptr, *wb_ptr; // params pointer forward and backward layer + + // used during inference + dataDim_t one_output_dim; // output dim of as single inference + dnnType *srcF, *srcB; // input of single inference + dnnType *dstF, *dstB_NR, *dstB; // output of single inference, dstB_NR = dstB not reversed }; diff --git a/src/LSTM.cpp b/src/LSTM.cpp index 00d8f76..44502fa 100644 --- a/src/LSTM.cpp +++ b/src/LSTM.cpp @@ -13,8 +13,6 @@ LSTM::LSTM( Network *net, int hiddensize, bool returnSeq, std::string fname_weig seqLen = input_dim.w; stateSize = hiddensize; - std::cout<<"LSTM seqLen: "< x_vec(seqLen); std::vector y_vec(seqLen); @@ -110,7 +108,7 @@ LSTM::LSTM( Network *net, int hiddensize, bool returnSeq, std::string fname_weig checkCUDNN(cudnnGetRNNParamsSize(net->cudnnHandle, rnnDesc,x_desc_vec_[0], &cudnn_param_size, net->dataType)); int cudnn_params = cudnn_param_size/sizeof(dnnType); - std::cout<<"LSTM params size: "<cudnnHandle, rnnDesc, i, x_desc_vec_[0], w_desc_, 0, j, m_desc, (void**)&p)); @@ -209,37 +217,27 @@ LSTM::~LSTM() { checkCuda(cudaFree(work_space_ )); checkCuda(cudaFree(dropout_states_)); + checkCuda(cudaFree(srcF)); + checkCuda(cudaFree(srcB)); + checkCuda(cudaFree(dstF)); + checkCuda(cudaFree(dstB_NR)); + checkCuda(cudaFree(dstB)); checkCuda(cudaFree(dstData)); } dnnType* LSTM::infer(dataDim_t &dim, dnnType* srcData) { - std::cout<<"LSTM infer\n"; + // transpose input + matrixTranspose(net->cublasHandle, srcData, srcF, dim.c, dim.h*dim.w*dim.l); - dnnType *trans; - checkCuda( cudaMalloc(&trans, dim.tot()*sizeof(dnnType))); - matrixTranspose(net->cublasHandle, srcData, trans, dim.c, dim.h*dim.w*dim.l); - srcData = trans; - - // reposition in invered order - dnnType *srcBack; - checkCuda( cudaMalloc(&srcBack, dim.tot()*sizeof(dnnType))); + // build srcB as reversed srcF for(int i=0; i