专栏首页小鹏的专栏[TextMatch框架] server

[TextMatch框架] server

TextMatch

TextMatch is a semantic matching model library for QA & text search … It’s easy to train models and to export representation vectors.

TextMatch/server模块包含 :(基于MLFlow的server)

model_server.py

import os
import sys
import time
import platform
import argparse
import cloudpickle
import numpy as np
import mlflow.pyfunc
from pyspark.sql import DataFrame
from sklearn.externals import joblib
from textmatch.config.constant import Constant as const
from textmatch.models.text_embedding.model_factory_sklearn import ModelFactory


cur_abs_dir = os.path.dirname(os.path.abspath(__file__))
code_home = cur_abs_dir
sys.path.insert(0, code_home)
print('[model_server] python version: %s' % platform.python_version())
print('[model_server] code_home: %s' % code_home)

start = time.time()
exec_time = time.time() - int(time.time()) % 900
local_time = time.localtime(exec_time - 30 * 60)
exec_day = time.strftime('%Y-%m-%d', local_time)
exec_hour = time.strftime('%H', local_time)
exec_minute = time.strftime('%M', local_time)


class TextMatchWrapper(mlflow.pyfunc.PythonModel):
    def __init__(self, experiment_name, version_name):
        self.experiment_name = experiment_name
        self.version_name = version_name
        self.wordstest_dict = {"0":"我去玉龙雪山并且喜欢玉龙雪山玉龙雪山", "1":"我在玉龙雪山并且喜欢玉龙雪山", "2":"我在九寨沟", "3":"你好"}   #["我去玉龙雪山并且喜欢玉龙雪山玉龙雪山","我在玉龙雪山并且喜欢玉龙雪山","我在九寨沟"]
        self.mf = ModelFactory( match_models=['bow', 'tfidf', 'ngram_tfidf'] )

    def load_context(self, context):
        # wordstest_dict = context.artifacts["wordstest_dict"]
        self.mf.init(words_dict=self.wordstest_dict, update=True)

    def predict(self, context, model_input):
        #print('model_input>>>', model_input)
        #print('model_input[text]>>>', model_input["text"].values)
        return self.mf.predict(model_input["text"].values[0])



# 模型预测主流程
def model_server(experiment_name, version_name, args): #, model_path='./data/'):

    artifacts = {
        "train_model": os.path.join(const.BOW_DIC_PATH )
    }
    if args.local_store:
        mlflow.pyfunc.save_model(path=args.model_file,
                                python_model=TextMatchWrapper(experiment_name, version_name),
                                artifacts=artifacts)
    else:
        mlflow.pyfunc.log_model(artifact_path=args.model_file,
                                 python_model=TextMatchWrapper(experiment_name, version_name),
                                 artifacts=artifacts)



def parse_argvs():
    parser = argparse.ArgumentParser(description='textmatch ---- 模型线上部署')
    parser.add_argument("--experiment_name", help="实验名称")
    parser.add_argument("--version_name", help="版本名称")
    parser.add_argument("--model_file", help="模型存储路径",default='model')
    parser.add_argument("--local_store", help="是否本地存储",action='store_true', default=True)
    args = parser.parse_args()
    print('[model_predictor] args: %s' % args)

    return parser, args

# python model_server.py --experiment_name "textmatch" --version_name "001" --model_file "textmodel"
# mlflow models serve -m /Users/qudian/Desktop/TextMatch/textmodel/ -h 0.0.0.0 -w 3 -p 5000 --no-conda
if __name__ == '__main__':
    parser, args = parse_argvs()
    # 输入参数解析
    experiment_name = args.experiment_name      # 实验名称
    input_version_name = args.version_name      # 输入的版本名称
    model_server(experiment_name=experiment_name, version_name=input_version_name, args=args)

    end = time.time()
    print('运行时长: {}s'.format(int(end - start)))

构建mlflow server模型

python model_server.py --experiment_name "textmatch" --version_name "001" --model_file "textmodel"

启动服务

mlflow models serve -m /Users/qudian/Desktop/TextMatch/textmodel/ -h 0.0.0.0 -w 3 -p 5000 --no-conda

post_data.py

import requests
import pandas as pd
import json
import time 


for i in range(100):
    # 构造需要进行推断的数据
    newJson = '{"text":"我在九寨沟,很喜欢"}'
    # 指定ip, 端口
    url = "http://127.0.0.1:5000/invocations"
    # 传递的参数需要从dataframe转化为json格式
    json_data = json.loads( newJson )
    model_input = pd.DataFrame([json_data])
    req_data = model_input.to_json(orient='split')
    headers = {'content-type': 'application/json; format=pandas-split'}
    # 使用POST方式调用REST api
    start_time = time.time()
    respond = requests.request("POST", url, data=req_data, headers=headers) 
    print ("time>>>>>>>", time.time() - start_time)
    print ( "respond>>", respond )
    # 获取返回值
    print (respond.json()) 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • FunTester moco server框架架构图

    之前画了两张框架的架构图:FunTester测试框架架构图初探和FunTester测试项目架构图初探,反响不错,最近又对moco API产生了兴趣复习一下,顺便...

    FunTester
  • Python:用 peewee 框架连接 SQL Server

      Peewee 默认支持 Sqlite、MySQL、PostgreSQL 三种数据库,如果要使用其他数据库,需要同时安装扩展库。比如 SQL Server,需...

    丹枫无迹
  • fasthttp:比net/http快十倍的Go框架(server 篇)

    我们在上一篇文章中讲解了 Go HTTP 标准库的实现原理,这一次我找到了一个号称比net/http快十倍的Go框架 fasthttp,这次我们再来看看它有哪些...

    luozhiyun
  • 架构·Client-Server

    一个联网应用程序总是分布在两个或多个主机之间,这就衍生了我们该如何在多个主机之间划分功能的问题。

    幺鹿
  • PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】

    本文实例讲述了PHP连接SQL Server的方法。分享给大家供大家参考,具体如下:

    砸漏
  • 【xAsset框架】HFS 轻量级HTTP Server快速入门指南

      最近马三有幸参与开发了一个简易轻量的Unity资源管理框架 xAsset ,xasset 提供了一种使用资源路径的简单的方式来加载资源,简化了Unity项目...

    马三小伙儿
  • 在线商城项目09-基于express框架的server端搭建

    在本地项目目录加入.gitignore文件,可以直接copy six-tao项目的该文件。

    love丁酥酥
  • 基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇

    在前置的《基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇》一文中已经定义了一个相对简单的RPC私有协议,并且实现了对应的编码和解码模块。这...

    Throwable
  • Android精通之OrmLite数据库框架,Picasso框架,Okio框架,OKHttp框架

    什么是OrmLite框架,在我没用这个框架时,不知道它有多好,用了才知道很方便哦,为了提供开发效率,Android开发者需要懂得运行多种框架进行开发。对于Orm...

    达达前端

扫码关注云+社区

领取腾讯云代金券