senta_web_service.py 3.7 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 import LACReader, SentaReader
M
MRXLT 已提交
18 19 20 21 22 23 24 25 26
import numpy as np
import os
import io
import sys
import subprocess
from multiprocessing import Process, Queue


class SentaService(WebService):
M
MRXLT 已提交
27
    def set_config(
M
MRXLT 已提交
28 29 30 31 32 33 34 35
            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 已提交
36 37 38 39
        self.show = False

    def show_detail(self, show=False):
        self.show = show
M
MRXLT 已提交
40

M
MRXLT 已提交
41 42
    def start_lac_service(self):
        os.chdir('./lac_serving')
M
MRXLT 已提交
43
        self.lac_port = self.port + 100
M
MRXLT 已提交
44
        r = os.popen(
M
MRXLT 已提交
45 46
            "python -m paddle_serving_server.serve --model {} --port {} &".
            format("../" + self.lac_model_path, self.lac_port))
M
MRXLT 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
        os.chdir('..')

    def init_lac_service(self):
        ps = Process(target=self.start_lac_service())
        ps.start()
        #self.init_lac_client()

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

    def init_lac_client(self):
        self.lac_client = Client()
M
MRXLT 已提交
63
        self.lac_client.load_client_config(self.lac_client_config_path)
M
MRXLT 已提交
64
        self.lac_client.connect(["127.0.0.1:{}".format(self.lac_port)])
M
MRXLT 已提交
65 66

    def init_lac_reader(self):
M
MRXLT 已提交
67
        self.lac_reader = LACReader(self.lac_dict_path)
M
MRXLT 已提交
68 69

    def init_senta_reader(self):
M
MRXLT 已提交
70
        self.senta_reader = SentaReader(vocab_path=self.senta_dict_path)
M
MRXLT 已提交
71 72

    def preprocess(self, feed={}, fetch={}):
M
MRXLT 已提交
73
        feed_data = self.lac_reader.process(feed[0]["words"])
M
MRXLT 已提交
74
        fetch = ["crf_decode"]
M
MRXLT 已提交
75 76 77
        if self.show:
            print("---- lac reader ----")
            print(feed_data)
M
MRXLT 已提交
78
        lac_result = self.lac_predict(feed_data)
M
MRXLT 已提交
79 80 81
        if self.show:
            print("---- lac out ----")
            print(lac_result)
M
MRXLT 已提交
82
        segs = self.lac_reader.parse_result(feed[0]["words"],
M
MRXLT 已提交
83
                                            lac_result["crf_decode"])
M
MRXLT 已提交
84 85 86
        if self.show:
            print("---- lac parse ----")
            print(segs)
M
MRXLT 已提交
87
        feed_data = self.senta_reader.process(segs)
M
MRXLT 已提交
88 89 90 91
        if self.show:
            print("---- senta reader ----")
            print("feed_data", feed_data)
        fetch = ["class_probs"]
M
MRXLT 已提交
92 93 94
        return {"words": feed_data}, fetch


M
MRXLT 已提交
95 96 97
senta_service = SentaService(name="senta")
#senta_service.show_detail(True)
senta_service.set_config(
M
MRXLT 已提交
98 99
    lac_model_path="./lac_model",
    lac_dict_path="./lac_dict",
M
MRXLT 已提交
100
    senta_dict_path="./vocab.txt")
M
MRXLT 已提交
101
senta_service.load_model_config(sys.argv[1])
M
MRXLT 已提交
102 103
senta_service.prepare_server(
    workdir=sys.argv[2], port=int(sys.argv[3]), device="cpu")
M
MRXLT 已提交
104 105 106 107
senta_service.init_lac_reader()
senta_service.init_senta_reader()
senta_service.init_lac_service()
senta_service.run_server()
M
MRXLT 已提交
108
senta_service.run_flask()