Skip to content

Commit 0783866

Browse files
authored
Merge pull request #241 from MRXLT/general-server-gpu
add web service for gpu server
2 parents 6312429 + 28e53ba commit 0783866

File tree

6 files changed

+231
-9
lines changed

6 files changed

+231
-9
lines changed

python/paddle_serving_client/version.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
""" Paddle Serving Client version string """
15-
serving_client_version = "0.1.1"
16-
serving_server_version = "0.1.0"
17-
module_proto_version = "0.1.0"
15+
serving_client_version = "0.1.2"
16+
serving_server_version = "0.1.2"
17+
module_proto_version = "0.1.2"

python/paddle_serving_server/version.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
""" Paddle Serving Client version string """
15-
serving_client_version = "0.1.0"
16-
serving_server_version = "0.1.0"
17-
module_proto_version = "0.1.0"
15+
serving_client_version = "0.1.2"
16+
serving_server_version = "0.1.2"
17+
module_proto_version = "0.1.2"
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
"""
15+
Usage:
16+
Host a trained paddle model with one line command
17+
Example:
18+
python -m paddle_serving_server.serve --model ./serving_server_model --port 9292
19+
"""
20+
import argparse
21+
22+
23+
def parse_args():
24+
parser = argparse.ArgumentParser("serve")
25+
parser.add_argument(
26+
"--thread", type=int, default=10, help="Concurrency of server")
27+
parser.add_argument(
28+
"--model", type=str, default="", help="Model for serving")
29+
parser.add_argument(
30+
"--port", type=int, default=9292, help="Port the server")
31+
parser.add_argument(
32+
"--workdir",
33+
type=str,
34+
default="workdir",
35+
help="Working dir of current service")
36+
parser.add_argument(
37+
"--device", type=str, default="gpu", help="Type of device")
38+
parser.add_argument("--gpuid", type=int, default=0, help="Index of GPU")
39+
return parser.parse_args()
40+
41+
42+
def start_standard_model():
43+
args = parse_args()
44+
thread_num = args.thread
45+
model = args.model
46+
port = args.port
47+
workdir = args.workdir
48+
device = args.device
49+
gpuid = args.gpuid
50+
51+
if model == "":
52+
print("You must specify your serving model")
53+
exit(-1)
54+
55+
import paddle_serving_server_gpu as serving
56+
op_maker = serving.OpMaker()
57+
read_op = op_maker.create('general_reader')
58+
general_infer_op = op_maker.create('general_infer')
59+
general_response_op = op_maker.create('general_response')
60+
61+
op_seq_maker = serving.OpSeqMaker()
62+
op_seq_maker.add_op(read_op)
63+
op_seq_maker.add_op(general_infer_op)
64+
op_seq_maker.add_op(general_response_op)
65+
66+
server = serving.Server()
67+
server.set_op_sequence(op_seq_maker.get_op_sequence())
68+
server.set_num_threads(thread_num)
69+
70+
server.load_model_config(model)
71+
server.prepare_server(workdir=workdir, port=port, device=device)
72+
server.set_gpuid(gpuid)
73+
server.run_server()
74+
75+
76+
if __name__ == "__main__":
77+
start_standard_model()

