首页 > 其他分享 >模型部署实战:从训练到上线

模型部署实战:从训练到上线

时间:2024-03-31 12:29:05浏览次数:24  
标签:实战 上线 name models 模型 db model data

目录

1.前言

2.RESTful API设计

3.使用Flask/Django开发后端服务

4.使用TensorFlow Serving部署模型

5.性能监控与服务维护要点

6.总结


1.前言

        在机器学习的全周期中,模型部署是至关重要的一环。经过长时间的训练、验证和优化,当模型准备就绪时,我们需要确保它能高效地服务于线上业务。本文将介绍从模型训练到上线的完整流程,包括RESTful API设计、使用Flask/Django进行Web应用开发,以及使用TensorFlow Serving部署模型。此外,还会涉及性能监控与服务维护的要点。更多Python在人工智能中的使用方法,欢迎关注《Python人工智能实战》栏目!    

2.RESTful API设计

        RESTful API遵循Representational State Transfer(REST)架构风格,以简洁、规范的方式定义客户端与服务器之间的交互。设计时应遵循以下原则:

  1. 资源导向:每个URL代表一种资源,如/models代表所有模型,/models/<model_id>标识特定模型。
  2. HTTP动词:使用标准HTTP方法(GET、POST、PUT、DELETE等)表示操作意图,如GET获取资源信息,POST创建新资源。
  3. 状态码:返回恰当的HTTP状态码(如200、400、404、500等)反映请求处理结果。
  4. 分页与过滤:对于大量资源,支持分页查询与条件过滤,如/models?page=2&limit=10
  5. 响应格式:返回JSON格式数据,包含数据主体、状态信息及可能的错误详情。

        下面以Flask框架为例,展示一个简单的RESTful API设计示例,涵盖模型列表获取、单个模型详情、模型创建、模型更新与模型删除等操作: 

from flask import Flask, request, jsonify, abort
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///models.db'
db = SQLAlchemy(app)

class Model(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, nullable=False)
    description = db.Column(db.Text)

    def to_dict(self):
        return {
            'id': self.id,
            'name': self.name,
            'description': self.description
        }

db.create_all()

# GET /models
@app.route('/models', methods=['GET'])
def get_models():
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 10, type=int)
    models = Model.query.paginate(page, per_page, False).items
    return jsonify(models=[model.to_dict() for model in models]), 200

# GET /models/<int:model_id>
@app.route('/models/<int:model_id>', methods=['GET'])
def get_model(model_id):
    model = Model.query.get_or_404(model_id)
    return jsonify(model.to_dict()), 200

# POST /models
@app.route('/models', methods=['POST'])
def create_model():
    data = request.get_json() or {}
    if not data.get('name') or not data.get('description'):
        abort(400, 'Missing required fields: name, description')

    new_model = Model(name=data['name'], description=data['description'])
    db.session.add(new_model)
    db.session.commit()
    return jsonify(new_model.to_dict()), 201

# PUT /models/<int:model_id>
@app.route('/models/<int:model_id>', methods=['PUT'])
def update_model(model_id):
    model = Model.query.get_or_404(model_id)
    data = request.get_json() or {}
    if 'name' in data:
        model.name = data['name']
    if 'description' in data:
        model.description = data['description']
    db.session.commit()
    return jsonify(model.to_dict()), 200

# DELETE /models/<int:model_id>
@app.route('/models/<int:model_id>', methods=['DELETE'])
def delete_model(model_id):
    model = Model.query.get_or_404(model_id)
    db.session.delete(model)
    db.session.commit()
    return '', 204

if __name__ == '__main__':
    app.run(debug=True)

        上述代码创建了一个基于SQLite数据库的简单模型管理API。客户端可以通过对应的HTTP方法和URL访问和操作模型资源。例如:

  • 获取所有模型(分页):GET /models?page=1&per_page=20
  • 获取单个模型详情:GET /models/1
  • 创建新模型:POST /models,请求体包含JSON数据:{ "name": "Model A", "description": "A sample model" }
  • 更新模型:PUT /models/1,请求体包含JSON数据:{ "description": "Updated description" }
  • 删除模型:DELETE /models/1

        注意,为了简化示例,这里未包含详细的错误处理与验证逻辑,实际应用中应完善这些部分以确保API的健壮性和安全性。此外,为了演示RESTful API设计,这里使用了SQLite数据库和Flask-SQLAlchemy ORM,实际部署时可根据项目需求选用适合的数据库系统和ORM工具。

