iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
自我挑戰組

Python資料分析學習地圖系列 第 29

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 程式碼

程式碼實做的細節更詳細可以請參考連結


上一篇
Day 28 : Git
下一篇
Day 30: 完賽總結
系列文
Python資料分析學習地圖30

尚未有邦友留言

立即登入留言