39 archive.read(
"model_script", val);
43 c10::IValue ival_types_of_dicts;
44 archive.read(
"types_of_dicts", ival_types_of_dicts);
45 const c10::List<c10::IValue>& types_of_dicts = ival_types_of_dicts.toList();
47 m_dicts.resize(types_of_dicts.size());
48 for (
size_t i = 0; i <
m_dicts.size(); i++)
50 std::ostringstream dict_id;
51 dict_id <<
"dict_" << i;
53 if (!types_of_dicts.get(i).isString())
55 throw std::runtime_error(
"Error in static graph");
57 const std::string& dict_type = types_of_dicts.get(i).toStringRef();
60 if (archive.try_read(dict_id.str(), v))
64 throw std::runtime_error(
"Error in static graph");
67 if (dict_type == UInt64Dict::class_id())
69 m_dicts[i] = std::make_shared<UInt64Dict>();
71 else if (dict_type == WstringDict::class_id())
73 m_dicts[i] = std::make_shared<WstringDict>();
75 else if (dict_type == StringDict::class_id())
77 m_dicts[i] = std::make_shared<StringDict>();
79 else if (dict_type == Char32Dict::class_id())
81 m_dicts[i] = std::make_shared<Char32Dict>();
85 throw runtime_error(
"Unknown dict type.");
96 if (archive.try_read(
"tags", v))
98 if (!v.isGenericDict())
100 throw runtime_error(
"\"tags\" must be a dict of strings.");
103 c10::Dict<c10::IValue, c10::IValue> d = v.toGenericDict();
104 for (
const auto &it : d )
106 if (!it.key().isString())
108 std::cerr <<
"ERROR: keys in \"tags\" dict must be strings" << endl;
110 if (!it.value().isString())
112 std::cerr <<
"ERROR: values in \"tags\" dict must be strings" << endl;
115 if (
m_tags.end() !=
m_tags.find(it.key().toStringRef()))
117 throw std::runtime_error(
"Duplicated tags in the model");
120 m_tags[it.key().toStringRef()] = it.value().toStringRef();
124 torch::nn::Module::load(archive);
203 stringstream ss(script);
206 while (getline(ss, line))
208 if (line.size() == 0)
215 if (step.m_type == step_descr_t::def)
225 for (
const string& name : step.m_names )
229 throw std::runtime_error(
"Error in static graph");
236 vector<string> input_tensor_names =
parse_list(step.m_args[
"input"],
',');
237 for (
const string& name : input_tensor_names )
242 throw std::runtime_error(
"Error in static graph");
244 op.m_inputs.push_back(it->second);
249 case step_descr_t::forward:
251 string module_name = get_option<string>(step.m_args,
"module");
255 throw std::runtime_error(
"Error in static graph");
258 switch (module_ref.
m_type)
260 case module_type_t::embedding:
263 vector<size_t>& inputs = op.m_inputs;
264 vector<size_t>& outputs = op.m_outputs;
266 if (inputs.size() != 1 || outputs.size() != 1)
268 throw std::runtime_error(
"Error in static graph");
271 op.m_fn = [&m, inputs, outputs](context_t& ctx)
273 auto out = m->forward(ctx.m_tensors[inputs[0]]);
276 ctx.m_tensors[outputs[0]] = out;
281 case module_type_t::lstm:
284 const vector<size_t>& inputs = op.m_inputs;
285 const vector<size_t>& outputs = op.m_outputs;
287 if (inputs.size() < 1)
289 throw std::runtime_error(
"Error in static graph");
292 op.m_fn = [&m, inputs, outputs](context_t& ctx)
295 torch::optional<std::tuple<torch::Tensor, torch::Tensor>> h0_and_c0;
296 if (inputs.size() > 1)
298 if (3 == inputs.size())
300 h0_and_c0 = { ctx.m_tensors[inputs[1]], ctx.m_tensors[inputs[2]] };
304 throw std::runtime_error(
"Error in static graph");
307 auto out = m->forward(ctx.m_tensors[inputs[0]], h0_and_c0);
309 if (outputs.size() > 0)
311 ctx.m_tensors[outputs[0]] = std::get<0>(out);
313 if (outputs.size() > 1)
315 ctx.m_tensors[outputs[1]] = std::get<0>(std::get<1>(out));
316 if (outputs.size() > 2)
318 ctx.m_tensors[outputs[2]] = std::get<1>(std::get<1>(out));
319 if (outputs.size() > 3)
321 throw std::runtime_error(
"Error in static graph");
330 case module_type_t::linear:
333 vector<size_t>& inputs = op.m_inputs;
334 vector<size_t>& outputs = op.m_outputs;
336 if (inputs.size() != 1 || outputs.size() != 1)
338 throw std::runtime_error(
"Error in static graph");
341 op.m_fn = [&m, inputs, outputs](context_t& ctx)
343 auto out = m->forward(ctx.m_tensors[inputs[0]]);
344 ctx.m_tensors[outputs[0]] = out;
349 case module_type_t::dropout:
352 vector<size_t>& inputs = op.m_inputs;
353 vector<size_t>& outputs = op.m_outputs;
355 if (inputs.size() != 1 || outputs.size() != 1)
357 throw std::runtime_error(
"Error in static graph");
360 op.m_fn = [&m, inputs, outputs](context_t& ctx)
362 auto out = m->forward(ctx.m_tensors[inputs[0]]);
365 ctx.m_tensors[outputs[0]] = out;
370 case module_type_t::deep_biaffine_attention_decoder:
372 torch_modules::DeepBiaffineAttentionDecoder& m
374 vector<size_t>& inputs = op.m_inputs;
375 vector<size_t>& outputs = op.m_outputs;
377 if (inputs.size() != 1 || outputs.size() != 1)
379 throw std::runtime_error(
"Error in static graph");
382 op.m_fn = [&m, inputs, outputs](context_t& ctx)
384 auto out = m->forward(ctx.m_tensors[inputs[0]]);
385 ctx.m_tensors[outputs[0]] = out;
390 case module_type_t::deep_biaffine_attention_label_decoder:
392 torch_modules::DeepBiaffineAttentionLabelDecoder& m
394 vector<size_t>& inputs = op.m_inputs;
395 vector<size_t>& outputs = op.m_outputs;
397 if (inputs.size() != 1 || outputs.size() != 1)
399 throw std::runtime_error(
"Error in static graph");
402 op.m_fn = [&m, inputs, outputs](context_t& ctx)
404 auto out = m->forward(ctx.m_tensors[inputs[0]]);
405 ctx.m_tensors[outputs[0]] = out;
411 throw std::runtime_error(
"Error in static graph");
416 case step_descr_t::cat:
418 vector<size_t>& inputs = op.m_inputs;
419 vector<size_t>& outputs = op.m_outputs;
420 int64_t dim = atoi(step.m_args[
"dim"].c_str());
422 if (inputs.size() == 0 || outputs.size() != 1)
424 throw std::runtime_error(
"Error in static graph");
427 op.m_fn = [inputs, outputs, dim](context_t& ctx)
429 std::vector<torch::Tensor> input_tensors;
430 input_tensors.resize(inputs.size());
431 for (
size_t i = 0; i < inputs.size(); i++)
433 input_tensors[i] = ctx.m_tensors[inputs[i]];
436 auto out = torch::cat(input_tensors, dim);
437 ctx.m_tensors[outputs[0]] = out;
442 case step_descr_t::reshape:
444 vector<size_t>& inputs = op.m_inputs;
445 vector<size_t>& outputs = op.m_outputs;
446 const auto shape = step.m_iargs[
"dims"];
448 if (inputs.size() == 0 || outputs.size() != 1)
450 throw std::runtime_error(
"Error in static graph");
453 op.m_fn = [inputs, outputs, shape](context_t& ctx)
457 auto out = torch::reshape(ctx.m_tensors[inputs[0]], shape);
459 ctx.m_tensors[outputs[0]] = out;
464 case step_descr_t::unbind:
466 vector<size_t>& inputs = op.m_inputs;
467 vector<size_t>& outputs = op.m_outputs;
468 int64_t dim = atoi(step.m_args[
"dim"].c_str());
470 if (inputs.size() != 1)
472 throw std::runtime_error(
"Error in static graph");
475 op.m_fn = [inputs, outputs, dim](context_t& ctx)
478 auto out = torch::unbind(ctx.m_tensors[inputs[0]], dim);
480 if (outputs.size() != out.size())
482 throw std::runtime_error(
"Error in static graph");
484 for (
size_t j = 0; j < out.size(); ++j)
486 ctx.m_tensors[outputs[j]] = out[j];
492 case step_descr_t::unsqueeze:
494 vector<size_t>& inputs = op.m_inputs;
495 vector<size_t>& outputs = op.m_outputs;
496 int64_t dim = atoi(step.m_args[
"dim"].c_str());
498 if (inputs.size() != 1 || outputs.size() != 1)
500 throw std::runtime_error(
"Error in static graph");
503 op.m_fn = [inputs, outputs, dim](context_t& ctx)
505 auto out = torch::unsqueeze(ctx.m_tensors[inputs[0]], dim);
506 ctx.m_tensors[outputs[0]] = out;
511 case step_descr_t::log_softmax:
513 vector<size_t>& inputs = op.m_inputs;
514 vector<size_t>& outputs = op.m_outputs;
516 if (step.m_iargs.end() != step.m_iargs.find(
"dim"))
518 dim = step.m_iargs.find(
"dim")->second[0];
521 if (inputs.size() != 1 || outputs.size() != 1)
523 throw std::runtime_error(
"Error in static graph");
526 op.m_fn = [inputs, outputs, dim](context_t& ctx)
528 auto in = ctx.m_tensors[inputs[0]];
529 ctx.m_tensors[outputs[0]] = torch::nn::functional::log_softmax(in, dim);
534 case step_descr_t::sigmoid:
536 vector<size_t>& inputs = op.m_inputs;
537 vector<size_t>& outputs = op.m_outputs;
539 if (inputs.size() != 1 || outputs.size() != 1)
541 throw std::runtime_error(
"Error in static graph");
544 op.m_fn = [inputs, outputs](context_t& ctx)
546 ctx.m_tensors[outputs[0]] = ctx.m_tensors[inputs[0]].sigmoid();
552 throw std::runtime_error(
"Error in static graph");
557 for (
size_t out_idx : op.m_outputs )
561 throw std::runtime_error(
"Error in static graph");