LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
lemmatization_model.cpp
Go to the documentation of this file.
1// Copyright 2002-2021 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
8
10
11
13
14using namespace std;
15using namespace torch;
16using namespace deeplima::convert_from_torch;
17using namespace deeplima::eigen_impl;
18
19namespace deeplima
20{
21namespace lemmatization
22{
23namespace eigen_impl
24{
25
27{
28 // std::cerr << "BiRnnSeq2SeqEigenInferenceForLemmatization::convert_from_torch " << fn << std::endl;
30 try
31 {
32 torch::load(src, fn, torch::Device(torch::kCPU));
33 }
34 catch (const c10::Error& e)
35 {
36 std::cerr << "Exception while trying to load Torch model file " << fn << std::endl
37 << e.what_without_backtrace();
38 throw std::runtime_error(e.what_without_backtrace());
39 }
40
41 // dicts and embeddings
43
45 // upos found as fixed during training are retrieved here as string
46 vector<string> fixed_upos = utils::split(src.get_fixed_upos(), ' ');
47 m_fixed_upos.reserve(fixed_upos.size());
48 // store int representation of fixed upos
49 for (const string& s : fixed_upos)
50 {
52 }
53
54 // torch modules
55 Parent::m_lstm.reserve(src.get_layers_lstm().size());
56 for (size_t i = 0; i < src.get_layers_lstm().size(); i++)
57 {
58 const std::string name = src.get_module_name(i, "lstm");
59 Parent::m_lstm_idx[name] = i;
60
61 const nn::LSTM& m = src.get_layers_lstm()[i];
62 Parent::m_lstm.emplace_back(typename Parent::params_bilstm_spec_t());
63 typename Parent::params_bilstm_spec_t& layer = Parent::m_lstm.back();
64
66 }
67
68 Parent::m_multi_bilstm.emplace_back(std::make_shared<typename Parent::params_multilayer_bilstm_spec_t>(Parent::m_lstm));
69
70 Parent::m_linear.reserve(src.get_layers_linear().size());
71 for (size_t i = 0; i < src.get_layers_linear().size(); i++)
72 {
73 const std::string name = src.get_module_name(i, "linear");
74 Parent::m_linear_idx[name] = i;
75
76 const nn::Linear& m = src.get_layers_linear()[i];
79
81 }
82
83 // temp: create exec plan
84 // Encoder
86 // Parent::m_params.push_back(std::make_shared<params_multilayer_bilstm_t<Eigen::MatrixXf, Eigen::VectorXf>>());
87 // auto p_enc = std::dynamic_pointer_cast<params_multilayer_bilstm_t<Eigen::MatrixXf, Eigen::VectorXf>>(Parent::m_params.back());
88 // *p_enc = Parent::m_multi_bilstm[Parent::m_lstm_idx["encoder_lstm_0"]];
90
91
92 // Linear for decoder init state H
95 auto p_fc_h0 = std::dynamic_pointer_cast<params_linear_t<Eigen::MatrixXf, Eigen::VectorXf>>(Parent::m_params.back());
96 *p_fc_h0 = Parent::m_linear[Parent::m_linear_idx["interm_fc_h0"]];
97
98 // Linear for decoder init state C
101 auto p_fc_c0 = std::dynamic_pointer_cast<params_linear_t<Eigen::MatrixXf, Eigen::VectorXf>>(Parent::m_params.back());
102 *p_fc_c0 = Parent::m_linear[Parent::m_linear_idx["interm_fc_c0"]];
103
104 // Linear for features encoder
105 // input to decoder
108 auto p_fc_feats_dec = std::dynamic_pointer_cast<params_linear_t<Eigen::MatrixXf, Eigen::VectorXf>>(Parent::m_params.back());
109 *p_fc_feats_dec = Parent::m_linear[Parent::m_linear_idx["fc_cat2decoder"]];
110
111 // Decoder
114 auto p_dec = std::dynamic_pointer_cast<params_lstm_beam_decoder_t<Eigen::MatrixXf, Eigen::VectorXf>>(Parent::m_params.back());
115 p_dec->lstm = Parent::m_lstm[Parent::m_lstm_idx["decoder_lstm_0"]].fw;
116 p_dec->linear = Parent::m_linear[Parent::m_linear_idx["fc_output"]];
117
118 // Precompute all decoder's embeddings
119 Eigen::MatrixXf precomputed_embd_tensor = Eigen::MatrixXf::Zero(p_dec->lstm.weight_ih.rows(),
120 Parent::m_input_uint_dicts[1].get_tensor().cols());
121 std::shared_ptr<Op_LSTM_Beam_Decoder<Eigen::MatrixXf, Eigen::VectorXf, float>> decoder
122 = std::dynamic_pointer_cast<Op_LSTM_Beam_Decoder<Eigen::MatrixXf, Eigen::VectorXf, float>>(Parent::m_ops.back());
123 decoder->precompute_inputs(p_dec, Parent::m_input_uint_dicts[1].get_tensor(), precomputed_embd_tensor, 0);
124 Parent::m_input_uint_dicts[1].set_tensor(precomputed_embd_tensor);
125
126 // input to encoder
129 auto p_fc_feats_enc = std::dynamic_pointer_cast<params_linear_t<Eigen::MatrixXf, Eigen::VectorXf>>(Parent::m_params.back());
130 *p_fc_feats_enc = Parent::m_linear[Parent::m_linear_idx["fc_cat2encoder"]];
131
132 Parent::m_wb.resize(6);
133
134 // tags
135 // cerr << "TAGS:" << endl;
136 // for ( const auto& it : src.get_tags() )
137 // {
138 // cerr << "\t" << it.first << " = " << it.second << endl;
139 // }
140 // cerr << endl;
141}
142
143} // namespace eigen_impl
144} // namespace tagging
145} // namespace deeplima
146
std::vector< std::vector< std::shared_ptr< Op_Base::workbench_t > > > m_wb
std::vector< std::shared_ptr< Op_Base > > m_ops
virtual void convert_dicts_and_embeddings(const nets::BiRnnClassifierImpl &src)
std::map< std::string, size_t > m_linear_idx
std::vector< std::shared_ptr< params_multilayer_bilstm_spec_t > > m_multi_bilstm
std::map< std::string, size_t > m_lstm_idx
std::vector< params_linear_t< Eigen::MatrixXf, Eigen::VectorXf > > m_linear
std::vector< params_bilstm_spec_t > m_lstm
std::vector< std::shared_ptr< param_base_t > > m_params
const morph_model::morph_model_t & get_morph_model() const
size_t get_upos_id(const std::string &name) const
const std::vector< torch::nn::Linear > & get_layers_linear() const
const std::string get_module_name(size_t idx, const std::string &type) const
const std::vector< torch::nn::LSTM > & get_layers_lstm() const
void convert_module_from_torch(const torch::nn::LSTM &src, eigen_impl::params_bilstm_t< M, V > &dst)
std::vector< std::string > split(const std::string &str, char delim)
STL namespace.