Day 29 : FastAPI 让模型上线

我们通常会建立一个服务来让模型上线,但在上线前,有一些基本的网路知识需要先了解。因此前面会先浅谈网路,後面会介绍 FastAPI 来部署模型。

浅谈网路

超文本传输协定(HyperText Transfer Protocol,缩写:HTTP)

是一种在网页服务器及网页浏览器,负责处理网页资料的通讯协定。一般来说传输资料的两端会分为客户端(Client) 跟服务器端(Server)

  • 客户端(Client):以网页来说就是你的浏览器、电脑,主要会发送请求(request)到服务器端
  • 服务器端(Server):收到请求开始处理资料,完成後会回传回应(response)到客户端

状态码

我们在浏览器上输入网址(发出请求),而浏览器透过 http 通讯协定帮我们传送给服务器。服务器收到请求後回传资源。这时候从服务器端回应的状态可以区分成以下类别:

分类 代码 白话文
资讯回应 100–199 再等等
成功回应 200–299 成功啦
重新导向 300–399 去其他地方
用户端错误 400–499 你挫赛了,你给的东西有问题(客户端)
服务器端错误 500–599 我挫赛了,我的服务器有问题(服务器端)

HTTP Request 的方法

发送的 Request 根据不同的用途,有查询、新增、修改或者是删除,称为「 Request Method 」,是为了让 Server 能够清楚辨别请求的目的。以下介绍最常使用的方法:

名称 功能 案例
GET 单纯的跟 server 要一个连结或图片,通常网页都是 Get 的 request 比较多 例如要去某个网址、看某张图片
POST 需要执行一些动作时,会传送 Post 的 request 例如登入会员
PUT 更新内容
DELETE 删除资源

认识 API

应用程序介面(Application Programming Interface, API),相信大家可能多多少少有听过这个单词,它是串连应用程序之间的桥梁。怎麽说呢?好比说你到一间餐厅,你像服务生点餐,服务生会将菜单给厨师,烹饪好的料理再由服务生送到你的餐桌前,而这里有几个角色扮演。你是客户(客户端)、厨师是系统(服务器),而中间沟通的桥梁则由服务生(API)来进行传送。

架设服务

了解完简单的网路知识後,我们来把模型推上线吧!

FastAPI

FastAPI 是近期受到瞩目的网页框架,是一款专用於建构 API 、高性能的 web 框架。与之相同建立 web 框架的还有 Flask、Django,而其他两个框架通常是专注於开发网页,FastAPI则更聚焦在提供 API 的服务,因此我特别选这个框架来说明和示范。

特色

  • 很快:如名字一样,执行速度很快
  • 使用 python 3.6+ 并基於 pydantic 的类型提示
  • 有漂亮 Swagger UI 介面,提供 API 文档

模型储存与载入

在架设服务之前,我们先对训练的模型进行存挡

# Save
import pickle
with open('./lightgbm_books.pickle', 'wb') as f:
    pickle.dump(classifier, f)
# Read
age = 30
salary = 156922
vip_ind = 1
with open('./lightgbm_books.pickle', 'rb') as f:
    classifier = pickle.load(f)
    pred = classifier.predict(np.array([[ age, salary, vip_ind,]]))[0]
    pred_prob = classifier.predict_proba(np.array([[ age, salary, vip_ind,]]))[0][1]
print(pred, pred_prob)
>>> 1 0.9597337150135251

开启服务吧!

安装

pip install fastapi
pip install uvicorn

撰写路由

我将输入定义成 age、salary、VIP,最後透过 classifier_predict 取得回传值

@app.post("/predict")
def predict(age: int, salary: int, VIP: bool=True):
    vip_ind =  1 if VIP else 0
    return classifier_predict(age, salary, vip_ind)

执行 Fastapi

uvicorn main:app --reload

服务预设在 8000 port

看看美丽的 Swagger UI

透过 Swagger UI 介面,可以清楚了解目前服务有哪些 API,并且可以直接在网页上进行测试!

  • docs

    http://127.0.0.1:8000/docs
    

  • redoc

    http://127.0.0.1:8000/redoc
    

测试打 API

在docs页面,点击 Try it out,接着就可以进行输入feature啦!

资料型态输入错误也会有提示,真是太佛心了吧!

最後看到成功画面,回传预测结果和机率值

github 程序码

程序码实做的细节更详细可以请参考连结


<<:  Progressive Web App 取得 Geolocation API 地理资讯 (28)

>>:  Day 29【Deploy NFT - Deploy on Mainnet】你看,出来了

Annotation 处理时机

处理 Annotation 的时机 一般来说,annotation 可以在 compile time...

Day 01. 回想监控的起源

Hi 大家,   开赛第一天想先跟大家分享踏上监控旅程的起源。      如简介提到的 行云者研发基...

拥抱「资料结构」的「演算法」(28) - 深度优先与广度优先搜寻法

前言 图形也有搜寻演算法可以使用,例如深度优先搜寻法与广度深度优先搜寻法,一起来看看吧 生活常识 你...

2.4.1 Design System - Avatar元件

年龄这件无关紧要的小事 从小我就很讨厌任何因为年纪而设下的规范 尊重长辈绝对是因为他做人处事很值得...

活动分享|高品质数据用Tableau活起来!

2021年很快已经倒数2个月了 这一年变动很大很快 不管是你所属的企业还是我任职的企业,很明显的,在...