楼主: 时光永痕
1115 0

[数据挖掘新闻] 与PyTorch模型一起使用– Flask [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)三级

48%

威望
0
论坛币
26 个
通用积分
49.7576
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
316 小时
注册时间
2020-7-21
最后登录
2024-4-24

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
与PyTorch模型一起使用– Flask
PyTorch以其干净的框架而闻名,因此要获得研究所需的生产能力和灵活性是一项艰巨的任务。我认为,将生产支持推向核心的主要障碍是摆脱Python的境界,并将PyTorch模型转移到具有多线程功能的更快的线程安全语言中。但是随后,这违反了PyTorch当时所遵循的Python优先原则。
在Python本身中提供PyTorch模型是在生产环境中提供模型的最简单方法。但是在解释如何完成之前,让我们快速看一下Flask是什么。在本文中,我们将介绍Flask的最基本概念以及该框架在Python世界中的使用方式。
本文摘自Sherin Thomas和Sudhandhu Passi撰写的《PyTorch深度学习动手》一书 。本书试图为PyTorch提供一个完全实用的介绍。该PyTorch出版物包含大量示例和动态AI应用程序,并演示了PyTorch方法在机器智能和深度学习中的简单性和效率。
烧瓶简介
Flask是一个微框架,Python世界中的一些大公司已将其用于生产。即使Flask提供了可用于将UI推送到客户端的模板引擎,我们也没有使用它。相反,我们将制作一个提供API的RESTful后端。
Flask可以使用pip来安装,就像其他Python软件包一样:
点安装Flask
这将安装其他依赖项Werkzeug(应用程序和服务器之间的Python接口),Jinja(作为模板引擎),其危险(用于安全签名数据)和Click(作为CLI构建器)。
安装后,用户将可以访问CLI,并通过flask run调用我们的脚本将启动服务器:
从烧瓶进口烧瓶
app = Flask(__ name__)
@ app.route(“ /”)
def hello():
    返回“ Hello World!”
该示例包含四个组件:
第一行是我们导入Flask包的位置。
我们创建一个Flask对象,这是我们的大型Web应用程序对象,Flask服务器将使用该对象来运行我们的服务器。
有了应用程序对象后,我们需要存储有关对象应对其执行操作的URL的信息。为此,应用程序对象带有route方法,该方法接受所需的URL并返回装饰器。这是我们希望应用程序现在提供的URL。
由应用程序对象返回的装饰器对一个函数进行装饰,当URL被命中时,将触发该函数。我们将其命名为hello。函数的名称在这里并不重要。在前面的示例中,它只是检查输入并做出相应的响应。但是对于我们的模型服务器,我们使此功能稍微复杂一点,以便它可以接受输入并将该输入提供给我们建立的模型。然后,我们模型的返回值将作为HTTP响应推回给用户。
我们通过建立flask_trial目录开始实现,并将该文件另存为该目录中的app.py :
mkdir flask_trial
cd flask_trial
我们通过建立flask_trial目录开始实现,并将该文件另存为该目录中的app.py :
mkdir flask_trial
cd flask_trial
然后,我们执行Flask随附的CLI命令来启动服务器。执行后, 如果未提供自定义参数,则将看到从http://127.0.0.1:5000 提供服务的服务器。
烧瓶运行
我们可以通过向服务器位置发出HTTP请求来测试简单的Flask应用程序。如果一切正常,我们应该得到一个“你好,世界!” 来自服务器的消息。
->卷曲“ http://127.0.0.1:5000
->世界你好!
我们已经建立了简单的Flask应用程序。现在,将fizzbuzz模型引入我们的应用程序。该模型将从路由器功能中调用。这是一个基于神经网络的简单模型,我们将在这里加载经过训练的模型:
将torch.nn导入为nn
进口trch
FizBuzNet(nn.Module)类:
    “”
    2层网络,用于预测fiz或buz
    参数:input_size-> int
    参数:output_size-> int
    “”
    定义__init __(self,input_size,hidden_??size,output_size):
        超级(FizBuzNet,self).__ init __()
        self.hidden = nn.Linear(input_size,hidden_??size)
        self.out = nn.Linear(hidden_??size,output_size)
    def forward(自己,批量):
        隐藏= self.hidden(批次)
        已激活= torch.sigmoid(隐藏)
        out = self.out(已激活)
        返回
用Flask服务模型
下面的屏幕快照给出了我们应用程序的目录结构。该资产的文件夹有训练的模型,这将被用来controller.py文件,而加载模型。根目录中的app.py是Flask应用程序的入口。Flask首选app.py作为入口点文件的默认名称。
当您执行flask run时,Flask将在当前目录中查找app.py文件并执行该文件。该controller.py文件是我们加载从模型model.py文件。然后,加载的模型将等待用户通过HTTP端点输入。app.py将用户输入重定向到controller ,然后将其转换为Torch张量。
张量对象将通过神经网络传递,并且控制器将神经网络的结果传递给后处理操作后,控制器将从神经网络返回结果。
当前目录
目录中有四个组件用于制作Flask应用。该资产的文件夹是我们保持我们的模型。其他三个文件是代码所在的位置。让我们研究一下每个。我们将从入口文件app.py开始。它是前面给出的简单Flask应用程序的扩展版本。该文件教会了我们如何定义URL端点以及如何将URL端点映射到Python函数。下面的代码块显示了我们扩展的app.py文件:
导入json
从烧瓶进口烧瓶
从烧瓶进口要求
进口管制员
应用= Flask('FizBuzAPI')
@ app.route('/ predictions / fizbuz_package',Methods = ['POST'])
defdict():
    其中= request.get_json()。get('input.1')
    如果不是:
        返回“ InvalidData”
    尝试:
        数字= int(其中)+ 1
        预测= controller.run(number)
        out = json.dumps({'NextNumber':预测})
    除了ValueError:
        out = json.dumps({'NextNumber':'WooHooo !!!'})
    返回
