tensorflow的模型使用flask制作windows系统服务

简介: tensorflow的模型使用flask制作windows系统服务

搜罗到两种方案,经测试都可正常运行。这两种方案各有利弊,可根据实际需求选择。

  1. nssm的方案
    将tensorflow模型的推理逻辑制作成flask服务,假设文件为app.py。其中的model_predict需要换成用户自己的推理模块。
# app.py文件
from flask import Flask, request
import numpy as np
from tensorflow.python.saved_model import tag_constants
from tensorflow.contrib.tensor_forest.python import tensor_forest
from tensorflow.python.ops import resources
import tensorflow.compat.v1 as tf
import json
from gevent import pywsgi
import multiprocessing
from multiprocessing import freeze_support
from datetime import datetime
import platform
app = Flask(__name__)
class predict():
    def __init__(self, model_path):
        # with tf.Session() as self.sess:
        self.sess = tf.Session()
        meta_graph_def = tf.saved_model.loader.load(self.sess, [tag_constants.SERVING], model_path + '/001/')
        signature = meta_graph_def.signature_def
        self.x = signature['prediction'].inputs['input'].name
        self.result = signature['prediction'].outputs['output'].name
    def run(self, input_data):
        _input_data = []
        _input_data.append(input_data)
        y = self.sess.run(self.result, feed_dict={self.x: _input_data})
        return y
@app.route('/')
def hello():
    return 'hello world'
@app.route('/predict', methods=['POST'])
def model_predict():
    input_json = request.get_json()
    method = input_json['method']
    input_data = input_json['data']
    if method != "inference":
        results = {'ret_code':101,'ret_message':'字段错误'}
        return json.dumps(results,ensure_ascii=False)
    input_arr = np.array(input_data)
    try:
        result = pred_infer.run(input_arr)[0]
        if (result[1] > 0.5):
            ret_status = 'good'
        else:
            ret_status = 'bad'
        ret_code = 100
        results = {'ret_code':ret_code,'ret_message':'处理成功','result':result.tolist(),'ret_status':ret_status}
    except:
        ret_code =  201
        results = {'ret_code':ret_code,'ret_message':'参数错误'}
    results_json = json.dumps(results,ensure_ascii=False)
    return results_json
#model_path = '.\\models\\healthy\\model_state'
model_path = 'D:\\YourModelPath\\models\\model_state'
pred_infer = predict(model_path)
def MyServer(host, port):
    server = pywsgi.WSGIServer((host, port), app)
    server.serve_forever()
if __name__ == '__main__':
    MyServer('0.0.0.0', 8088)
  1. 将python文件打包成exe文件。
D:\Python36\Scripts\pyinstaller.exe -F .\app.py #dist目录下生成app.exe
  1. 命令行测试app.exe能否正常运行,提供推理服务。
    下载nssm,使用nssm实现注册/开启/关闭/更新/移除服务。
nssm\win32\nssm.exe install  appServer  #注册服务,appServer是服务名
nssm\win32\nssm.exe start  appServer    #开启服务,appServer是服务名
  1. pywin32的方案
    将tensorflow模型的推理逻辑改写成flask服务,假设文件为app.py(推理模块)和server.py(服务模块)。
# app.py文件
from flask import Flask, request
import numpy as np
from tensorflow.python.saved_model import tag_constants
from tensorflow.contrib.tensor_forest.python import tensor_forest
from tensorflow.python.ops import resources
import tensorflow.compat.v1 as tf
import json
from gevent import pywsgi
import multiprocessing
from multiprocessing import freeze_support
from datetime import datetime
import platform
app = Flask(__name__)
class predict():
    def __init__(self, model_path):
        # with tf.Session() as self.sess:
        self.sess = tf.Session()
        meta_graph_def = tf.saved_model.loader.load(self.sess, [tag_constants.SERVING], model_path + '/001/')
        signature = meta_graph_def.signature_def
        self.x = signature['prediction'].inputs['input'].name
        self.result = signature['prediction'].outputs['output'].name
    def run(self, input_data):
        _input_data = []
        _input_data.append(input_data)
        y = self.sess.run(self.result, feed_dict={self.x: _input_data})
        return y
