diff --git a/source/api_cc/src/DeepPotPD.cc b/source/api_cc/src/DeepPotPD.cc index ebabfc66e1..a77cd5d1e8 100644 --- a/source/api_cc/src/DeepPotPD.cc +++ b/source/api_cc/src/DeepPotPD.cc @@ -10,480 +10,9 @@ #include "device.h" #include "common.h" #include "paddle/include/paddle_inference_api.h" -// #include "glog/logging.h" using namespace deepmd; -template -static void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - const AtomMap& atommap, - const int nframes, - const int nghost = 0) { - // printf("run_model 1 st\n"); - unsigned nloc = atommap.get_type().size(); - unsigned nall = nloc + nghost; - // printf("nloc = %d, nall = %d\n", nloc, nall); - dener.resize(nframes); - if (nloc == 0) { - // no backward map needed - // dforce of size nall * 3 - dforce_.resize(static_cast(nframes) * nall * 3); - fill(dforce_.begin(), dforce_.end(), (VALUETYPE)0.0); - // dvirial of size 9 - dvirial.resize(static_cast(nframes) * 9); - fill(dvirial.begin(), dvirial.end(), (VALUETYPE)0.0); - return; - } - - /* Running inference */ - // printf("Running inference st\n"); - if (!predictor->Run()) { - throw deepmd::deepmd_exception("Paddle inference failed"); - } - // printf("Running inference ed\n"); - - auto output_names = predictor->GetOutputNames(); - // for (auto &name: output_names) - // { - // printf("output name: %s, shape: [", name.c_str()); - // auto shape = predictor->GetOutputHandle(name)->shape(); - // for (auto &dd: shape) - // { - // printf("%d, ", dd); - // } - // printf("]\n"); - // } - auto output_e = predictor->GetOutputHandle(output_names[1]); - auto output_f = predictor->GetOutputHandle(output_names[2]); - auto output_virial_tensor = predictor->GetOutputHandle(output_names[4]); - - // 获取 Output paddle::Tensor 的维度信息 - std::vector output_energy_shape = output_e->shape(); - int output_energy_size = - std::accumulate(output_energy_shape.begin(), output_energy_shape.end(), 1, - std::multiplies()); - std::vector output_force_shape = output_f->shape(); - int output_force_size = - std::accumulate(output_force_shape.begin(), output_force_shape.end(), 1, - std::multiplies()); - std::vector output_virial_shape = output_virial_tensor->shape(); - int output_virial_size = - std::accumulate(output_virial_shape.begin(), output_virial_shape.end(), 1, - std::multiplies()); - // for (int i=0; i oe; - // printf("Resize st\n"); - oe.resize(output_energy_size); - // printf("Resize ed\n"); - // printf("CopytoCpu st\n"); - output_e->CopyToCpu(oe.data()); - // printf("Resize st\n"); - // printf("CopytoCpu ed\n"); - // get data of output_force - // printf("of\n"); - std::vector of; - of.resize(output_force_size); - output_f->CopyToCpu(of.data()); - // get data of output_virial - // printf("oav\n"); - std::vector oav; - oav.resize(output_virial_size); - // printf("oav 2\n"); - output_virial_tensor->CopyToCpu(oav.data()); - // printf("oav 22\n"); - - // printf("dvirial\n"); - std::vector dforce(nframes * 3 * nall); - dvirial.resize(nframes * 9); - for (int ii = 0; ii < nframes; ++ii) { - // printf("oe[%d] = %.5lf\n", ii, oe[ii]); - dener[ii] = oe[ii]; - } - for (int ii = 0; ii < nframes * nall * 3; ++ii) { - dforce[ii] = of[ii]; - } - // set dvirial to zero, prevent input vector is not zero (#1123) - // printf("fill\n"); - std::fill(dvirial.begin(), dvirial.end(), (VALUETYPE)0.); - for (int kk = 0; kk < nframes; ++kk) { - for (int ii = 0; ii < nall; ++ii) { - dvirial[kk * 9 + 0] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 0]; - dvirial[kk * 9 + 1] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 1]; - dvirial[kk * 9 + 2] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 2]; - dvirial[kk * 9 + 3] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 3]; - dvirial[kk * 9 + 4] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 4]; - dvirial[kk * 9 + 5] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 5]; - dvirial[kk * 9 + 6] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 6]; - dvirial[kk * 9 + 7] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 7]; - dvirial[kk * 9 + 8] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 8]; - } - } - dforce_ = dforce; - // printf("atommap.backward\n"); - atommap.backward(dforce_.begin(), dforce.begin(), 3, nframes, - nall); - // printf("run_model 1 ed\n"); -} - -template void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const AtomMap& atommap, - const int nframes, - const int nghost); - -template -static void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost = 0) { - // printf("run_model 2\n"); - unsigned nloc = atommap.get_type().size(); - unsigned nall = nloc + nghost; - dener.resize(nframes); - if (nloc == 0) { - // no backward map needed - // dforce of size nall * 3 - dforce_.resize(nframes * nall * 3); - fill(dforce_.begin(), dforce_.end(), (VALUETYPE)0.0); - // dvirial of size 9 - dvirial.resize(nframes * 9); - fill(dvirial.begin(), dvirial.end(), (VALUETYPE)0.0); - // datom_energy_ of size nall - datom_energy_.resize(nframes * nall); - fill(datom_energy_.begin(), datom_energy_.end(), (VALUETYPE)0.0); - // datom_virial_ of size nall * 9 - datom_virial_.resize(nframes * nall * 9); - fill(datom_virial_.begin(), datom_virial_.end(), (VALUETYPE)0.0); - return; - } - - /* Running inference */ - if (!predictor->Run()) { - throw deepmd::deepmd_exception("Paddle inference failed"); - } - - /* Get output handles*/ - auto output_names = predictor->GetOutputNames(); - auto output_ae = predictor->GetOutputHandle(output_names[0]); - auto output_av = predictor->GetOutputHandle(output_names[1]); - auto output_e = predictor->GetOutputHandle(output_names[4]); - auto output_f = predictor->GetOutputHandle(output_names[5]); - - // 获取 Output paddle::Tensor 的维度信息 - std::vector output_atom_ener_shape = output_ae->shape(); - int output_atom_ener_size = - std::accumulate(output_atom_ener_shape.begin(), - output_atom_ener_shape.end(), 1, std::multiplies()); - std::vector output_atom_virial_shape = output_av->shape(); - int output_atom_virial_size = - std::accumulate(output_atom_virial_shape.begin(), output_atom_virial_shape.end(), 1, - std::multiplies()); - std::vector output_energy_shape = output_e->shape(); - int output_energy_size = - std::accumulate(output_energy_shape.begin(), output_energy_shape.end(), 1, - std::multiplies()); - std::vector output_force_shape = output_f->shape(); - int output_force_size = - std::accumulate(output_force_shape.begin(), output_force_shape.end(), 1, - std::multiplies()); - - // get data of output_atom_ener - std::vector oae; - oae.resize(output_atom_ener_size); - output_ae->CopyToCpu(oae.data()); - // get data of output_atom_virial - std::vector oav; - oav.resize(output_atom_virial_size); - output_av->CopyToCpu(oav.data()); - // get data of output_energy - std::vector oe; - oe.resize(output_energy_size); - output_e->CopyToCpu(oe.data()); - // get data of output_force - std::vector of; - of.resize(output_force_size); - output_f->CopyToCpu(of.data()); - - std::vector dforce(nframes * 3 * nall); - std::vector datom_energy(nframes * nall, 0); - std::vector datom_virial(nframes * 9 * nall); - dvirial.resize(nframes * 9); - for (int ii = 0; ii < nframes; ++ii) { - dener[ii] = oe[ii]; - } - for (int ii = 0; ii < nframes * nall * 3; ++ii) { - dforce[ii] = of[ii]; - } - for (int ii = 0; ii < nframes; ++ii) { - for (int jj = 0; jj < nloc; ++jj) { - datom_energy[ii * nall + jj] = oae[ii * nloc + jj]; - } - } - for (int ii = 0; ii < nframes * nall * 9; ++ii) { - datom_virial[ii] = oav[ii]; - } - // set dvirial to zero, prevent input vector is not zero (#1123) - std::fill(dvirial.begin(), dvirial.end(), (VALUETYPE)0.); - for (int kk = 0; kk < nframes; ++kk) { - for (int ii = 0; ii < nall; ++ii) { - dvirial[kk * 9 + 0] += - (VALUETYPE)1.0 * datom_virial[kk * nall * 9 + 9 * ii + 0]; - dvirial[kk * 9 + 1] += - (VALUETYPE)1.0 * datom_virial[kk * nall * 9 + 9 * ii + 1]; - dvirial[kk * 9 + 2] += - (VALUETYPE)1.0 * datom_virial[kk * nall * 9 + 9 * ii + 2]; - dvirial[kk * 9 + 3] += - (VALUETYPE)1.0 * datom_virial[kk * nall * 9 + 9 * ii + 3]; - dvirial[kk * 9 + 4] += - (VALUETYPE)1.0 * datom_virial[kk * nall * 9 + 9 * ii + 4]; - dvirial[kk * 9 + 5] += - (VALUETYPE)1.0 * datom_virial[kk * nall * 9 + 9 * ii + 5]; - dvirial[kk * 9 + 6] += - (VALUETYPE)1.0 * datom_virial[kk * nall * 9 + 9 * ii + 6]; - dvirial[kk * 9 + 7] += - (VALUETYPE)1.0 * datom_virial[kk * nall * 9 + 9 * ii + 7]; - dvirial[kk * 9 + 8] += - (VALUETYPE)1.0 * datom_virial[kk * nall * 9 + 9 * ii + 8]; - } - } - dforce_ = dforce; - datom_energy_ = datom_energy; - datom_virial_ = datom_virial; - atommap.backward(dforce_.begin(), dforce.begin(), 3, nframes, - nall); - atommap.backward(datom_energy_.begin(), datom_energy.begin(), 1, - nframes, nall); - atommap.backward(datom_virial_.begin(), datom_virial.begin(), 9, - nframes, nall); -} - -template void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost); - -// end multiple frames - -// start single frame - -template -static void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost = 0) { - assert(nframes == 1); - std::vector dener_(1); - // call multi-frame version - run_model(dener_, dforce_, dvirial, predictor, - atommap, nframes, nghost); - dener = dener_[0]; -} - -template void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const AtomMap& atommap, - const int nframes, - const int nghost); - -template -static void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - const deepmd::AtomMap& atommap, - const int nframes = 1, - const int nghost = 0) { - assert(nframes == 1); - std::vector dener_(1); - // call multi-frame version - run_model(dener_, dforce_, dvirial, datom_energy_, - datom_virial_, predictor,//, input_tensors, - atommap, nframes, nghost); - dener = dener_[0]; -} - -template void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost); - -template void run_model( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::shared_ptr& predictor, - // const std::vector>& input_tensors, - const deepmd::AtomMap& atommap, - const int nframes, - const int nghost); - -// end single frame - DeepPotPD::DeepPotPD() : inited(false) {} DeepPotPD::DeepPotPD(const std::string& model, @@ -496,7 +25,6 @@ DeepPotPD::DeepPotPD(const std::string& model, void DeepPotPD::init(const std::string& model, const int& gpu_rank, const std::string& file_content) { - // std::cout << ("** Access here.") << std::endl; if (inited) { std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " "nothing at the second call of initializer" @@ -510,10 +38,12 @@ void DeepPotPD::init(const std::string& model, } else { gpu_id = 0; } - std::string pdmodel_path = ""; - std::string pdiparams_path = ""; + + std::string pdmodel_path; + std::string pdiparams_path; bool use_paddle_inference = false; bool use_pir = false; + if (model.find(".json") != std::string::npos) { use_pir = true; pdmodel_path = model; @@ -528,10 +58,10 @@ void DeepPotPD::init(const std::string& model, } else { throw "[Error] Not found any inference model in"; } + int math_lib_num_threads = 1; if (use_paddle_inference) { - // printf("***** creating paddle predictor\n"); config = std::make_shared(); config->DisableGlogInfo(); // config->SwitchIrDebug(true); @@ -542,77 +72,11 @@ void DeepPotPD::init(const std::string& model, config->SetModel(pdmodel_path, pdiparams_path); // config->SwitchIrOptim(true); config->EnableUseGpu(8192, 0); - // std::cout << "IR Optim is: " << config->ir_optim() << std::endl; // config->EnableMKLDNN(); // config->EnableMemoryOptim(); // config->EnableProfile(); predictor = paddle_infer::CreatePredictor(*config); - // printf("***** created paddle predictor\n"); } - /* water se_e2_a - tensorflow::DT_DOUBLE = 2 - tensorflow::DT_FLOAT = 1 - paddle_infer::DataType::FLOAT64 = 7 - paddle_infer::DataType::FLOAT32 = 0 - * st_model.descrpt.buffer_rcut.name = generated_tensor_0 - * st_model.descrpt.buffer_ntypes.name = generated_tensor_2 - * st_model.fitting.buffer_dfparam.name = generated_tensor_9 - * st_model.fitting.buffer_daparam.name = generated_tensor_10 - [buffer_t_type, [3]] generated name in static_model is: generated_tensor_12 - [buffer_t_mt, [4]] generated name in static_model is: generated_tensor_13 - [buffer_t_ver, [1]] generated name in static_model is: generated_tensor_14 - [descrpt.buffer_rcut, []] generated name in static_model is: - generated_tensor_0 [descrpt.buffer_ntypes_spin, []] generated name in - static_model is: generated_tensor_1 [descrpt.buffer_ntypes, []] generated - name in static_model is: generated_tensor_2 [descrpt.avg_zero, [2, 552]] - generated name in static_model is: eager_tmp_0 [descrpt.std_ones, [2, 552]] - generated name in static_model is: eager_tmp_1 [descrpt.t_rcut, []] - generated name in static_model is: generated_tensor_3 [descrpt.t_rcut, []] - generated name in static_model is: generated_tensor_3 [descrpt.t_rcut, []] - generated name in static_model is: generated_tensor_3 [descrpt.t_ntypes, []] - generated name in static_model is: generated_tensor_4 [descrpt.t_ntypes, []] - generated name in static_model is: generated_tensor_4 [descrpt.t_ntypes, []] - generated name in static_model is: generated_tensor_4 [descrpt.t_ndescrpt, - []] generated name in static_model is: generated_tensor_5 [descrpt.t_sel, - [2]] generated name in static_model is: generated_tensor_6 [descrpt.t_avg, - [2, 552]] generated name in static_model is: generated_tensor_7 - [descrpt.t_std, [2, 552]] generated name in static_model is: - generated_tensor_8 [fitting.buffer_dfparam, []] generated name in - static_model is: generated_tensor_9 [fitting.buffer_daparam, []] generated - name in static_model is: generated_tensor_10 - **/ - /* spin se_e2_a - [buffer_tmap, [4]] generated name in static_model is: generated_tensor_14 - [buffer_model_type, [4]] generated name in static_model is: - generated_tensor_15 [buffer_model_version, [1]] generated name in - static_model is: generated_tensor_16 [descrpt.buffer_rcut, []] generated - name in static_model is: generated_tensor_3 [descrpt.buffer_ntypes, []] - generated name in static_model is: generated_tensor_4 [descrpt.avg_zero, [3, - 720]] generated name in static_model is: eager_tmp_0 [descrpt.std_ones, [3, - 720]] generated name in static_model is: eager_tmp_1 [descrpt.t_rcut, []] - generated name in static_model is: generated_tensor_5 [descrpt.buffer_sel, - [3]] generated name in static_model is: generated_tensor_6 - [descrpt.buffer_ndescrpt, []] generated name in static_model is: - generated_tensor_7 [descrpt.buffer_original_sel, [3]] generated name in - static_model is: generated_tensor_8 [descrpt.t_avg, [3, 720]] generated name - in static_model is: generated_tensor_9 [descrpt.t_std, [3, 720]] generated - name in static_model is: generated_tensor_10 - [descrpt.spin.buffer_ntypes_spin, [1]] generated name in static_model is: - generated_tensor_0 [descrpt.spin.buffer_virtual_len, [1, 1]] generated name - in static_model is: generated_tensor_1 [descrpt.spin.buffer_spin_norm, [1, - 1]] generated name in static_model is: generated_tensor_2 - [fitting.buffer_dfparam, []] generated name in static_model is: - generated_tensor_11 [fitting.buffer_daparam, []] generated name in - static_model is: generated_tensor_12 [fitting.t_bias_atom_e, [2]] generated - name in static_model is: generated_tensor_13 - */ - // dtype = predictor_get_dtype(predictor, "generated_tensor_0"); // hard code - // auto dtype = paddle_infer::DataType::FLOAT64; - // if (dtype == paddle_infer::DataType::FLOAT64) { - // rcut = paddle_get_scalar("generated_tensor_0"); - // } else { - // rcut = 3.18; - // } rcut = double(6.0); ntypes = 2; ntypes_spin = 0; @@ -621,32 +85,10 @@ void DeepPotPD::init(const std::string& model, aparam_nall = false; inited = true; - // if (!model_compatable(model_version)) { - // throw deepmd::deepmd_exception( - // "incompatable model: version " + model_version + - // " in graph, but version " + global_model_version + - // " supported " - // "See https://deepmd.rtfd.io/compatability/ for details."); - // } - // printf("***** initialized finished\n"); } DeepPotPD::~DeepPotPD() {} -// void DeepPotPD::print_summary(const std::string& pre) const { -// deepmd::print_summary(pre); -// } - -// template -// VT DeepPotPD::get_scalar(const std::string& name) const { -// return session_get_scalar(session, name); -// } - -// template -// VT DeepPotPD::paddle_get_scalar(const std::string& name) const { -// return predictor_get_scalar(predictor, name); -// } - template void DeepPotPD::validate_fparam_aparam( const int nframes, @@ -667,148 +109,6 @@ void DeepPotPD::validate_fparam_aparam( } } -template void DeepPotPD::validate_fparam_aparam( - const int nframes, - const int& nloc, - const std::vector& fparam, - const std::vector& aparam) const; - -template void DeepPotPD::validate_fparam_aparam( - const int nframes, - const int& nloc, - const std::vector& fparam, - const std::vector& aparam) const; - -template -void DeepPotPD::tile_fparam_aparam(std::vector& out_param, - const int& nframes, - const int& dparam, - const std::vector& param) const { - if (param.size() == dparam) { - out_param.resize(nframes * dparam); - for (int ii = 0; ii < nframes; ++ii) { - std::copy(param.begin(), param.end(), out_param.begin() + ii * dparam); - } - } else if (param.size() == nframes * dparam) { - out_param = param; - } -} - -template void DeepPotPD::tile_fparam_aparam( - std::vector& out_param, - const int& nframes, - const int& dparam, - const std::vector& param) const; - -template void DeepPotPD::tile_fparam_aparam( - std::vector& out_param, - const int& nframes, - const int& dparam, - const std::vector& param) const; - -// ENERGYVTYPE: std::vector or ENERGYTYPE - -template -void DeepPotPD::compute(ENERGYVTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_, - const bool atomic) { - // printf("compute 1\n"); - // if datype.size is 0, not clear nframes; but 1 is just ok - int nframes = datype_.size() > 0 ? (dcoord_.size() / 3 / datype_.size()) : 1; - atommap = deepmd::AtomMap(datype_.begin(), datype_.end()); - int nloc = datype_.size(); - std::vector fparam; - std::vector aparam; - validate_fparam_aparam(nframes, nloc, fparam_, aparam_); - tile_fparam_aparam(fparam, nframes, dfparam, fparam_); - tile_fparam_aparam(aparam, nframes, nloc * daparam, aparam_); - - // std::vector> input_tensors; - - if (dtype == paddle_infer::DataType::FLOAT64) { - int ret = predictor_input_tensors(predictor, dcoord_, ntypes, - datype_, dbox, cell_size, fparam, - aparam, atommap, aparam_nall); - if (atomic) { - run_model(dener, dforce_, dvirial, datom_energy_, datom_virial_, predictor, - atommap, nframes); - } else { - run_model(dener, dforce_, dvirial, predictor, - atommap, nframes); - } - } else { - int ret = predictor_input_tensors(predictor, dcoord_, ntypes, datype_, dbox, cell_size, fparam, aparam, - atommap, aparam_nall); - if (atomic) { - run_model(dener, dforce_, dvirial, datom_energy_, datom_virial_, predictor, - atommap, nframes); - } else { - run_model(dener, dforce_, dvirial, predictor, - atommap, nframes); - } - } -} - -// template void DeepPotPD::compute( -// ENERGYTYPE& dener, -// std::vector& dforce_, -// std::vector& dvirial, -// std::vector& datom_energy_, -// std::vector& datom_virial_, -// const std::vector& dcoord_, -// const std::vector& datype_, -// const std::vector& dbox, -// const std::vector& fparam, -// const std::vector& aparam, -// const bool atomic); - -// template void DeepPotPD::compute( -// ENERGYTYPE& dener, -// std::vector& dforce_, -// std::vector& dvirial, -// std::vector& datom_energy_, -// std::vector& datom_virial_, -// const std::vector& dcoord_, -// const std::vector& datype_, -// const std::vector& dbox, -// const std::vector& fparam, -// const std::vector& aparam, -// const bool atomic); - -template void DeepPotPD::compute>( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam, - const bool atomic); - -template void DeepPotPD::compute>( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam, - const bool atomic); - std::vector createNlistTensor(const std::vector>& data) { std::vector ret; @@ -820,29 +120,29 @@ std::vector createNlistTensor(const std::vector>& data) { } template -void DeepPotPD::compute(ENERGYVTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, +void DeepPotPD::compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam_, - const std::vector& aparam__, + const std::vector& fparam, + const std::vector& aparam, const bool atomic) { - /*参考pytorch的推理代码如下*/ - int natoms = datype_.size(); + int natoms = atype.size(); + // select real atoms std::vector dcoord, dforce, aparam_, datom_energy, datom_virial; std::vector datype, fwd_map, bkw_map; int nghost_real, nall_real, nloc_real; int nall = natoms; select_real_atoms_coord(dcoord, datype, aparam_, nghost_real, fwd_map, - bkw_map, nall_real, nloc_real, dcoord_, datype_, aparam__, + bkw_map, nall_real, nloc_real, coord, atype, aparam, nghost, ntypes, 1, daparam, nall, aparam_nall); int nloc = nall_real - nghost_real; int nframes = 1; @@ -859,124 +159,117 @@ void DeepPotPD::compute(ENERGYVTYPE& dener, nlist_data.copy_from_nlist(lmp_list); nlist_data.shuffle_exclude_empty(fwd_map); nlist_data.padding(); + if (do_message_passing == 1 && nghost > 0) { + int nswap = lmp_list.nswap; + auto sendproc_tensor = predictor->GetInputHandle("sendproc"); + sendproc_tensor->Reshape({nswap}); + sendproc_tensor->CopyFromCpu(lmp_list.sendproc); + auto recvproc_tensor = predictor->GetInputHandle("recvproc"); + recvproc_tensor->Reshape({nswap}); + recvproc_tensor->CopyFromCpu(lmp_list.recvproc); + auto firstrecv_tensor = predictor->GetInputHandle("firstrecv"); + firstrecv_tensor->Reshape({nswap}); + firstrecv_tensor->CopyFromCpu(lmp_list.firstrecv); + auto recvnum_tensor = predictor->GetInputHandle("recvnum"); + recvnum_tensor->Reshape({nswap}); + recvnum_tensor->CopyFromCpu(lmp_list.recvnum); + auto sendnum_tensor = predictor->GetInputHandle("sendnum"); + sendnum_tensor->Reshape({nswap}); + sendnum_tensor->CopyFromCpu(lmp_list.sendnum); + auto communicator_tensor = predictor->GetInputHandle("communicator"); + communicator_tensor->Reshape({1}); + communicator_tensor->CopyFromCpu(static_cast(lmp_list.world)); + auto sendlist_tensor = predictor->GetInputHandle("sendlist"); + + int total_send = + std::accumulate(lmp_list.sendnum, lmp_list.sendnum + nswap, 0); + } + if (do_message_passing == 1 && nghost == 0) { + throw deepmd::deepmd_exception( + "do_message_passing == 1 && nghost == 0" + ); + } } std::vector firstneigh = createNlistTensor(nlist_data.jlist); auto firstneigh_tensor = predictor->GetInputHandle("nlist"); - firstneigh_tensor->Reshape({1, nloc, firstneigh.size() / nloc}); + firstneigh_tensor->Reshape({1, nloc, (int)firstneigh.size() / (int)nloc}); firstneigh_tensor->CopyFromCpu(firstneigh.data()); - + bool do_atom_virial_tensor = atomic; + // paddle_infer::Tensor fparam_tensor; + // if (!fparam.empty()) { + // fparam_tensor = predictor->GetInputHandle("fparam"); + // fparam_tensor->Reshape({1, static_cast(fparam.size())}); + // fparam_tensor->CopyFromCpu((fparam.data())); + // } + // paddle_infer::Tensor aparam_tensor; + // if (!aparam_.empty()) { + // aparam_tensor = predictor->GetInputHandle("aparam"); + // aparam_tensor->Reshape({1, lmp_list.inum, + // static_cast(aparam_.size()) / lmp_list.inum}); + // aparam_tensor->CopyFromCpu((aparam_.data())); + // } if (!predictor->Run()) { throw deepmd::deepmd_exception("Paddle inference failed"); } auto output_names = predictor->GetOutputNames(); - auto print_shape = [](const std::vector &shape, const std::string &name=""){ - printf("shape of %s: [", name.c_str()); - for (int i=0; iGetOutputHandle(output_names[1]); - auto output_f = predictor->GetOutputHandle(output_names[2]); - auto output_virial_tensor = predictor->GetOutputHandle(output_names[3]); - // print_shape(output_e->shape(), "ener"); - // print_shape(output_f->shape(), "force"); - // print_shape(output_virial_tensor->shape(), "virial"); - std::vector output_energy_shape = output_e->shape(); + auto energy_ = predictor->GetOutputHandle(output_names[1]); + auto force_ = predictor->GetOutputHandle(output_names[2]); + auto virial_ = predictor->GetOutputHandle(output_names[3]); + std::vector output_energy_shape = energy_->shape(); int output_energy_size = std::accumulate(output_energy_shape.begin(), output_energy_shape.end(), 1, std::multiplies()); - std::vector output_force_shape = output_f->shape(); + std::vector output_force_shape = force_->shape(); int output_force_size = std::accumulate(output_force_shape.begin(), output_force_shape.end(), 1, std::multiplies()); - std::vector output_virial_shape = output_virial_tensor->shape(); + std::vector output_virial_shape = virial_->shape(); int output_virial_size = std::accumulate(output_virial_shape.begin(), output_virial_shape.end(), 1, std::multiplies()); - std::vector oe; - oe.resize(output_energy_size); - output_e->CopyToCpu(oe.data()); + // output energy + ener.resize(output_energy_size); + energy_->CopyToCpu(ener.data()); - std::vector of; - of.resize(output_force_size); - output_f->CopyToCpu(of.data()); + // output force + dforce.resize(output_force_size); + force_->CopyToCpu(dforce.data()); - std::vector oav; - oav.resize(output_virial_size); - output_virial_tensor->CopyToCpu(oav.data()); + // output virial + virial.resize(output_virial_size); + virial_->CopyToCpu(virial.data()); - dvirial.resize(nframes * 9); - dener.assign(oe.begin(), oe.end()); - dforce.resize(nframes * 3 * nall); - for (int ii = 0; ii < nframes * nall * 3; ++ii) { - dforce[ii] = of[ii]; - } - std::fill(dvirial.begin(), dvirial.end(), (VALUETYPE)0.); - dvirial.assign(oav.begin(), oav.end()); - // for (int kk = 0; kk < nframes; ++kk) { - // for (int ii = 0; ii < nall; ++ii) { - // dvirial[kk * 9 + 0] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 0]; - // dvirial[kk * 9 + 1] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 1]; - // dvirial[kk * 9 + 2] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 2]; - // dvirial[kk * 9 + 3] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 3]; - // dvirial[kk * 9 + 4] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 4]; - // dvirial[kk * 9 + 5] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 5]; - // dvirial[kk * 9 + 6] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 6]; - // dvirial[kk * 9 + 7] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 7]; - // dvirial[kk * 9 + 8] += (VALUETYPE)1.0 * oav[kk * nall * 9 + 9 * ii + 8]; - // } - // } // bkw map - dforce_.resize(static_cast(nframes) * fwd_map.size() * 3); - select_map(dforce_, dforce, bkw_map, 3, nframes, fwd_map.size(), + force.resize(static_cast(nframes) * fwd_map.size() * 3); + select_map(force, dforce, bkw_map, 3, nframes, fwd_map.size(), nall_real); + if (atomic) { + auto atom_virial_ = predictor->GetOutputHandle("extended_virial"); + auto atom_energy_ = predictor->GetOutputHandle("atom_energy"); + datom_energy.resize(nall_real, + 0.0); // resize to nall to be consistenet with TF. + atom_energy_->CopyToCpu(datom_energy.data()); + atom_virial_->CopyToCpu(datom_virial.data()); + atom_energy.resize(static_cast(nframes) * fwd_map.size()); + atom_virial.resize(static_cast(nframes) * fwd_map.size() * 9); + select_map(atom_energy, datom_energy, bkw_map, 1, nframes, + fwd_map.size(), nall_real); + select_map(atom_virial, datom_virial, bkw_map, 9, nframes, + fwd_map.size(), nall_real); + } } -// template void DeepPotPD::compute( -// ENERGYTYPE& dener, -// std::vector& dforce_, -// std::vector& dvirial, -// std::vector& datom_energy_, -// std::vector& datom_virial_, -// const std::vector& dcoord_, -// const std::vector& datype_, -// const std::vector& dbox, -// const int nghost, -// const InputNlist& lmp_list, -// const int& ago, -// const std::vector& fparam, -// const std::vector& aparam_, -// const bool atomic); - -// template void DeepPotPD::compute( -// ENERGYTYPE& dener, -// std::vector& dforce_, -// std::vector& dvirial, -// std::vector& datom_energy_, -// std::vector& datom_virial_, -// const std::vector& dcoord_, -// const std::vector& datype_, -// const std::vector& dbox, -// const int nghost, -// const InputNlist& lmp_list, -// const int& ago, -// const std::vector& fparam, -// const std::vector& aparam_, -// const bool atomic); - template void DeepPotPD::compute>( std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, const int nghost, const InputNlist& lmp_list, const int& ago, @@ -986,13 +279,13 @@ template void DeepPotPD::compute>( template void DeepPotPD::compute>( std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, const int nghost, const InputNlist& lmp_list, const int& ago, @@ -1000,6 +293,101 @@ template void DeepPotPD::compute>( const std::vector& aparam_, const bool atomic); +// ENERGYVTYPE: std::vector or ENERGYTYPE + +template +void DeepPotPD::compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + + // select real atoms + std::vector coord_wrapped = coord; + int natoms = atype.size(); + int nframes = 1; + auto coord_wrapped_Tensor = predictor->GetInputHandle("coord"); + coord_wrapped_Tensor->Reshape({1, natoms, 3}); + coord_wrapped_Tensor->CopyFromCpu(coord_wrapped.data()); + + std::vector atype_64(atype.begin(), atype.end()); + auto atype_Tensor = predictor->GetInputHandle("atype"); + atype_Tensor->Reshape({1, natoms}); + atype_Tensor->CopyFromCpu(atype_64.data()); + + std::unique_ptr box_Tensor; + if (!box.empty()) { + box_Tensor = predictor->GetInputHandle("box"); + box_Tensor->Reshape({1, 9}); + box_Tensor->CopyFromCpu((box.data())); + } + std::unique_ptr fparam_tensor; + if (!fparam.empty()) { + fparam_tensor = predictor->GetInputHandle("box"); + fparam_tensor->Reshape({1, static_cast(fparam.size())}); + fparam_tensor->CopyFromCpu((fparam.data())); + } + std::unique_ptr aparam_tensor; + if (!fparam.empty()) { + aparam_tensor = predictor->GetInputHandle("box"); + aparam_tensor->Reshape({1, natoms, static_cast(aparam.size()) / natoms}); + aparam_tensor->CopyFromCpu((aparam.data())); + } + + bool do_atom_virial_tensor = atomic; + if (!predictor->Run()) { + throw deepmd::deepmd_exception("Paddle inference failed"); + } + + auto output_names = predictor->GetOutputNames(); + auto energy_ = predictor->GetOutputHandle(output_names[1]); + auto force_ = predictor->GetOutputHandle(output_names[2]); + auto virial_ = predictor->GetOutputHandle(output_names[3]); + + energy_->CopyToCpu(ener.data()); + force_->CopyToCpu(force.data()); + virial_->CopyToCpu(virial.data()); + + if (atomic) { + auto atom_energy_ = predictor->GetOutputHandle(output_names[4]); + auto atom_virial_ = predictor->GetOutputHandle(output_names[5]); + atom_energy_->CopyToCpu(atom_energy.data()); + atom_virial_->CopyToCpu(atom_virial.data()); + } +} + +template void DeepPotPD::compute>( + std::vector& ener, + std::vector&dforce, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& dcoord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + +template void DeepPotPD::compute>( + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& dcoord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + // mixed type template @@ -1015,92 +403,64 @@ void DeepPotPD::compute_mixed_type(ENERGYVTYPE& dener, const std::vector& fparam_, const std::vector& aparam_, const bool atomic) { - int nloc = datype_.size() / nframes; - // here atommap only used to get nloc - atommap = deepmd::AtomMap(datype_.begin(), datype_.begin() + nloc); - std::vector fparam; - std::vector aparam; - validate_fparam_aparam(nframes, nloc, fparam_, aparam_); - tile_fparam_aparam(fparam, nframes, dfparam, fparam_); - tile_fparam_aparam(aparam, nframes, nloc * daparam, aparam_); + // int nloc = datype_.size() / nframes; + // // here atommap only used to get nloc + // atommap = deepmd::AtomMap(datype_.begin(), datype_.begin() + nloc); + // std::vector fparam; + // std::vector aparam; + // validate_fparam_aparam(nframes, nloc, fparam_, aparam_); + // tile_fparam_aparam(fparam, nframes, dfparam, fparam_); + // tile_fparam_aparam(aparam, nframes, nloc * daparam, aparam_); - if (dtype == paddle_infer::DataType::FLOAT64) { - int nloc = predictor_input_tensors_mixed_type( - predictor, nframes, dcoord_, ntypes, datype_, dbox, cell_size, - fparam, aparam, atommap, aparam_nall); - if (atomic) { - run_model(dener, dforce_, dvirial, datom_energy_, datom_virial_, predictor, - atommap, nframes); - } else { - run_model(dener, dforce_, dvirial, predictor, - atommap, nframes); - } - } else { - int nloc = predictor_input_tensors_mixed_type( - predictor, nframes, dcoord_, ntypes, datype_, dbox, cell_size, - fparam, aparam, atommap, aparam_nall); - if (atomic) { - run_model(dener, dforce_, dvirial, datom_energy_, datom_virial_, predictor, - atommap, nframes); - } else { - run_model(dener, dforce_, dvirial, predictor, atommap, - nframes); - } - } + // if (dtype == paddle_infer::DataType::FLOAT64) { + // int nloc = predictor_input_tensors_mixed_type( + // predictor, nframes, dcoord_, ntypes, datype_, dbox, cell_size, + // fparam, aparam, atommap, aparam_nall); + // if (atomic) { + // run_model(dener, dforce_, dvirial, datom_energy_, datom_virial_, predictor, + // atommap, nframes); + // } else { + // run_model(dener, dforce_, dvirial, predictor, + // atommap, nframes); + // } + // } else { + // int nloc = predictor_input_tensors_mixed_type( + // predictor, nframes, dcoord_, ntypes, datype_, dbox, cell_size, + // fparam, aparam, atommap, aparam_nall); + // if (atomic) { + // run_model(dener, dforce_, dvirial, datom_energy_, datom_virial_, predictor, + // atommap, nframes); + // } else { + // run_model(dener, dforce_, dvirial, predictor, atommap, + // nframes); + // } + // } } -template void DeepPotPD::compute_mixed_type( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam, - const bool atomic); - -template void DeepPotPD::compute_mixed_type( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam, - const bool atomic); - template void DeepPotPD::compute_mixed_type>( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, + const std::vector& coord, + const std::vector& dtype, + const std::vector& box, const std::vector& fparam, const std::vector& aparam, const bool atomic); template void DeepPotPD::compute_mixed_type>( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, const std::vector& fparam, const std::vector& aparam, const bool atomic);