暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

超高效,用FastAPI为机器学习系统提供数据(上)

410

FastAPI:服务于机器学习数据产品的API框架

长按关注《Python学研大本营》,加入读者群,分享更多精彩

如今,大多数机器学习模型都作为服务在生产中提供。此方法通过应用程序编程接口 (API) 将客户端应用程序与机器学习模型分离。

在本文中,我将向您介绍 API 概念、FastAPI 游戏规则改变者功能,并使用 FastAPI 为我们的机器学习数据产品提供服务。

什么是 API?

应用程序编程接口( API ) 是两个或多个应用程序相互通信的软件接口。

了解什么是 API 的最简单方法是想想你自己在一家餐馆。您进入餐厅,找到您的餐桌,然后收到一份菜单。菜单上有食物的名称、描述和费用。您选择组合并下订单。但是您的要求将如何传递给厨师?厨师不能来用餐区,你也不能去厨房。您需要有人收到您的请求并将其送到厨房,然后在饭菜准备好后将其带到您的餐桌上。是的,您需要服务员!

同样的类比也适用于应用程序。为了使应用程序相互交谈或获取他们的请求并发布他们的输出,API 充当中间人。

API 示例

谷歌地图:谷歌地图在应用程序中提供各种 API。当你搜索一个城市、地区或社区时,它会显示天气、空气质量,甚至在 covid 期间会显示最新的感染结果。以同样的方式,当你搜索一个吃饭的地方时,谷歌地图会向你显示餐馆、咖啡馆、他们的菜单、营业时间,甚至可以通过第三方应用程序在线预订选项。

旅行应用程序:Booking.com、Trivago、Expedia 等如今为您提供端到端的旅行体验。当您查看他们的应用程序时,您可以预订酒店、购买机票、租车或预订品酒活动。这些项目均不由这些公司直接拥有和管理。他们收到您的请求并连接到提供此信息的其他应用程序。

Fast API

FastAPI是一个用于在 Python 中开发 RESTful API 的 Web 框架。FastAPI 的用户群每天都在增长。不仅是软件工程师,数据科学家、机器学习工程师、数据工程师也开始使用 FastAPI。这场革命性的运动推动了所有数据人员在短时间内从 Flask 和 Django 迁移到 FastAPI。

FastAPI 的 GAME Changer 功能

同步与异步请求

在进入技术定义之前,让我们回到我们的餐厅示例。

您将订单交给服务员,他告诉您厨房里只有一位厨师,他已经有 5 个请求在排队!您开始等待订单送达。道歉 30 分钟后,您的餐点到了。你知道一个人的速度有多快,不能同时处理10张桌子。这是一个同步请求。

下次您想尝试另一家餐厅。在下订单之前,您问服务员他们有多少厨师。服务员嘲笑你并告诉你:“我们厨房里有 5 名厨师,他们正等着为您服务,先生。我们不是业余爱好者!” 您下订单,10 分钟后您会收到您的请求。您环顾四周,发现其他桌子也在提供服务。这是一个异步请求。

同步 API 调用是一种设计模式,其中调用站点在等待被调用代码完成时被阻塞。使用异步 API 调用时,调用站点不会在等待被调用代码完成时被阻塞,而是在响应到达时通知调用线程。

在较重的负载条件下,提交多个异步调用并定期检查状态比等待每个调用完成再提交下一个调用更有效。

from fastapi import FastAPI

app = FastAPI()

async def get_restaurant_working_hours():
    # some operations
    pass


@app.get("/")
async def get_resturant_reservation_details():
    results = await restaurant_working_hours() # waits for the defined function
    # some operations 
    
    return results

参数验证

FastAPI 支持字符串和数字参数验证。

字符串验证示例

在下面的示例中,我添加了一个最小 5 个字符和最大 100 个字符长度的字符串约束。当我通过 Postman 调用此端点并传递大小为 3 的文本时,它会抛出如下异常。

from typing import Optional
from fastapi import FastAPI, Query
import uvicorn

app = FastAPI()

@app.get("/orders/")
async def read_orders(query: Optional[str] = Query(None, min_length=5, max_length=100)): #defining the constraints
    results = {"order": [{"order_id""Order_1"}, {"order_id""Order_2"}]}
    return results
    if query:
        results.update({"query": query})

if __name__ == "__main__":
    uvicorn.run("parameter-validations:app")

数字验证示例

在下面的示例中,我添加了一个最小值为 1,最大值为 100 的数字约束。当我通过 Postman 调用此端点并传递 0 时,它会抛出如下异常。

from typing import Optional
from fastapi import FastAPI, Query
import uvicorn
app = FastAPI()

@app.get("/orders/")
async def read_items(order_count: int = Query(gt=1, lt=100)): # defining the constraints
    results = {"order_count": order_count}
    return results

if __name__ == "__main__":
    uvicorn.run("parameter-validations:app")

与 Pydantic 集成

Pydantic是一个用于执行数据序列化和验证的 Python 库。

FastAPI 与Pydantic集成。这确保在运行时通过 IDE 解析、评估并通知用户有关类型相关的错误。

您可以在下面找到示例错误消息;

fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that False is a valid Pydantic field type. If you are using a return type annotation that is not a valid Pydantic field (e.g. Union[Response, dict, None]) you can disable generating the response model from the type annotation with the path operation decorator parameter response_model=None. Read more: https://fastapi.tiangolo.com/tutorial/response-model/

推荐书单

《图解数据智能》

《图解数据智能》是一本为数字资源的对接方、分配方以及广大的入门学习者提供相关数据智能概念的科普读物。书中各个概念之间相对独立,读者可以将其作为一本检索用的工具书籍,也可以根据自己的兴趣灵活查阅相关篇章。

无论你是数智化领域的专业从业人员,还是刚刚毕业想要进入该领域的技术小白,抑或是正面临着数字化转型的政府或企业人员,或者是千千万万个生活在这个数智化社会中的普通人,都可以阅读此书,你将从酣畅淋漓的技术释疑和轻松有趣的漫画解读中,找到自己的答案。

购买链接:https://u.jd.com/tuSDBzx

精彩回顾

《Pandas1.x实例精解》新书抢先看!

【第1篇】利用Pandas操作DataFrame的列与行

【第2篇】Pandas如何对DataFrame排序和统计

【第3篇】Pandas如何使用DataFrame方法链

【第4篇】Pandas如何比较缺失值以及转置方向?

【第5篇】DataFrame如何玩转多样性数据

【第6篇】如何进行探索性数据分析?

【第7篇】使用Pandas处理分类数据

【第8篇】使用Pandas处理连续数据

【第9篇】使用Pandas比较连续值和连续列

【第10篇】如何比较分类值以及使用Pandas分析库

长按关注《Python学研大本营》
长按二维码,加入Python读者群


文章转载自Python学研大本营,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论