@app.route('/')
def hello():
    return 'hello world'
@app.route('/predict', methods=['POST'])
def model_predict():
    input_json = request.get_json()
    method = input_json['method']
    input_data = input_json['data']
    if method != "inference":
        results = {'ret_code':101,'ret_message':'字段错误'}
        return json.dumps(results,ensure_ascii=False)
    input_arr = np.array(input_data)
    try:
        result = pred_infer.run(input_arr)[0]
        if (result[1] > 0.5):
            ret_status = 'good'
        else:
            ret_status = 'bad'
        ret_code = 100
        results = {'ret_code':ret_code,'ret_message':'处理成功','result':result.tolist(),'ret_status':ret_status}
    except:
        ret_code =  201
        results = {'ret_code':ret_code,'ret_message':'参数错误'}
    results_json = json.dumps(results,ensure_ascii=False)
    return results_json
#model_path = '.\\models\\healthy\\model_state'
model_path = 'D:\\YourModelPath\\models\\model_state'
pred_infer = predict(model_path)
  1. 就是把WSGIServer调用的部分放到server.py中。拆分的原因很明显,解耦合,方便其他模型做服务时,只在app.py内改动。特别注意, 模型的路径需要用绝对路径,相对路径可以注册服务,但无法正常启动服务(闪退)。
# server.py文件
import win32serviceutil
from gevent.pywsgi import WSGIServer
from app import app
class Service(win32serviceutil.ServiceFramework):
    # 服务名
    _svc_name_ = "flask_gevent_service_test"
    # 显示服务名
    _svc_display_name_ = "flask gevent service test display name"
    # 描述
    _svc_description_ = "flask gevent service test description"
    def __init__(self, *args):
        super().__init__(*args)
        # host和ip绑定
        self.http_server = WSGIServer(('127.0.0.1', 8088), app)
        self.SvcStop = self.http_server.stop
        self.SvcDoRun = self.http_server.serve_forever
if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(Service)
  1. 使用python自带的pythonServer实现注册/开启/关闭/更新/移除服务。
python server.py install  #注册服务
python server.py start    #开启服务
  1. 总结:在某些情况下无法使用nssm的方案,比如防火墙拦截等,这时可选择第二种方案。当然第二种方案的执行命令仍然需要python环境包,可以在此基础上将app.py和server.py两个文件打包成一个exe,方便移植。这部分操作读者可以参考第一种方案中的打包方法自行验证。
相关文章
|
5月前
|
开发框架 监控 安全
Windows Defender 导致 Web IIS 服务异常停止排查
某日凌晨IIS服务异常停止,经查为Windows Defender安全补丁KB2267602触发引擎更新,导致系统资源波动,进而引发应用池回收。确认非人为操作,系统无重启。通过分析日志与监控,定位原因为Defender更新后扫描加重负载。解决方案:将IIS及.NET相关路径添加至Defender排除列表,避免业务影响。
638 116
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
1229 55
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
害虫识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了12种常见的害虫种类数据集【"蚂蚁(ants)", "蜜蜂(bees)", "甲虫(beetle)", "毛虫(catterpillar)", "蚯蚓(earthworms)", "蜚蠊(earwig)", "蚱蜢(grasshopper)", "飞蛾(moth)", "鼻涕虫(slug)", "蜗牛(snail)", "黄蜂(wasp)", "象鼻虫(weevil)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Djan
669 1
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
1210 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
665 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
Linux iOS开发 MacOS
Gitea Enterprise 23.4.0 (Linux, macOS, Windows) - 本地部署的企业级 Git 服务
Gitea Enterprise 23.4.0 (Linux, macOS, Windows) - 本地部署的企业级 Git 服务
350 0
Gitea Enterprise 23.4.0 (Linux, macOS, Windows) - 本地部署的企业级 Git 服务
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2280 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
机器学习/深度学习 数据采集 数据可视化
TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤
本文介绍了 TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤,包括数据准备、模型定义、损失函数与优化器选择、模型训练与评估、模型保存与部署,并展示了构建全连接神经网络的具体示例。此外,还探讨了 TensorFlow 的高级特性,如自动微分、模型可视化和分布式训练,以及其在未来的发展前景。
1091 5