Flask给我们提供了 request 实用程序,它是一个全局变量,但是对于存储有关当前请求信息的当前线程而言是局部的。我们使用get _json 的功能要求对象来获得身体POST从参数 要求 目的。然后,将通过HTTP传入的字符串数据转换为整数。这个整数是我们从前端传递的数字。我们应用程序的任务是预测下一个数字的状态。那是下一个数字本身还是嘶嘶声,嗡嗡声或嘶嘶声?但是我们训练我们的网络来预测我们通过的号码的状态。但是,我们需要下一个号码的状态。因此,我们将在当前得到的数字上加一个,然后将结果传递给我们的模型。
下一个导入是 controller ,我们在其中加载了模型文件。我们正在调用run方法,并将数字传递给模型。 然后,将来自控制器 的预测值作为字典传递回用户。Flask会将其转换为响应主体,并将其发送回用户。
在继续之前,我们可以从以前的简单Flask应用程序的扩展版本中看到两个主要差异。一种是URL路由: / predictions / fizbuz_package 。如前所述,Flask允许您将任何URL端点映射到您选择的功能。
其次,我们在装饰器中使用了另一个关键字参数: methods 。这样,我们告诉Flask,不仅需要通过URL规则调用此函数,而且还需要在对该URL 的POST方法调用中调用此函数。因此,我们像以前一样使用flask run运行应用程序,并使用 curl 命令对其进行测试。
-> curl -X POST http://127.0.0.1:5000/predictions/fizbuz_package \
        -H“内容类型:application / json” \
        -d'{“ input.1”:14}'
-> {“ NextNumber”:“ FizBuz”}
在HTTP POST 请求中,我们传递的JSON对象的输入数字为14,我们的服务器返回下一个数字为 FizBuz 。所有这些魔术都发生在 app.py正在调用的controller.run() 方法中 。现在,让我们看看该函数在做什么。
接下来是 带有run()方法的控制器 文件 。在这里,我们将输入数字转换为10位二进制数,并使其成为Torch张量。然后将二进制张量传递给我们模型的前向函数,以得到具有预测的1 x 4张量。
通过 从加载了保存的.pth文件的模型文件中调用FizBuz 类, 可以创建我们的模型。我们使用Torch的load_state_dict方法将参数加载到初始化的模型中。之后,我们将模型转换为eval()模式,这会将模型设置为评估模式(它将在评估模式下关闭batchnorm退出层)。该模型的输出是我们运行max并找出哪个索引具有最大值,然后将其转换为可读输出的概率分布。
生产就绪的服务器
这是关于如何使用Flask将PyTorch模型部署到服务器的非常基本的演练。但是Flask的内置服务器尚未投入生产,只能用于开发目的。开发完成后,我们应该使用其他服务器软件包在生产中为Flask应用程序提供服务。
Gunicorn是Python开发人员使用的最受欢迎的服务器软件包之一,将其与Flask应用程序绑定非常容易。您可以使用pip安装Gunicorn,就像我们安装Flask一样:
点安装炮弹
Gunicorn需要我们传递模块名称,以便它能够拾取模块并运行服务器。但是Gunicorn希望应用程序对象具有名称application ,而我们的项目则不是这样。因此,我们需要显式传递应用程序对象名称和模块名称。Gunicorn的命令行工具有很多选项,但是我们正在尝试使其尽可能简单:
古尼康app:app
进口火炬
从模型导入FizBuzNet
input_size = 10
output_size = 4
hidden_??size = 100
def binary_encoder():
    def wrapper(num):
        ret = [对于'{0:b}'中的i,为int(i)。format(num)]
        返回[0] *(input_size-len(ret))+ ret
    返回包装
净= FizBuzNet(input_size,hidden_??size,output_size)
net.load_state_dict(torch.load('assets / fizbuz_model.pth'))
net.eval()
编码器= binary_encoder()
def运行(编号):
    使用torch.no_grad():
        二进制= Torch.Tensor([编码器(数字)])
        out = net(binary)[0] .max(0)[1] .item()
    返回get_read_output(number,out)
在本文中,我们采用了最简单的方法,即使用Flask,Python Web框架将PyTorch投入生产。诸如Flask之类的设置就足够了,特别是如果您要设置示例Web应用程序或满足您个人需求或类似用例的内容。
关于作者
Sherin Thomas 从信息安全专家开始他的职业生涯,并将其重点转移到基于深度学习的安全系统上。他已经帮助全球多家公司建立了AI渠道,并最近为CoWrks工作,CoWrks是一家来自班加罗尔的快速成长的新兴公司。Sherin正在从事多个开源项目,包括PyTorch,RedisAI等,并且正在领导TuringNetwork.ai的开发。
Sudhanshu Passi 是CoWrks的技术人员。除其他外,他一直是CoWrks与机器学习相关的一切背后的推动力。他在简化复杂概念方面的专业知识使他的作品成为初学者和专家的理想读物。这可以通过他的许多博客和这本首次出版的书来证明。在业余时间,他可以在当地的游泳池里找到水下梯度下降的人。

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Flask Ask Fla RCH Predictions

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 14:39