diff --git a/core/general-client/include/general_model.h b/core/general-client/include/general_model.h index 8a4c5e8c3c15bdcb59fc5faa7461713bf291bab4..b379188854c30587d24962bc827aa099c3a39183 100644 --- a/core/general-client/include/general_model.h +++ b/core/general-client/include/general_model.h @@ -78,12 +78,18 @@ class ModelRes { std::vector&& get_float_by_name_with_rv(const std::string& name) { return std::move(_float_value_map[name]); } - const std::vector& get_shape(const std::string& name) { + const std::vector& get_shape_by_name(const std::string& name) { return _shape_map[name]; } - const std::vector& get_lod(const std::string& name) { + std::vector&& get_shape_by_name_with_rv(const std::string& name) { + return std::move(_shape_map[name]); + } + const std::vector& get_lod_by_name(const std::string& name) { return _lod_map[name]; } + std::vector&& get_lod_by_name_with_rv(const std::string& name) { + return std::move(_lod_map[name]); + } void set_engine_name(const std::string& engine_name) { _engine_name = engine_name; } @@ -139,13 +145,21 @@ class PredictorRes { const std::string& name) { return std::move(_models[model_idx].get_float_by_name_with_rv(name)); } - const std::vector& get_shape(const int model_idx, - const std::string& name) { - return _models[model_idx].get_shape(name); + const std::vector& get_shape_by_name(const int model_idx, + const std::string& name) { + return _models[model_idx].get_shape_by_name(name); + } + const std::vector&& get_shape_by_name_with_rv(const int model_idx, + const std::string& name) { + return std::move(_models[model_idx].get_shape_by_name_with_rv(name)); } - const std::vector& get_lod(const int model_idx, - const std::string& name) { - return _models[model_idx].get_lod(name); + const std::vector& get_lod_by_name(const int model_idx, + const std::string& name) { + return _models[model_idx].get_lod_by_name(name); + } + const std::vector&& get_lod_by_name_with_rv(const int model_idx, + const std::string& name) { + return std::move(_models[model_idx].get_lod_by_name_with_rv(name)); } void add_model_res(ModelRes&& res) { _engine_names.push_back(res.engine_name()); diff --git a/core/general-client/src/pybind_general_model.cpp b/core/general-client/src/pybind_general_model.cpp index 676114e4e44a9553cb06f00defb19b6c754d51e6..3e065e4de1ff3c01ff6bc05cb39a2607620915b4 100644 --- a/core/general-client/src/pybind_general_model.cpp +++ b/core/general-client/src/pybind_general_model.cpp @@ -51,14 +51,22 @@ PYBIND11_MODULE(serving_client, m) { }) .def("get_shape", [](PredictorRes &self, int model_idx, std::string &name) { - return self.get_shape(model_idx, name); - }, - py::return_value_policy::reference) + std::vector *ptr = new std::vector( + std::move(self.get_shape_by_name_with_rv(model_idx, name))); + auto capsule = py::capsule(ptr, [](void *p) { + delete reinterpret_cast *>(p); + }); + return py::array(ptr->size(), ptr->data(), capsule); + }) .def("get_lod", [](PredictorRes &self, int model_idx, std::string &name) { - return self.get_lod(model_idx, name); - }, - py::return_value_policy::reference) + std::vector *ptr = new std::vector( + std::move(self.get_lod_by_name_with_rv(model_idx, name))); + auto capsule = py::capsule(ptr, [](void *p) { + delete reinterpret_cast *>(p); + }); + return py::array(ptr->size(), ptr->data(), capsule); + }) .def("variant_tag", [](PredictorRes &self) { return self.variant_tag(); }) .def("get_engine_names", [](PredictorRes &self) { return self.get_engine_names(); }); @@ -109,7 +117,8 @@ PYBIND11_MODULE(serving_client, m) { fetch_name, predict_res_batch, pid); - }) + }, + py::call_guard()) .def("numpy_predict", [](PredictorClient &self, const std::vector>>