diff --git a/python/paddle_serving_client/version.py b/python/paddle_serving_client/version.py index 3513e4ce98ac9cd6655495d3bbaacb6943782837..ca18ebdf448561961e0f83d6786180482ff5a72a 100644 --- a/python/paddle_serving_client/version.py +++ b/python/paddle_serving_client/version.py @@ -12,6 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. """ Paddle Serving Client version string """ -serving_client_version = "0.1.1" -serving_server_version = "0.1.0" -module_proto_version = "0.1.0" +serving_client_version = "0.1.2" +serving_server_version = "0.1.2" +module_proto_version = "0.1.2" diff --git a/python/paddle_serving_server/version.py b/python/paddle_serving_server/version.py index d67c284b10a57ec866bafcb4a1f28a2529d5073d..ca18ebdf448561961e0f83d6786180482ff5a72a 100644 --- a/python/paddle_serving_server/version.py +++ b/python/paddle_serving_server/version.py @@ -12,6 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. """ Paddle Serving Client version string """ -serving_client_version = "0.1.0" -serving_server_version = "0.1.0" -module_proto_version = "0.1.0" +serving_client_version = "0.1.2" +serving_server_version = "0.1.2" +module_proto_version = "0.1.2" diff --git a/python/paddle_serving_server_gpu/serve.py b/python/paddle_serving_server_gpu/serve.py new file mode 100644 index 0000000000000000000000000000000000000000..1a88797b285c0b168e52e54755da3b7ea5bad434 --- /dev/null +++ b/python/paddle_serving_server_gpu/serve.py @@ -0,0 +1,77 @@ +# 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. +""" +Usage: + Host a trained paddle model with one line command + Example: + python -m paddle_serving_server.serve --model ./serving_server_model --port 9292 +""" +import argparse + + +def parse_args(): + parser = argparse.ArgumentParser("serve") + parser.add_argument( + "--thread", type=int, default=10, help="Concurrency of server") + parser.add_argument( + "--model", type=str, default="", help="Model for serving") + parser.add_argument( + "--port", type=int, default=9292, help="Port the server") + parser.add_argument( + "--workdir", + type=str, + default="workdir", + help="Working dir of current service") + parser.add_argument( + "--device", type=str, default="gpu", help="Type of device") + parser.add_argument("--gpuid", type=int, default=0, help="Index of GPU") + return parser.parse_args() + + +def start_standard_model(): + args = parse_args() + thread_num = args.thread + model = args.model + port = args.port + workdir = args.workdir + device = args.device + gpuid = args.gpuid + + if model == "": + print("You must specify your serving model") + exit(-1) + + import paddle_serving_server_gpu as serving + op_maker = serving.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 = serving.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 = serving.Server() + server.set_op_sequence(op_seq_maker.get_op_sequence()) + server.set_num_threads(thread_num) + + server.load_model_config(model) + server.prepare_server(workdir=workdir, port=port, device=device) + server.set_gpuid(gpuid) + server.run_server() + + +if __name__ == "__main__": + start_standard_model() diff --git a/python/paddle_serving_server_gpu/version.py b/python/paddle_serving_server_gpu/version.py index d67c284b10a57ec866bafcb4a1f28a2529d5073d..ca18ebdf448561961e0f83d6786180482ff5a72a 100644 --- a/python/paddle_serving_server_gpu/version.py +++ b/python/paddle_serving_server_gpu/version.py @@ -12,6 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. """ Paddle Serving Client version string """ -serving_client_version = "0.1.0" -serving_server_version = "0.1.0" -module_proto_version = "0.1.0" +serving_client_version = "0.1.2" +serving_server_version = "0.1.2" +module_proto_version = "0.1.2" diff --git a/python/paddle_serving_server_gpu/web_serve.py b/python/paddle_serving_server_gpu/web_serve.py new file mode 100644 index 0000000000000000000000000000000000000000..e7b44034797a8de75ca8dc5d97f7dc93c9671954 --- /dev/null +++ b/python/paddle_serving_server_gpu/web_serve.py @@ -0,0 +1,51 @@ +# 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. +""" +Usage: + Host a trained paddle model with one line command + Example: + python -m paddle_serving_server.web_serve --model ./serving_server_model --port 9292 +""" +import argparse +from multiprocessing import Pool, Process +from .web_service import WebService + + +def parse_args(): + parser = argparse.ArgumentParser("web_serve") + parser.add_argument( + "--thread", type=int, default=10, help="Concurrency of server") + parser.add_argument( + "--model", type=str, default="", help="Model for serving") + parser.add_argument( + "--port", type=int, default=9292, help="Port the server") + parser.add_argument( + "--workdir", + type=str, + default="workdir", + help="Working dir of current service") + parser.add_argument( + "--device", type=str, default="cpu", help="Type of device") + parser.add_argument( + "--name", type=str, default="default", help="Default service name") + return parser.parse_args() + + +if __name__ == "__main__": + args = parse_args() + service = WebService(name=args.name) + service.load_model_config(args.model) + service.prepare_server( + workdir=args.workdir, port=args.port, device=args.device) + service.run_server() diff --git a/python/paddle_serving_server_gpu/web_service.py b/python/paddle_serving_server_gpu/web_service.py new file mode 100755 index 0000000000000000000000000000000000000000..3f129a45853b02711f96953b0b902015d2f2d3e8 --- /dev/null +++ b/python/paddle_serving_server_gpu/web_service.py @@ -0,0 +1,94 @@ +# 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. +#!flask/bin/python +from flask import Flask, request, abort +from multiprocessing import Pool, Process +from paddle_serving_server_gpu import OpMaker, OpSeqMaker, Server +from paddle_serving_client import Client + + +class WebService(object): + def __init__(self, name="default_service"): + self.name = name + + def load_model_config(self, model_config): + self.model_config = model_config + + def _launch_rpc_service(self): + 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(16) + server.set_gpuid = self.gpuid + server.load_model_config(self.model_config) + server.prepare_server( + workdir=self.workdir, port=self.port + 1, device=self.device) + server.run_server() + + def prepare_server(self, workdir="", port=9393, device="gpu", gpuid=0): + self.workdir = workdir + self.port = port + self.device = device + self.gpuid = gpuid + + def _launch_web_service(self): + app_instance = Flask(__name__) + client_service = Client() + client_service.load_client_config( + "{}/serving_server_conf.prototxt".format(self.model_config)) + client_service.connect(["127.0.0.1:{}".format(self.port + 1)]) + service_name = "/" + self.name + "/prediction" + + @app_instance.route(service_name, methods=['POST']) + def get_prediction(): + if not request.json: + abort(400) + if "fetch" not in request.json: + abort(400) + feed, fetch = self.preprocess(request.json, request.json["fetch"]) + fetch_map = client_service.predict(feed=feed, fetch=fetch) + fetch_map = self.postprocess( + feed=request.json, fetch=fetch, fetch_map=fetch_map) + return fetch_map + + app_instance.run(host="127.0.0.1", + port=self.port, + threaded=False, + processes=1) + + def run_server(self): + import socket + localIP = socket.gethostbyname(socket.gethostname()) + print("web service address:") + print("http://{}:{}/{}/prediction".format(localIP, self.port, + self.name)) + p_rpc = Process(target=self._launch_rpc_service) + p_web = Process(target=self._launch_web_service) + p_rpc.start() + p_web.start() + p_web.join() + p_rpc.join() + + def preprocess(self, feed={}, fetch=[]): + return feed, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map={}): + return fetch_map