我們通常會建立一個服務來讓模型上線,但在上線前,有一些基本的網路知識需要先了解。因此前面會先淺談網路,後面會介紹 FastAPI 來部署模型。
是一種在網頁伺服器及網頁瀏覽器,負責處理網頁資料的通訊協定。一般來說傳輸資料的兩端會分為客戶端(Client) 跟伺服器端(Server)
我們在瀏覽器上輸入網址(發出請求),而瀏覽器透過 http 通訊協定幫我們傳送給伺服器。伺服器收到請求後回傳資源。這時候從伺服器端回應的狀態可以區分成以下類別:
分類 | 代碼 | 白話文 |
---|---|---|
資訊回應 | 100–199 | 再等等 |
成功回應 | 200–299 | 成功啦 |
重新導向 | 300–399 | 去其他地方 |
用戶端錯誤 | 400–499 | 你挫賽了,你給的東西有問題(客戶端) |
伺服器端錯誤 | 500–599 | 我挫賽了,我的伺服器有問題(伺服器端) |
發送的 Request 根據不同的用途,有查詢、新增、修改或者是刪除,稱為「 Request Method 」,是為了讓 Server 能夠清楚辨別請求的目的。以下介紹最常使用的方法:
名稱 | 功能 | 案例 |
---|---|---|
GET | 單純的跟 server 要一個連結或圖片,通常網頁都是 Get 的 request 比較多 | 例如要去某個網址、看某張圖片 |
POST | 需要執行一些動作時,會傳送 Post 的 request | 例如登入會員 |
PUT | 更新內容 | |
DELETE | 刪除資源 |
應用程式介面(Application Programming Interface, API),相信大家可能多多少少有聽過這個單詞,它是串連應用程式之間的橋樑。怎麼說呢?好比說你到一間餐廳,你像服務生點餐,服務生會將菜單給廚師,烹飪好的料理再由服務生送到你的餐桌前,而這裡有幾個角色扮演。你是客戶(客戶端)、廚師是系統(伺服器),而中間溝通的橋樑則由服務生(API)來進行傳送。
了解完簡單的網路知識後,我們來把模型推上線吧!
FastAPI 是近期受到矚目的網頁框架,是一款專用於建構 API 、高性能的 web 框架。與之相同建立 web 框架的還有 Flask、Django,而其他兩個框架通常是專注於開發網頁,FastAPI則更聚焦在提供 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)
uvicorn main:app --reload
服務預設在 8000 port
透過 Swagger UI 介面,可以清楚了解目前服務有哪些 API,並且可以直接在網頁上進行測試!
docs
http://127.0.0.1:8000/docs
redoc
http://127.0.0.1:8000/redoc
在docs頁面,點擊 Try it out,接著就可以進行輸入feature啦!
資料型態輸入錯誤也會有提示,真是太佛心了吧!
最後看到成功畫面,回傳預測結果和機率值
程式碼實做的細節更詳細可以請參考連結