flask部署深度学习api接口

简介: flask部署深度学习api接口

1. flask框架中request请求


在日常中我们通常会对我们已经做好的端对端对机器学习或者深度学习项目,部署到网页端或者GPU服务器中,具体的模型工程部署的方法有几种,如下:


  • 将模型预测直接打包成http api接口
  • PMML
  • TensorFlow Serving

这里我只介绍第一个,将模型打包成api接口这一种方法

将模型打包成api接口通常需要借助一些web框架,最常用的就是flask框架。


我们部署的方式,就是将模型打包成一个http地址,当我们要去访问这个地址时,我们通过http协议向服务器传递一个request对象,这个request对象就包含了的请求参数,以及请求方式。当模型拿到这个request,就开始模型eval,最后返回请求的结果,通常request返回的结果格式为json。

50dffca33f714fec916678ad5eb38b6e.png

其中flask request请求方式分为两种POST和GET。


1.1 GET和POST区别


最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。


  1. get是获取数据的,而post是提交数据的。
  2. GET 用于获取信息,是无副作用的,是幂等的,且可缓存, 而POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存。


2. flask request 属性


在Flask的官方文档中是这样介绍request的:对于 Web 应用,与客户端发送给服务器的数据交互至关重要。在 Flask 中由全局的 request 对象来提供这些信息。


从Flask模块导入request:from flask import request


2.1 常用方法使用


这里以一个示例来以此介绍request属性


from flask import Flask,request
app=Flask(__name__)
@app.route('/login', methods = ['GET','POST'])
def login():
    if request.method == 'POST':
        if request.form['username'] == request.form['password']:
            return 'TRUE'
        else:
#当form中的两个字段内容不一致时,返回我们所需要的测试信息
            return str(request.headers)        #需要替换的部分
    else:
        return render_template('login.html')


2.1.1 method:请求方法


return request.method        #POST
• 1


2.1.2 form:返回form的内容


return json.dumps(request.form)        
#{"username": "123", "password": "1234"}


2.1.3 args和values:args返回请求中的参数,values返回请求中的参数和form


return json.dumps(request.args)       
#url:http://192.168.1.183:5000/login?a=1&b=2、返回值:{"a": "1", "b": "2"}
print(request.args['a'])
#输出:1
return str(request.values)        
#CombinedMultiDict([ImmutableMultiDict([('a', '1'), ('b', '2')]), ImmutableMultiDict([('username', '123'), ('password', '1234')])])


2.1.4 cookies:cookies信息


return str(request.headers)        #headers信息
request.headers.get('User-Agent')        #获取User-Agent信息


2.1.5 url、path、script_root、base_url、url_root


return 'url: %s , script_root: %s , path: %s , base_url: %s , url_root : %s' % (request.url,request.script_root, request.path,request.base_url,request.url_root)
'''
url: http://192.168.1.183:5000/testrequest?a&b , 
script_root: , 
path: /testrequest , 
base_url: http://192.168.1.183:5000/testrequest , 
url_root : http://192.168.1.183:5000/
'''


2.1.6 date、files:date请求的数据,files上传的文件


@app.route('/upload',methods=['GET','POST'])
def upload():
    if request.method == 'POST':
        f = request.files['file']
        filename = secure_filename(f.filename)
        #f.save(os.path.join('app/static',filename))
        f.save('app/static/'+str(filename))
        return 'ok'
    else:
        return render_template('upload.html')
#html
<!DOCTYPE html>
<html>
    <body>
        <form action="upload" method="post" enctype="multipart/form-data">
            <input type="file" name="file" /><br />
            <input type="submit" value="Upload" />
        </form>
    </body>
</html>


其中POST与GET区别:


请求方式 request.args request.form request.values
POST ☑️ ☑️
GET ☑️ ☑️


GET请求方式

get请求的数据是放在QuerySting中的request.args封装的就是get请求的数据 类型为字典

示例:

获取name的值:


        request.args["name"]
        request.args.get("name")
        request.args.getlist("name_list")
@app.route('/form_do')
def form_do():
    uname = request.args.get('uname')
    upwd = request.args.get('upwd')
    print()
    return '用户名称:%s,用户密码:%s' % (uname,upwd)


POST请求方式

post请求的数据是放在 form中的request.form封装的就是POST请求的数据 类型为字典

示例:

获取name的值:


        request.form["name"]
        request.form.get("name")
        request.form.getlist("name_list")
