diff --git a/core/general-client/include/general_model.h b/core/general-client/include/general_model.h index 1bac4375b2995605d604b9f8ef7e863b6a646788..0e042d1880acd15151d3476d6061fb759f92e11b 100644 --- a/core/general-client/include/general_model.h +++ b/core/general-client/include/general_model.h @@ -45,12 +45,12 @@ class PredictorRes { ~PredictorRes() {} public: - const std::vector> & get_int64_by_name( - const std::string & name) { + const std::vector>& get_int64_by_name( + const std::string& name) { return _int64_map[name]; } - const std::vector> & get_float_by_name( - const std::string & name) { + const std::vector>& get_float_by_name( + const std::string& name) { return _float_map[name]; } @@ -71,7 +71,7 @@ class PredictorClient { void set_predictor_conf(const std::string& conf_path, const std::string& conf_file); - int create_predictor_by_desc(const std::string & sdk_desc); + int create_predictor_by_desc(const std::string& sdk_desc); int create_predictor(); int destroy_predictor(); @@ -81,7 +81,8 @@ class PredictorClient { const std::vector>& int_feed, const std::vector& int_feed_name, const std::vector& fetch_name, - PredictorRes & predict_res); // NOLINT + PredictorRes& predict_res, // NOLINT + const int& pid); std::vector> predict( const std::vector>& float_feed, diff --git a/core/general-client/src/general_model.cpp b/core/general-client/src/general_model.cpp index 1dcf261f96769f9c33ddcbe792eda9a6057c8502..9fafe0abc59ce543cfc1783003296d68102d0c8d 100644 --- a/core/general-client/src/general_model.cpp +++ b/core/general-client/src/general_model.cpp @@ -132,13 +132,13 @@ int PredictorClient::create_predictor() { _api.thrd_initialize(); } -int PredictorClient::predict( - const std::vector>& float_feed, - const std::vector& float_feed_name, - const std::vector>& int_feed, - const std::vector& int_feed_name, - const std::vector& fetch_name, - PredictorRes & predict_res) { // NOLINT +int PredictorClient::predict(const std::vector> &float_feed, + const std::vector &float_feed_name, + const std::vector> &int_feed, + const std::vector &int_feed_name, + const std::vector &fetch_name, + PredictorRes &predict_res, + const int &pid) { // NOLINT predict_res._int64_map.clear(); predict_res._float_map.clear(); Timer timeline; @@ -218,6 +218,7 @@ int PredictorClient::predict( VLOG(2) << "fetch name: " << name; if (_fetch_name_to_type[name] == 0) { int len = res.insts(0).tensor_array(idx).int64_data_size(); + VLOG(2) << "fetch tensor : " << name << " type: int64 len : " << len; predict_res._int64_map[name].resize(1); predict_res._int64_map[name][0].resize(len); for (int i = 0; i < len; ++i) { @@ -226,6 +227,7 @@ int PredictorClient::predict( } } else if (_fetch_name_to_type[name] == 1) { int len = res.insts(0).tensor_array(idx).float_data_size(); + VLOG(2) << "fetch tensor : " << name << " type: float32 len : " << len; predict_res._float_map[name].resize(1); predict_res._float_map[name][0].resize(len); for (int i = 0; i < len; ++i) { @@ -240,11 +242,12 @@ int PredictorClient::predict( if (FLAGS_profile_client) { std::ostringstream oss; oss << "PROFILE\t" + << "pid:" << pid << "\t" << "prepro_0:" << preprocess_start << " " << "prepro_1:" << preprocess_end << " " << "client_infer_0:" << client_infer_start << " " << "client_infer_1:" << client_infer_end << " "; - + if (FLAGS_profile_server) { int op_num = res.profile_time_size() / 2; for (int i = 0; i < op_num; ++i) { @@ -252,10 +255,10 @@ int PredictorClient::predict( oss << "op" << i << "_1:" << res.profile_time(i * 2 + 1) << " "; } } - + oss << "postpro_0:" << postprocess_start << " "; oss << "postpro_1:" << postprocess_end; - + fprintf(stderr, "%s\n", oss.str().c_str()); } return 0; @@ -342,7 +345,7 @@ std::vector>> PredictorClient::batch_predict( } VLOG(2) << "batch [" << bi << "] " - << "itn feed value prepared"; + << "int feed value prepared"; } int64_t preprocess_end = timeline.TimeStampUS(); diff --git a/core/general-client/src/pybind_general_model.cpp b/core/general-client/src/pybind_general_model.cpp index 9056a7af298238cf6ffb365ccc9d40f1035bf187..287fa2dcb55344a6e71bf8e76171de5f94e89de5 100644 --- a/core/general-client/src/pybind_general_model.cpp +++ b/core/general-client/src/pybind_general_model.cpp @@ -31,13 +31,15 @@ PYBIND11_MODULE(serving_client, m) { py::class_(m, "PredictorRes", py::buffer_protocol()) .def(py::init()) .def("get_int64_by_name", - [](PredictorRes &self, std::string & name) { + [](PredictorRes &self, std::string &name) { return self.get_int64_by_name(name); - }, py::return_value_policy::reference) + }, + py::return_value_policy::reference) .def("get_float_by_name", - [](PredictorRes &self, std::string & name) { + [](PredictorRes &self, std::string &name) { return self.get_float_by_name(name); - }, py::return_value_policy::reference); + }, + py::return_value_policy::reference); py::class_(m, "PredictorClient", py::buffer_protocol()) .def(py::init()) @@ -56,26 +58,29 @@ PYBIND11_MODULE(serving_client, m) { self.set_predictor_conf(conf_path, conf_file); }) .def("create_predictor_by_desc", - [](PredictorClient &self, const std::string & sdk_desc) { - self.create_predictor_by_desc(sdk_desc); }) + [](PredictorClient &self, const std::string &sdk_desc) { + self.create_predictor_by_desc(sdk_desc); + }) .def("create_predictor", [](PredictorClient &self) { self.create_predictor(); }) .def("destroy_predictor", [](PredictorClient &self) { self.destroy_predictor(); }) .def("predict", [](PredictorClient &self, - const std::vector> &float_feed, - const std::vector &float_feed_name, - const std::vector> &int_feed, - const std::vector &int_feed_name, - const std::vector &fetch_name, - PredictorRes & predict_res) { + const std::vector> &float_feed, + const std::vector &float_feed_name, + const std::vector> &int_feed, + const std::vector &int_feed_name, + const std::vector &fetch_name, + PredictorRes &predict_res, + const int &pid) { return self.predict(float_feed, float_feed_name, int_feed, int_feed_name, fetch_name, - predict_res); + predict_res, + pid); }) .def("batch_predict", [](PredictorClient &self, diff --git a/python/examples/bert/bert_client.py b/python/examples/bert/bert_client.py index 452a18024b69ee330d63bb0dc1d5e8a450e51883..7ac7f4fd8676e853547aa05b99222820c764b5ab 100644 --- a/python/examples/bert/bert_client.py +++ b/python/examples/bert/bert_client.py @@ -36,6 +36,7 @@ class BertService(): self.show_ids = show_ids self.do_lower_case = do_lower_case self.retry = retry + self.pid = os.getpid() self.profile = True if ("FLAGS_profile_client" in os.environ and os.environ["FLAGS_profile_client"]) else False @@ -78,7 +79,8 @@ class BertService(): } prepro_end = time.time() if self.profile: - print("PROFILE\tbert_pre_0:{} bert_pre_1:{}".format( + print("PROFILE\tpid:{}\tbert_pre_0:{} bert_pre_1:{}".format( + self.pid, int(round(prepro_start * 1000000)), int(round(prepro_end * 1000000)))) fetch_map = self.client.predict(feed=feed, fetch=fetch) @@ -111,7 +113,8 @@ class BertService(): feed_batch.append(feed) prepro_end = time.time() if self.profile: - print("PROFILE\tbert_pre_0:{} bert_pre_1:{}".format( + print("PROFILE\tpid:{}\tbert_pre_0:{} bert_pre_1:{}".format( + self.pid, int(round(prepro_start * 1000000)), int(round(prepro_end * 1000000)))) fetch_map_batch = self.client.batch_predict( @@ -120,7 +123,6 @@ class BertService(): def test(): - bc = BertService( model_name='bert_chinese_L-12_H-768_A-12', max_seq_len=20, @@ -130,16 +132,25 @@ def test(): config_file = './serving_client_conf/serving_client_conf.prototxt' fetch = ["pooled_output"] bc.load_client(config_file, server_addr) - batch_size = 4 + batch_size = 1 batch = [] for line in sys.stdin: - if len(batch) < batch_size: - batch.append([line.strip()]) + if batch_size == 1: + result = bc.run_general([[line.strip()]], fetch) + print(result) else: - result = bc.run_batch_general(batch, fetch) - batch = [] - for r in result: - print(r) + if len(batch) < batch_size: + batch.append([line.strip()]) + else: + result = bc.run_batch_general(batch, fetch) + batch = [] + for r in result: + print(r) + if len(batch) > 0: + result = bc.run_batch_general(batch, fetch) + batch = [] + for r in result: + print(r) if __name__ == '__main__': diff --git a/python/examples/bert/bert_server.py b/python/examples/bert/bert_server.py index 52b74b4622cfa3add6ad41678339924e3f9c3b0c..35d38be0cac50b899b58085c7f103f32537859c4 100644 --- a/python/examples/bert/bert_server.py +++ b/python/examples/bert/bert_server.py @@ -31,8 +31,6 @@ op_seq_maker.add_op(general_response_op) server = Server() server.set_op_sequence(op_seq_maker.get_op_sequence()) server.set_num_threads(4) -server.set_local_bin( - "~/github/Serving/build_server/core/general-server/serving") server.load_model_config(sys.argv[1]) port = int(sys.argv[2]) diff --git a/python/examples/bert/get_data.sh b/python/examples/bert/get_data.sh new file mode 100644 index 0000000000000000000000000000000000000000..37174e725e22d4ae1ea000723a9e8f1a026b017d --- /dev/null +++ b/python/examples/bert/get_data.sh @@ -0,0 +1 @@ +wget https://paddle-serving.bj.bcebos.com/bert_example/data-c.txt --no-check-certificate diff --git a/python/examples/fit_a_line/benchmark.py b/python/examples/fit_a_line/benchmark.py new file mode 100644 index 0000000000000000000000000000000000000000..b68d37e6e1e9166e01730427324c8743bd8dc08e --- /dev/null +++ b/python/examples/fit_a_line/benchmark.py @@ -0,0 +1,48 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from paddle_serving_client import Client +from paddle_serving_client.utils import MultiThreadRunner +from paddle_serving_client.utils import benchmark_args +import time +import paddle +import sys +import requests + +args = benchmark_args() + +def single_func(idx, resource): + if args.request == "rpc": + client = Client() + client.load_client_config(args.model) + client.connect([args.endpoint]) + train_reader = paddle.batch(paddle.reader.shuffle( + paddle.dataset.uci_housing.train(), buf_size=500), batch_size=1) + start = time.time() + for data in train_reader(): + fetch_map = client.predict(feed={"x": data[0][0]}, fetch=["price"]) + end = time.time() + return [[end - start]] + elif args.request == "http": + train_reader = paddle.batch(paddle.reader.shuffle( + paddle.dataset.uci_housing.train(), buf_size=500), batch_size=1) + start = time.time() + for data in train_reader(): + r = requests.post('http://{}/uci/prediction'.format(args.endpoint), + data = {"x": data[0]}) + end = time.time() + return [[end - start]] + +multi_thread_runner = MultiThreadRunner() +result = multi_thread_runner.run(single_func, args.thread, {}) +print(result) diff --git a/python/examples/imdb/README.md b/python/examples/imdb/README.md index d8955f6b705b187cd3ca4ca26482042aea3fca82..f54414d35a9f1642aa641be60848e8995a773a17 100644 --- a/python/examples/imdb/README.md +++ b/python/examples/imdb/README.md @@ -19,7 +19,7 @@ cat test.data | python test_client_batch.py inference.conf 4 > result 设备 :Intel(R) Xeon(R) Gold 6271 CPU @ 2.60GHz * 48 -模型 :IMDB-CNN +模型 :[CNN](https://github.com/PaddlePaddle/Serving/blob/develop/python/examples/imdb/nets.py) server thread num : 16 diff --git a/python/examples/imdb/benchmark.py b/python/examples/imdb/benchmark.py index 1bec0057adebc59a0b4029766f4c22e227b28c1c..1254ed21fd8ff30acdb9e8192b26b7918da315bc 100644 --- a/python/examples/imdb/benchmark.py +++ b/python/examples/imdb/benchmark.py @@ -13,55 +13,45 @@ # limitations under the License. import sys +import time +import requests +from imdb_reader import IMDBDataset from paddle_serving_client import Client -from paddle_serving_client.metric import auc from paddle_serving_client.utils import MultiThreadRunner -import time +from paddle_serving_client.utils import benchmark_args +args = benchmark_args() -def predict(thr_id, resource): - client = Client() - client.load_client_config(resource["conf_file"]) - client.connect(resource["server_endpoint"]) - thread_num = resource["thread_num"] - file_list = resource["filelist"] - line_id = 0 - prob = [] - label_list = [] - dataset = [] - for fn in file_list: - fin = open(fn) - for line in fin: - if line_id % thread_num == thr_id - 1: - group = line.strip().split() - words = [int(x) for x in group[1:int(group[0])]] - label = [int(group[-1])] - feed = {"words": words, "label": label} - dataset.append(feed) - line_id += 1 - fin.close() - +def single_func(idx, resource): + imdb_dataset = IMDBDataset() + imdb_dataset.load_resource(args.vocab) + filelist_fn = args.filelist + filelist = [] start = time.time() - fetch = ["acc", "cost", "prediction"] - for inst in dataset: - fetch_map = client.predict(feed=inst, fetch=fetch) - prob.append(fetch_map["prediction"][1]) - label_list.append(label[0]) + with open(filelist_fn) as fin: + for line in fin: + filelist.append(line.strip()) + filelist = filelist[idx::args.thread] + if args.request == "rpc": + client = Client() + client.load_client_config(args.model) + client.connect([args.endpoint]) + for fn in filelist: + fin = open(fn) + for line in fin: + word_ids, label = imdb_dataset.get_words_and_label(line) + fetch_map = client.predict(feed={"words": word_ids}, + fetch=["prediction"]) + elif args.request == "http": + for fn in filelist: + fin = open(fn) + for line in fin: + word_ids, label = imdb_dataset.get_words_and_label(line) + r = requests.post("http://{}/imdb/prediction".format(args.endpoint), + data={"words": word_ids}) end = time.time() - client.release() - return [prob, label_list, [end - start]] - - -if __name__ == '__main__': - conf_file = sys.argv[1] - data_file = sys.argv[2] - resource = {} - resource["conf_file"] = conf_file - resource["server_endpoint"] = ["127.0.0.1:9293"] - resource["filelist"] = [data_file] - resource["thread_num"] = int(sys.argv[3]) - - thread_runner = MultiThreadRunner() - result = thread_runner.run(predict, int(sys.argv[3]), resource) + return [[end - start]] - print("total time {} s".format(sum(result[-1]) / len(result[-1]))) +multi_thread_runner = MultiThreadRunner() +result = multi_thread_runner.run(single_func, args.thread, {}) +print(result) diff --git a/python/examples/imdb/get_data.sh b/python/examples/imdb/get_data.sh index 87aaa7a6c7913f63cccc16e7666e23fa9392616c..81d8d5d3b018f133c41e211d1501cf3cd9a3d8a4 100644 --- a/python/examples/imdb/get_data.sh +++ b/python/examples/imdb/get_data.sh @@ -1,4 +1,4 @@ wget --no-check-certificate https://fleet.bj.bcebos.com/text_classification_data.tar.gz +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/imdb-demo/imdb_model.tar.gz tar -zxvf text_classification_data.tar.gz -#wget --no-check-certificate https://paddle-serving.bj.bcebos.com/imdb-demo%2Fimdb.tar.gz -#tar -xzf imdb-demo%2Fimdb.tar.gz +tar -zxvf imdb_model.tar.gz diff --git a/python/examples/imdb/imdb_reader.py b/python/examples/imdb/imdb_reader.py index def7ce2197bfd24bc4f17f97e5e4a1aa541bcabc..cad28ab2cdcc2983bb74bc721ec837b0b6e5fe88 100644 --- a/python/examples/imdb/imdb_reader.py +++ b/python/examples/imdb/imdb_reader.py @@ -30,6 +30,14 @@ class IMDBDataset(dg.MultiSlotDataGenerator): self._pattern = re.compile(r'(;|,|\.|\?|!|\s|\(|\))') self.return_value = ("words", [1, 2, 3, 4, 5, 6]), ("label", [0]) + def get_words_only(self, line): + sent = line.lower().replace("
", " ").strip() + words = [x for x in self._pattern.split(sent) if x and x != " "] + feas = [ + self._vocab[x] if x in self._vocab else self._unk_id for x in words + ] + return feas + def get_words_and_label(self, line): send = '|'.join(line.split('|')[:-1]).lower().replace("
", " ").strip() diff --git a/python/examples/imdb/imdb_web_service_demo.sh b/python/examples/imdb/imdb_web_service_demo.sh index e0db60a5e065b079d63cc1f67ab1cdc8d63a9e84..0b69a3532b7e8a924c5b19eb7e483e63226ee945 100644 --- a/python/examples/imdb/imdb_web_service_demo.sh +++ b/python/examples/imdb/imdb_web_service_demo.sh @@ -1,4 +1,4 @@ -wget https://paddle-serving.bj.bcebos.com/imdb-demo%2Fimdb_service.tar.gz +wget https://paddle-serving.bj.bcebos.com/imdb-demo/imdb_service.tar.gz tar -xzf imdb_service.tar.gz wget --no-check-certificate https://fleet.bj.bcebos.com/text_classification_data.tar.gz tar -zxvf text_classification_data.tar.gz diff --git a/python/examples/imdb/local_train.py b/python/examples/imdb/local_train.py index b4cad7f465d840c08949da9cf968f131dfc1f93f..53692298a2b4caefb92f0a686bd020feaf3fa168 100644 --- a/python/examples/imdb/local_train.py +++ b/python/examples/imdb/local_train.py @@ -49,8 +49,9 @@ if __name__ == "__main__": dataset.set_batch_size(128) dataset.set_filelist(filelist) dataset.set_thread(10) - from nets import bow_net - avg_cost, acc, prediction = bow_net(data, label, dict_dim) + from nets import lstm_net + model_name = "imdb_lstm" + avg_cost, acc, prediction = lstm_net(data, label, dict_dim) optimizer = fluid.optimizer.SGD(learning_rate=0.01) optimizer.minimize(avg_cost) @@ -65,6 +66,7 @@ if __name__ == "__main__": program=fluid.default_main_program(), dataset=dataset, debug=False) logger.info("TRAIN --> pass: {}".format(i)) if i == 5: - serving_io.save_model("imdb_model", "imdb_client_conf", + serving_io.save_model("{}_model".format(model_name), + "{}_client_conf".format(model_name), {"words": data}, {"prediction": prediction}, fluid.default_main_program()) diff --git a/python/examples/imdb/test_client.py b/python/examples/imdb/test_client.py index 935fec52a4b36007da511eb9db48259e3bb181f0..bb0b9790669173abf2761a5d900dce15d91a5d71 100644 --- a/python/examples/imdb/test_client.py +++ b/python/examples/imdb/test_client.py @@ -1,15 +1,33 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. from paddle_serving_client import Client +from imdb_reader import IMDBDataset import sys client = Client() client.load_client_config(sys.argv[1]) client.connect(["127.0.0.1:9393"]) +# you can define any english sentence or dataset here +# This example reuses imdb reader in training, you +# can define your own data preprocessing easily. +imdb_dataset = IMDBDataset() +imdb_dataset.load_resource(sys.argv[2]) + for line in sys.stdin: - group = line.strip().split() - words = [int(x) for x in group[1:int(group[0]) + 1]] - label = [int(group[-1])] - feed = {"words": words, "label": label} + word_ids, label = imdb_dataset.get_words_and_label(line) + feed = {"words": word_ids, "label": label} fetch = ["acc", "cost", "prediction"] fetch_map = client.predict(feed=feed, fetch=fetch) print("{} {}".format(fetch_map["prediction"][1], label[0])) diff --git a/python/examples/imdb/test_client_multithread.py b/python/examples/imdb/test_client_multithread.py deleted file mode 100644 index 62b2250f21de28e3c6137a5aebe43fd1027b72c6..0000000000000000000000000000000000000000 --- a/python/examples/imdb/test_client_multithread.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from paddle_serving_client import Client -import sys -import subprocess -from multiprocessing import Pool -import time - - -def predict(p_id, p_size, data_list): - client = Client() - client.load_client_config(conf_file) - client.connect(["127.0.0.1:8010"]) - result = [] - for line in data_list: - group = line.strip().split() - words = [int(x) for x in group[1:int(group[0])]] - label = [int(group[-1])] - feed = {"words": words, "label": label} - fetch = ["acc", "cost", "prediction"] - fetch_map = client.predict(feed=feed, fetch=fetch) - #print("{} {}".format(fetch_map["prediction"][1], label[0])) - result.append([fetch_map["prediction"][1], label[0]]) - return result - - -def predict_multi_thread(p_num): - data_list = [] - with open(data_file) as f: - for line in f.readlines(): - data_list.append(line) - start = time.time() - p = Pool(p_num) - p_size = len(data_list) / p_num - result_list = [] - for i in range(p_num): - result_list.append( - p.apply_async(predict, - [i, p_size, data_list[i * p_size:(i + 1) * p_size]])) - p.close() - p.join() - for i in range(p_num): - result = result_list[i].get() - for j in result: - print("{} {}".format(j[0], j[1])) - cost = time.time() - start - print("{} threads cost {}".format(p_num, cost)) - - -if __name__ == '__main__': - conf_file = sys.argv[1] - data_file = sys.argv[2] - p_num = int(sys.argv[3]) - predict_multi_thread(p_num) diff --git a/python/examples/imdb/test_gpu_server.py b/python/examples/imdb/test_gpu_server.py deleted file mode 100644 index d8b313eedb58cbbb9c5a2045e889cb1372b9d276..0000000000000000000000000000000000000000 --- a/python/examples/imdb/test_gpu_server.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import sys -from paddle_serving_server_gpu import OpMaker -from paddle_serving_server_gpu import OpSeqMaker -from paddle_serving_server_gpu import Server - -op_maker = OpMaker() -read_op = op_maker.create('general_reader') -general_infer_op = op_maker.create('general_infer') - -op_seq_maker = OpSeqMaker() -op_seq_maker.add_op(read_op) -op_seq_maker.add_op(general_infer_op) - -server = Server() -server.set_op_sequence(op_seq_maker.get_op_sequence()) -server.set_num_threads(12) -server.load_model_config(sys.argv[1]) -port = int(sys.argv[2]) -server.prepare_server(workdir="work_dir1", port=port, device="gpu") -server.run_server() diff --git a/python/examples/imdb/test_server.py b/python/examples/imdb/test_server.py deleted file mode 100644 index 35d38be0cac50b899b58085c7f103f32537859c4..0000000000000000000000000000000000000000 --- a/python/examples/imdb/test_server.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import sys -from paddle_serving_server import OpMaker -from paddle_serving_server import OpSeqMaker -from paddle_serving_server import Server - -op_maker = OpMaker() -read_op = op_maker.create('general_reader') -general_infer_op = op_maker.create('general_infer') -general_response_op = op_maker.create('general_response') - -op_seq_maker = OpSeqMaker() -op_seq_maker.add_op(read_op) -op_seq_maker.add_op(general_infer_op) -op_seq_maker.add_op(general_response_op) - -server = Server() -server.set_op_sequence(op_seq_maker.get_op_sequence()) -server.set_num_threads(4) - -server.load_model_config(sys.argv[1]) -port = int(sys.argv[2]) -server.prepare_server(workdir="work_dir1", port=port, device="cpu") -server.run_server() diff --git a/python/examples/imdb/text_classify_service.py b/python/examples/imdb/text_classify_service.py index 0576d2901803386ad4e0172a1442fd62e3d17b42..8a6836f0646c5d2bbeeb672c28f16486f6bdd8c2 100755 --- a/python/examples/imdb/text_classify_service.py +++ b/python/examples/imdb/text_classify_service.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -#!flask/bin/python from paddle_serving_server.web_service import WebService from imdb_reader import IMDBDataset import sys @@ -27,7 +26,7 @@ class IMDBService(WebService): if "words" not in feed: exit(-1) res_feed = {} - res_feed["words"] = self.dataset.get_words_and_label(feed["words"])[0] + res_feed["words"] = self.dataset.get_words_only(feed["words"])[0] return res_feed, fetch imdb_service = IMDBService(name="imdb") diff --git a/python/examples/util/timeline_trace.py b/python/examples/util/timeline_trace.py index e8bffedfbde3d0ff00d398172303da6d91d04b61..144c21cb4458cf8f73fa9e198617b735970897bd 100644 --- a/python/examples/util/timeline_trace.py +++ b/python/examples/util/timeline_trace.py @@ -5,8 +5,9 @@ import sys profile_file = sys.argv[1] -def prase(line, counter): - event_list = line.split(" ") +def prase(pid_str, time_str, counter): + pid = pid_str.split(":")[1] + event_list = time_str.split(" ") trace_list = [] for event in event_list: name, ts = event.split(":") @@ -19,7 +20,7 @@ def prase(line, counter): event_dict = {} event_dict["name"] = name event_dict["tid"] = 0 - event_dict["pid"] = 0 + event_dict["pid"] = pid event_dict["ts"] = ts event_dict["ph"] = ph @@ -36,7 +37,7 @@ if __name__ == "__main__": for line in f.readlines(): line = line.strip().split("\t") if line[0] == "PROFILE": - trace_list = prase(line[1], counter) + trace_list = prase(line[1], line[2], counter) counter += 1 for trace in trace_list: all_list.append(trace) diff --git a/python/paddle_serving_client/__init__.py b/python/paddle_serving_client/__init__.py index b0bfcbeb993009320a57a3284b46f196d8800ac1..bea80f84bc9d29cabe4f31af612c694980b71d09 100644 --- a/python/paddle_serving_client/__init__.py +++ b/python/paddle_serving_client/__init__.py @@ -78,6 +78,7 @@ class Client(object): self.feed_types_ = {} self.feed_names_to_idx_ = {} self.rpath() + self.pid = os.getpid() def rpath(self): lib_path = os.path.dirname(paddle_serving_client.__file__) @@ -160,6 +161,7 @@ class Client(object): int_feed_names = [] float_feed_names = [] fetch_names = [] + for key in feed: self.shape_check(feed, key) if key not in self.feed_names_: @@ -177,7 +179,7 @@ class Client(object): ret = self.client_handle_.predict(float_slot, float_feed_names, int_slot, int_feed_names, fetch_names, - self.result_handle_) + self.result_handle_, self.pid) result_map = {} for i, name in enumerate(fetch_names): diff --git a/python/paddle_serving_client/utils/__init__.py b/python/paddle_serving_client/utils/__init__.py index 67884cf89d6fc7c8ba20f966cbb0a3a32f098855..62642314fa8f7f0ece778e34ff78fe3b2f039dfa 100644 --- a/python/paddle_serving_client/utils/__init__.py +++ b/python/paddle_serving_client/utils/__init__.py @@ -11,16 +11,28 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - +import os import sys import subprocess +import argparse from multiprocessing import Pool +def benchmark_args(): + parser = argparse.ArgumentParser("benchmark") + parser.add_argument("--thread", type=int, default=10, help="concurrecy") + parser.add_argument("--model", type=str, default="", help="model for evaluation") + parser.add_argument("--endpoint", type=str, default="127.0.0.1:9292", help="endpoint of server") + parser.add_argument("--request", type=str, default="rpc", help="mode of service") + return parser.parse_args() + + class MultiThreadRunner(object): def __init__(self): pass def run(self, thread_func, thread_num, global_resource): + os.environ["http_proxy"] = "" + os.environ["https_proxy"] = "" p = Pool(thread_num) result_list = [] for i in range(thread_num):