3.使用Flask/Django开发后端服务

        RESTful API是模型部署的桥梁,它允许客户端通过HTTP请求与模型进行交互。在设计RESTful API时,我们需要考虑接口的URL结构、请求方法、请求参数和响应格式等。

        以下是一个使用Flask框架开发RESTful API的简单示例:

from flask import Flask, request, jsonify
import numpy as np
import tensorflow as tf

app = Flask(__name__)

# 假设已有模型文件model.h5
model = tf.keras.models.load_model('model.h5')

@app.route('/predict', methods=['POST'])
def predict():
    data = request.get_json()
    input_data = np.array(data['features'], dtype=np.float32)
    
    # 使用模型进行预测
    predictions = model.predict(input_data)
    
    return jsonify({'predictions': predictions.tolist()}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

        运行上述Flask应用后,访问http://localhost:5000/predict并发送POST请求,携带JSON格式的features数据,将得到模型预测结果。例如:

{
  "features": [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]],
  ...
}

        响应示例:

{
  "predictions": [[0.7], [0.8]]
}

4.使用TensorFlow Serving部署模型

        TensorFlow Serving是一个高性能、可扩展的开源机器学习服务平台,它使得我们可以轻松地部署和扩展TensorFlow模型。

        首先,我们需要将训练好的模型导出为SavedModel格式:

import tensorflow as tf  
from tensorflow.python.saved_model import signature_constants  
from tensorflow.python.saved_model import tag_constants  
  
# 加载模型(这里假设是TensorFlow模型)  
model = tf.keras.models.load_model('my_model.h5')  
  
# 构建一个签名,定义模型的输入和输出  
input_tensor = tf.compat.v1.placeholder(tf.float32, shape=[None, 784])  # 假设输入是784维的向量  
predictions = model(input_tensor)  
  
# 构建一个SavedModelBuilder对象  
builder = tf.compat.v1.saved_model.builder.SavedModelBuilder('my_model')  
  
# 使用签名和标签构建SavedModel  
tensor_info_input = tf.compat.v1.saved_model.utils.build_tensor_info(input_tensor)  
tensor_info_predictions = tf.compat.v1.saved_model.utils.build_tensor_info(predictions)  
  
prediction_signature = (  
    tf.compat.v1.saved_model.signature_def_utils.build_signature_def(  
        inputs={'images': tensor_info_input},  
        outputs={'scores': tensor_info_predictions},  
        method_name=tf.saved_model.PREDICT_METHOD_NAME))  
  
builder.add_meta_graph_and_variables(  
    sess=tf.compat.v1.keras.backend.get_session(),  
    tags=[tag_constants.SERVING],  
    signature_def_map={  
        signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: prediction_signature  
    },  
)  
  
# 保存模型  
builder.save()

        然后,我们可以使用TensorFlow Serving来加载和提供这个模型的服务: 

tensorflow_model_server --port=9000 --rest_api_port=8501 --model_name=my_model --model_base_path=/path/to/my_model

        在上面的命令中,我们指定了模型的名称、基础路径以及端口号。TensorFlow Serving将加载模型,并监听指定的端口,等待客户端的请求。 

5.性能监控与服务维护要点

  1. 性能指标监控:跟踪API响应时间、请求成功率、模型预测延迟等关键性能指标,可使用Prometheus、Grafana等工具构建监控仪表板。

  2. 日志管理:确保服务器与应用层日志记录详尽,便于故障排查。可使用ELK(Elasticsearch、Logstash、Kibana)栈或其他日志管理系统。

  3. 异常检测与告警:设置阈值,当性能指标超出正常范围或发生异常时触发告警,通知运维人员及时介入。

  4. 版本管理与灰度发布:模型更新应支持版本控制,允许回滚。采用蓝绿部署、金丝雀发布等策略进行新版本上线,降低风险。

  5. 资源调度与扩容:根据负载情况动态调整服务器资源,如使用Kubernetes进行容器编排与自动扩缩容。

  6. 安全性考虑:实施身份验证、授权、加密通信(HTTPS)等措施,确保API服务的安全性。

  6.总结

        通过上述步骤,我们完成了从模型训练到线上部署的全过程,并对性能监控与服务维护要点进行了探讨。模型部署不仅需要技术实现,更需要严谨的运维策略与流程保障,以确保服务的稳定、高效与安全。