python/paddle_serving_server_gpu/version.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
""" Paddle Serving Client version string """
15-
serving_client_version = "0.1.0"
16-
serving_server_version = "0.1.0"
17-
module_proto_version = "0.1.0"
15+
serving_client_version = "0.1.2"
16+
serving_server_version = "0.1.2"
17+
module_proto_version = "0.1.2"
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
"""
15+
Usage:
16+
Host a trained paddle model with one line command
17+
Example:
18+
python -m paddle_serving_server.web_serve --model ./serving_server_model --port 9292
19+
"""
20+
import argparse
21+
from multiprocessing import Pool, Process
22+
from .web_service import WebService
23+
24+
25+
def parse_args():
26+
parser = argparse.ArgumentParser("web_serve")
27+
parser.add_argument(
28+
"--thread", type=int, default=10, help="Concurrency of server")
29+
parser.add_argument(
30+
"--model", type=str, default="", help="Model for serving")
31+
parser.add_argument(
32+
"--port", type=int, default=9292, help="Port the server")
33+
parser.add_argument(
34+
"--workdir",
35+
type=str,
36+
default="workdir",
37+
help="Working dir of current service")
38+
parser.add_argument(
39+
"--device", type=str, default="cpu", help="Type of device")
40+
parser.add_argument(
41+
"--name", type=str, default="default", help="Default service name")
42+
return parser.parse_args()
43+
44+
45+
if __name__ == "__main__":
46+
args = parse_args()
47+
service = WebService(name=args.name)
48+
service.load_model_config(args.model)
49+
service.prepare_server(
50+
workdir=args.workdir, port=args.port, device=args.device)
51+
service.run_server()
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
#!flask/bin/python
15+
from flask import Flask, request, abort
16+
from multiprocessing import Pool, Process
17+
from paddle_serving_server_gpu import OpMaker, OpSeqMaker, Server
18+
from paddle_serving_client import Client
19+
20+
21+
class WebService(object):
22+
def __init__(self, name="default_service"):
23+
self.name = name
24+
25+
def load_model_config(self, model_config):
26+
self.model_config = model_config
27+
28+
def _launch_rpc_service(self):
29+
op_maker = OpMaker()
30+
read_op = op_maker.create('general_reader')
31+
general_infer_op = op_maker.create('general_infer')
32+
general_response_op = op_maker.create('general_response')
33+
op_seq_maker = OpSeqMaker()
34+
op_seq_maker.add_op(read_op)
35+
op_seq_maker.add_op(general_infer_op)
36+
op_seq_maker.add_op(general_response_op)
37+
server = Server()
38+
server.set_op_sequence(op_seq_maker.get_op_sequence())
39+
server.set_num_threads(16)
40+
server.set_gpuid = self.gpuid
41+
server.load_model_config(self.model_config)
42+
server.prepare_server(
43+
workdir=self.workdir, port=self.port + 1, device=self.device)
44+
server.run_server()
45+
46+
def prepare_server(self, workdir="", port=9393, device="gpu", gpuid=0):
47+
self.workdir = workdir
48+
self.port = port
49+
self.device = device
50+
self.gpuid = gpuid
51+
52+
def _launch_web_service(self):
53+
app_instance = Flask(__name__)
54+
client_service = Client()
55+
client_service.load_client_config(
56+
"{}/serving_server_conf.prototxt".format(self.model_config))
57+
client_service.connect(["127.0.0.1:{}".format(self.port + 1)])
58+
service_name = "/" + self.name + "/prediction"
59+
60+
@app_instance.route(service_name, methods=['POST'])
61+
def get_prediction():
62+
if not request.json:
63+
abort(400)
64+
if "fetch" not in request.json:
65+
abort(400)
66+
feed, fetch = self.preprocess(request.json, request.json["fetch"])
67+
fetch_map = client_service.predict(feed=feed, fetch=fetch)
68+
fetch_map = self.postprocess(
69+
feed=request.json, fetch=fetch, fetch_map=fetch_map)
70+
return fetch_map
71+
72+
app_instance.run(host="127.0.0.1",
73+
port=self.port,
74+
threaded=False,
75+
processes=1)
76+
77+
def run_server(self):
78+
import socket
79+
localIP = socket.gethostbyname(socket.gethostname())
80+
print("web service address:")
81+
print("http://{}:{}/{}/prediction".format(localIP, self.port,
82+
self.name))
83+
p_rpc = Process(target=self._launch_rpc_service)
84+
p_web = Process(target=self._launch_web_service)
85+
p_rpc.start()
86+
p_web.start()
87+
p_web.join()
88+
p_rpc.join()
89+
90+
def preprocess(self, feed={}, fetch=[]):
91+
return feed, fetch
92+
93+
def postprocess(self, feed={}, fetch=[], fetch_map={}):
94+
return fetch_map

0 commit comments

Comments
 (0)