senta_web_service.py 3.3 KB
Newer Older
M
MRXLT 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# 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_server_gpu.web_service import WebService
from paddle_serving_client import Client
M
MRXLT 已提交
17
from paddle_serving_app.reader import LACReader, SentaReader
M
MRXLT 已提交
18 19
import os
import sys
M
MRXLT 已提交
20
from multiprocessing import Process
M
MRXLT 已提交
21 22 23


class SentaService(WebService):
M
MRXLT 已提交
24
    def set_config(
M
MRXLT 已提交
25 26 27 28 29 30 31 32 33
            self,
            lac_model_path,
            lac_dict_path,
            senta_dict_path, ):
        self.lac_model_path = lac_model_path
        self.lac_client_config_path = lac_model_path + "/serving_server_conf.prototxt"
        self.lac_dict_path = lac_dict_path
        self.senta_dict_path = senta_dict_path

M
MRXLT 已提交
34
    def start_lac_service(self):
35 36
        if not os.path.exists('./lac_serving'):
            os.mkdir("./lac_serving")
M
MRXLT 已提交
37
        os.chdir('./lac_serving')
M
MRXLT 已提交
38
        self.lac_port = self.port + 100
M
MRXLT 已提交
39
        r = os.popen(
M
MRXLT 已提交
40 41
            "python -m paddle_serving_server.serve --model {} --port {} &".
            format("../" + self.lac_model_path, self.lac_port))
M
MRXLT 已提交
42 43 44 45 46
        os.chdir('..')

    def init_lac_service(self):
        ps = Process(target=self.start_lac_service())
        ps.start()
M
MRXLT 已提交
47
        self.init_lac_client()
M
MRXLT 已提交
48 49 50 51 52 53 54 55

    def lac_predict(self, feed_data):
        lac_result = self.lac_client.predict(
            feed={"words": feed_data}, fetch=["crf_decode"])
        return lac_result

    def init_lac_client(self):
        self.lac_client = Client()
M
MRXLT 已提交
56
        self.lac_client.load_client_config(self.lac_client_config_path)
M
MRXLT 已提交
57
        self.lac_client.connect(["127.0.0.1:{}".format(self.lac_port)])
M
MRXLT 已提交
58 59

    def init_lac_reader(self):
M
MRXLT 已提交
60
        self.lac_reader = LACReader()
M
MRXLT 已提交
61 62

    def init_senta_reader(self):
M
MRXLT 已提交
63
        self.senta_reader = SentaReader()
M
MRXLT 已提交
64

M
MRXLT 已提交
65
    def preprocess(self, feed=[], fetch=[]):
M
MRXLT 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79
        feed_data = [{
            "words": self.lac_reader.process(x["words"])
        } for x in feed]
        lac_result = self.lac_client.predict(
            feed=feed_data, fetch=["crf_decode"])
        feed_batch = []
        result_lod = lac_result["crf_decode.lod"]
        for i in range(len(feed)):
            segs = self.lac_reader.parse_result(
                feed[i]["words"],
                lac_result["crf_decode"][result_lod[i]:result_lod[i + 1]])
            feed_data = self.senta_reader.process(segs)
            feed_batch.append({"words": feed_data})
        return feed_batch, fetch
M
MRXLT 已提交
80 81


M
MRXLT 已提交
82 83
senta_service = SentaService(name="senta")
senta_service.set_config(
M
MRXLT 已提交
84 85
    lac_model_path="./lac_model",
    lac_dict_path="./lac_dict",
M
MRXLT 已提交
86
    senta_dict_path="./vocab.txt")
M
MRXLT 已提交
87
senta_service.load_model_config(sys.argv[1])
M
MRXLT 已提交
88 89
senta_service.prepare_server(
    workdir=sys.argv[2], port=int(sys.argv[3]), device="cpu")
M
MRXLT 已提交
90 91 92
senta_service.init_lac_reader()
senta_service.init_senta_reader()
senta_service.init_lac_service()
M
MRXLT 已提交
93 94
senta_service.run_rpc_service()
senta_service.run_web_service()