标签:实战,上线,name,models,模型,db,model,data
From: https://blog.csdn.net/meijinbo/article/details/137182253

相关文章

  • SiMBA:基于Mamba的跨图像和多元时间序列的预测模型
    这是3月26日新发的的论文,微软的研究人员简化的基于mamba的体系结构,并且将其同时应用在图像和时间序列中并且取得了良好的成绩。语言模型的发展正在从大型语言模型(LLMs)向小型语言模型(SLMs)转变。llm和slm的核心都是transformers,它是llm和slm的构建模块。虽然transformers通过其......
  • 18day-19day-2.2.CSS实战与提高
    2.2.CSS实战与提高练习11:制作开心餐厅页面CSS/*层次选择器*/p{font-size:14px;}/*body后代h2字体16px*/bodyh2{font-size:16px;}/*第一个h2颜色变为红色*/.firstH2{color:red;}/*第一个h2后面的通用兄弟元素h2变为蓝色*/.firstH2~h2{......
  • maya给模型以及子节点随机染色
    maya给模型以及子节点随机染色 importrandomimportmaya.cmdsaspydefmaterial1():sel=py.ls(sl=True)ifsel!=[]:forobjinsel:myShade=py.shadingNode('lambert',asShader=True)#printmyShademyShad......
  • Python装饰器实战:打造高效性能计时工具
    在数据分析工作中,针对百万,千万级别的数据进行分析是常有的事情,因此,分析代码性能的重要性不容忽视,能够有一个方便快速的测试函数性能的方法,对于我们快速发现性能瓶颈,及时优化,提高项目的开发效率至关重要。本文介绍如何通过Python装饰器来实现性能计时工具,帮助我们在不改变现有代码......
  • 【componentsearchengine.com网站不容易注册的解决办法,附MPU6050 Proteus原理图仿真模
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、先注册一个国外邮箱注册时注意事项:二、注册componentsearchengine.com网站帐号1.该网站注册注意事项2.一旦帐号注册成功,该网站就可以正常下载了,无需科学上网3.其他问题总结前言最......
  • (算法)Lake Counting <Flood Fill 洪水灌溉模型>
    题目:题解:#include<stdio.h>intn,m;chararr[110][110];//元数据数组intcount=0;//计数器intdx[8]={1,1,1,-1,-1,-1,0,0};intdy[8]={-1,0,1,-1,0,1,1,-1};intt[110][110];//判断是否被选择voiddfs(intx,inty){for(inti=0;i<......
  • 从零实战本地服务器部署 Docker 安装 ThingsBoard PE 专业版(适用于Cassandra + Kafka
    目录1、准备工作2、本地服务器LinuxCentos7.9系统安装docker2.1、检查Linux的内核版本2.2、卸载Docker旧版本(若有需要)2.3、安装Docker2.4、安装Docker引擎2.5、 启动docker和设置开机⾃启动3、使用Docker安装ThingsBoardPE3.1、 拉取ThingsBoardPE镜像3.2......
  • InternLM2 Demo初体验-书生浦语大模型实战营学习笔记2
    本文包括第二期实战营的第2课内容。本来是想给官方教程做做补充的,没想到官方教程的质量还是相当高的,跟着一步一步做基本上没啥坑。所以这篇笔记主要是拆解一下InternStudio封装的一些东西,防止在本地复现时出现各种问题。搭建环境首先是搭建环境这里,官方教程说:进入开发机后,在`t......
  • Matlab|孤岛划分|弹性配网故障划分模型
    目录1 主要内容1.1 DistFlow模型1.2 虚拟潮流1.3 目标函数2 部分代码3 程序结果4下载链接1 主要内容程序主要复现《ANewModelforResilient DistributionSystemsbyMicrogridsFormation》,建立灾害情况下配网优化孤岛划分方案,通过虚拟潮流的方式优......
  • [InternLM训练营第二期笔记]1. 书生·浦语大模型全链路开源开放体系
    由于想学习一下LLM相关的知识,真好看到上海AILab举行的InternLM训练营,可以提高对于LLM的动手能力。每次课堂都要求笔记,因此我就想在我的CSDN上更新一下,希望和感兴趣的同学共同学习~本次笔记是第一节课,介绍课。课程视频:BilibiliInternLM2Technicalreport:arxiv1.......