64 virtual size_t init_new_worker(
size_t input_len,
bool precomputed_input=
false)
override
66 assert(Parent::m_wb.size() > 0);
67 assert(Parent::m_ops.size() > 0);
68 assert(Parent::m_ops.size() == Parent::m_params.size());
70 size_t new_worker_idx = Parent::m_wb[0].size();
71 for (
size_t i = 0; i < Parent::m_ops.size(); i++)
73 assert(Parent::m_wb[i].size() == new_worker_idx);
74 assert(
nullptr != Parent::m_params[i]);
75 Parent::m_wb[i].push_back(Parent::m_ops[i]->create_workbench(input_len, Parent::m_params[i], precomputed_input));
78 m_workbenches.push_back(std::make_shared<workbench_t>());
80 return new_worker_idx;
129 const Eigen::MatrixXf& inputs,
130 const Eigen::MatrixXf& input_feats,
132 int64_t output_max_len,
134 std::vector< uint32_t >& output,
135 const std::vector<std::string>&
138 assert(Parent::m_wb.size() > 0);
139 assert(worker_id < Parent::m_wb[0].size());
140 assert(m_workbenches.size() > worker_id);
143#ifdef LEMM_INFERENCE_PROFILE
144 using clock = std::chrono::system_clock;
145 using ms = std::chrono::duration<double, std::milli>;
150 auto p_linear_feats_enc = std::dynamic_pointer_cast<deeplima::eigen_impl::Op_Linear<Eigen::MatrixXf, Eigen::VectorXf, float>>(Parent::m_ops[5]);
152#ifdef LEMM_INFERENCE_PROFILE
153 const auto before = clock::now();
156 p_linear_feats_enc->execute(Parent::m_wb[5][worker_id],
161#ifdef LEMM_INFERENCE_PROFILE
162 const auto exec1 = clock::now();
166 auto p_linear_feats_dec = std::dynamic_pointer_cast<deeplima::eigen_impl::Op_Linear<Eigen::MatrixXf, Eigen::VectorXf, float>>(Parent::m_ops[3]);
168 p_linear_feats_dec->execute(Parent::m_wb[3][worker_id],
172#ifdef LEMM_INFERENCE_PROFILE
173 const auto exec2 = clock::now();
175 auto p_encoder = std::dynamic_pointer_cast<deeplima::eigen_impl::Op_BiLSTM<Eigen::MatrixXf, Eigen::VectorXf, float>>(Parent::m_ops[0]);
177 auto p_decoder = std::dynamic_pointer_cast<deeplima::eigen_impl::Op_LSTM_Beam_Decoder<Eigen::MatrixXf, Eigen::VectorXf, float>>(Parent::m_ops[4]);
179 auto enc_mutlilayer_bilstm
180 = std::dynamic_pointer_cast<const deeplima::eigen_impl::params_multilayer_bilstm_t<Eigen::MatrixXf, Eigen::VectorXf>>(Parent::m_params[0]);
181 size_t hidden_size = enc_mutlilayer_bilstm->layers[0].fw.weight_ih.rows() / 4;
195#ifdef LEMM_INFERENCE_PROFILE
196 std::cerr <<
"inputs.cols()=" << inputs.cols() << std::endl;
197 std::cerr <<
"inputs.rows()=" << inputs.rows() << std::endl;
199 const auto exec3 = clock::now();
202 p_encoder->execute(Parent::m_wb[0][worker_id],
203 inputs, Parent::m_params[0],
206#ifdef LEMM_INFERENCE_PROFILE
207 const auto exec4 = clock::now();
216 auto p_linear_h = std::dynamic_pointer_cast<deeplima::eigen_impl::Op_Linear<Eigen::MatrixXf, Eigen::VectorXf, float>>(Parent::m_ops[1]);
217 auto p_linear_c = std::dynamic_pointer_cast<deeplima::eigen_impl::Op_Linear<Eigen::MatrixXf, Eigen::VectorXf, float>>(Parent::m_ops[2]);
219#ifdef LEMM_INFERENCE_PROFILE
220 const auto exec5 = clock::now();
225#ifdef LEMM_INFERENCE_PROFILE
226 const auto exec6 = clock::now();
231#ifdef LEMM_INFERENCE_PROFILE
232 const auto exec7 = clock::now();
236 p_decoder->execute(Parent::m_wb[4][worker_id], decoder_embd,
238 Parent::m_params[4], 0x10FFFE, 0x10FFFF, 9, output, output_max_len);
240#ifdef LEMM_INFERENCE_PROFILE
241 const auto exec8 = clock::now();
243 std::cerr <<
"feats for enc : " << (exec1 - before).count() << std::endl;
244 std::cerr <<
"feats for dec : " << (exec2 - exec1).count() << std::endl;
246 std::cerr <<
"copy : " << (exec3 - exec2).count() << std::endl;
247 std::cerr <<
"encoder : " << (exec4 - exec3).count() << std::endl;
248 std::cerr <<
"copy : " << (exec5 - exec4).count() << std::endl;
250 std::cerr <<
"prep h : " << (exec6 - exec5).count() << std::endl;
251 std::cerr <<
"prep c : " << (exec7 - exec6).count() << std::endl;
252 std::cerr <<
"decoder : " << (exec8 - exec7).count() << std::endl;