@app.route('/post_do',methods=['POST'])
def post_do():
    uname=request.form.get('uname')
    upwd = request.form.get('upwd')
    uemail = request.form.get('uemail')
    trueName = request.form.get('trueName')
    return "姓名:%s,密码:%s,邮件:%s,真实姓名:%s" % (uname,upwd,uemail,trueName)


最后需要知道的是return的返回的值必须为json格式,可以使用函数如下函数进行格式转换

  • json.dumps()
  • jsonify()
  • 先将数据转化为字典,再通过以上二个函数转化


3. flask部署模型api


up主做的都是与计算机视觉有关的,所以传人的参数通常为一个图片,也就是request.files,但是request.files传入的文件参数,不能直接被深度学习模型使用需要转换。


这里实例用到模型是yolov5,通过torch在github下载获取


3.1 加载模型


model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
• 1


3.2 部署模型api


from flask import Flask,request,jsonify
app=Flask(__name__)
@app.route('/predict',methods=["GET","POST"])
def predict():
    if not request.method == "POST":
        return
    if request.files.get("image"):
        image_file = request.files["image"]
        print(image_file)
        image_bytes = image_file.read()
        img = Image.open(io.BytesIO(image_bytes))
        results=model(img)
        return jsonify(results)


3.3 运行api接口


app.run(host="127.0.0.1",port=5005)
• 1


3.4 模拟客户端请求request模型


curl -X POST -F image=@1.jpg http://127.0.0.1:5005/predict


详细的curl命令可以参考下面这个链接

http://www.ruanyifeng.com/blog/2019/09/curl-reference.html

相关文章
|
2月前
|
消息中间件 运维 Serverless
函数计算产品使用问题之如何部署Stable Diffusion Serverless API
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5天前
|
敏捷开发 人工智能 API
如何快速部署大模型接口管理和分发系统:One-API
One API 是一个开源的接口管理与分发系统,支持多种大模型平台如 OpenAI、Google PaLM 2、百度文心一言等。通过统一接口访问不同大模型服务,简化工作流程并提高效率。适用于多模型集成项目、开发代理服务、教育研究及快速原型制作等多种场景。阿里云计算巢提供了快速部署方案,简化了部署过程。
|
20天前
|
JSON API 数据库
使用Python和Flask构建简单的RESTful API
使用Python和Flask构建简单的RESTful API
29 6
|
28天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
58 2
|
2月前
|
机器学习/深度学习 边缘计算 PyTorch
PyTorch 与边缘计算:将深度学习模型部署到嵌入式设备
【8月更文第29天】随着物联网技术的发展,越来越多的数据处理任务开始在边缘设备上执行,以减少网络延迟、降低带宽成本并提高隐私保护水平。PyTorch 是一个广泛使用的深度学习框架,它不仅支持高效的模型训练,还提供了多种工具帮助开发者将模型部署到边缘设备。本文将探讨如何将PyTorch模型高效地部署到嵌入式设备上,并通过一个具体的示例来展示整个流程。
166 1
|
2月前
|
缓存 API 数据库
打造高性能后端API:从设计到部署的实战之旅
【8月更文挑战第31天】在数字化时代的浪潮中,后端API成为了连接用户、数据与服务的桥梁。本文将带领读者踏上一段从API设计、开发到部署的旅程,通过实际案例分析,揭示如何构建一个高性能的后端系统。我们将探讨现代后端架构的关键要素,包括RESTful API设计原则、数据库优化技巧、缓存策略、以及容器化部署的实践。文章旨在为开发者提供一套实用的方法论,帮助他们在面对复杂业务需求时,能够设计出既高效又可扩展的后端服务。
|
2月前
|
运维 Serverless API
Serverless痛点解决问题之编写并部署一个弹性高可用的 Web API如何解决
Serverless痛点解决问题之编写并部署一个弹性高可用的 Web API如何解决
45 0
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
什么是深度学习模型?如何部署它?
【8月更文挑战第23天】
76 0
|
2月前
|
机器学习/深度学习 存储 物联网
深度学习模型的优化与部署
【8月更文第18天】随着深度学习技术的发展,模型规模变得越来越大,这对计算资源的要求也越来越高。为了能够在资源有限的边缘设备(如智能手机、物联网设备)上运行复杂的深度学习模型,我们需要采用一系列优化方法来减少模型大小和计算复杂度。本文将介绍几种常用的模型优化技术,并讨论如何在边缘设备或云端服务器上部署这些优化后的模型。
56 0
|
5月前
|
Ubuntu Docker Python
部署你的flask应用到docker
部署你的flask应用到docker
148 0
下一篇
无影云桌面