数据科学项目中的模型部署

数据科学项目中,模型构建和超参数调整完成后,下一步是将最终结果展示给公众。这样做至关重要,因为并非每个人都对查看代码感兴趣,他们更关心的是最终结果。此外,这还有助于数据科学爱好者构建端到端的项目,为他们提供竞争优势,并让他们体验其他技术。

机器学习模型的部署可以根据不同平台采取不同的途径。最常见的方法是通过Web界面提供模型,但不限于Android和iOS应用或像Raspberry Pi这样的IoT设备。如果深入研究,会发现一个在搜索查询中名列前茅的框架是Flask框架,这是一个最小化的应用程序,可以快速设置Web服务器,但它有一些问题,这些问题在最近发布的一个名为FastAPI的新框架中得到了解决,这个框架最近越来越受欢迎。

在本文中,将看到FastAPI框架如何优于Flask,并提供一个示例代码以便更好地理解。在此之前,如果对Android应用部署感兴趣,可以阅读文章《在Android应用中部署ML》。

Flask框架

Flask是一个基于Python的框架,允许用较少的代码连接网站。可以用它创建一个小型网站,因为它允许在每一步进行定制。作为一个最小化的包,它只捆绑了核心组件,所有其他扩展都需要显式设置。许多开发人员使用Flask托管他们的API。

API(应用程序接口)是一个允许多个中介之间通信的接口,这意味着一个人可以使用任何技术访问任何类型的数据。例如,可以使用JavaScript访问一个由Python构建的API。下面是一个简单的Flask程序示例:

from flask import Flask, jsonify app = Flask(__name__) @app.route("/<name>", methods=['GET']) def home(name): return jsonify({"message": f"Hello! {name}"}) if __name__ == "__main__": app.run(debug=True)

当访问URL localhost/AnyNameHere时,会显示一个JSON结果,类似于这样:(使用了一个名为JSON viewer的Chrome扩展。可能会被提示以纯文本而不是这种格式化输出显示)

FastAPI框架

FastAPI是一个现代框架,允许无缝构建API而无需太多努力。它有能力将服务器代码与业务逻辑分开,提高代码可维护性。正如它的名字中包含“fast”,它比Flask快得多,因为它是建立在ASGI(异步服务器网关接口)而不是WSGI(Web服务器网关接口)之上的。它有一个数据验证系统,可以在运行时检测任何无效的数据类型,并将错误输入的原因以JSON格式返回给用户,这使得开发人员无需显式管理这个异常。

当在开发API时,它会即时生成文档,这是所有开发人员最需要的东西。文档是其他开发人员协作项目的好方法,因为它向他们展示了所有可以完成的事情以及必要的说明。它还生成了一个漂亮的GUI,解决了Flask中缺少的所有问题。

它通过OpenAI规范和Swagger实现这些规范。作为一个开发人员,只需要关注逻辑构建部分,其他事情都由FastAPI管理。让看看使用Flask创建的相同示例,现在用FastAPI实现:

import uvicorn from fastapi import FastAPI app = FastAPI() @app.get("/") def home(name: str): return {"message": f"Hello! {name}"} if __name__ == "__main__": uvicorn.run(app, host='127.0.0.1', port=8000, debug=True)

当访问URL localhost/?name=AnyNameHere时,会得到这样的输出:

可以看到代码与Flask非常相似,但这里使用的是uvicorn服务器,它是ASGI的实现。此外,没有路由任何端点,而是直接使用装饰器创建它们,这更有意义。这里的函数简单地接受进一步所需的参数,消除了调用请求对象的需要。

现在来到了有趣的部分。要访问自动生成的文档,请访问端点/docs,将看到Swagger UI,它允许测试API端点,并且可以作为用户测试端点的示例:

FastAPI还捆绑了另一个文档生成器,即ReDoc,它也生成了所有端点列出的美丽文档。可以通过访问端点/redoc来访问它:

要设置数据验证,可以简单地创建一个从Pydantic的base-model继承的数据类型类。它是一个提供使用Python类型注释的数据验证的库。可以添加实体的描述,并提供自定义示例以在文档中显示。

ML FastAPI示例

想分享一个使用FastAPI部署ML决策树分类器模型的示例。这个问题的陈述是一个音乐流派分类器,根据音乐的技术方面,如节奏、活力,音乐要么是摇滚要么是嘻哈。制作了一个音乐类来验证传递给模型的数据,如下所示:

from pydantic import BaseModel class Music(BaseModel): acousticness: float danceability: float energy: float instrumentalness: float liveness: float speechiness: float tempo: float valence: float

这是结果API:

如果想查看整个代码,请前往这个GitHub仓库。

性能比较:FastAPI vs. Flask

1. 速度:FastAPI通常比Flask快。这是因为它使用异步代码,允许它同时处理请求。另一方面,Flask是一个传统的同步框架。速度差异可能相当显著,特别是对于有许多并发请求的应用程序。然而,Flask有时可以更快,特别是当使用Greenlet驱动的WSGI服务器时。

2. 类型注释:FastAPI利用类型注释来提高性能和提供更好的类型安全性。这意味着框架可以自动推断使用的数据类型,这可以优化代码执行。Flask默认不使用类型注释。

3. 异步与同步:FastAPI是建立在异步基础之上的,可以同时处理多个请求。这使得它非常适合构建API和微服务。Flask主要是一个同步框架,这意味着它一次只能处理一个请求。然而,可以通过使用asyncio等扩展使Flask变得异步。

4. 基准测试:基准测试表明,FastAPI在许多情况下可以比Flask快得多。然而,具体性能差异将取决于应用程序的类型、使用的Web服务器和其他因素。

经过所有这些讨论,问题仍然没有答案,谁赢了?根据所有因素,建议采用FastAPI而不是Flask。它非常容易设置,将旧的Flask项目迁移到这个不会花费太多时间,异步、WebSocket和自动文档生成功能是锦上添花。

可以选择Flask框架来设置整个Web界面(前端和后端),但就ML而言,主要目标是检查模型是否在生产环境中工作,创建API更有意义,因为其他事情可以由其他开发团队管理,并且要清楚地向他们解释开发的程序的使用方法,FastAPI自动文档是一个很好的解决方案。

Q1. Flask或FastAPI对ML更好吗?这取决于需求。Flask是成熟的,而FastAPI在性能和自动数据验证方面表现出色,非常适合ML应用。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485