9.4 FastAPI Deployment
FastAPI 可以把訓練好的模型包裝成 HTTP API,讓前端、批次系統或其他服務用 request 呼叫模型推論。本篇提供一個完整的小型專案,包含模型訓練腳本、FastAPI app、單筆推論、批次推論與基本測試。
1. 學習目標
Notebook 適合訓練與實驗,但不適合直接當正式服務。若要讓其他系統使用模型,常見做法是建立推論 API:
本篇專案使用合成三類表格分類資料,讓讀者可以專注在 API 結構,不需要先處理複雜資料來源。
2. 專案結構
範例專案位於:
主要檔案包含:
| 檔案 | 用途 |
|---|---|
train_model.py |
訓練模型並輸出 .keras、scaler 與 metadata |
app.py |
FastAPI 推論服務 |
test_app.py |
驗證 API 推論邏輯 |
requirements.txt |
API 專案所需套件 |
README.md |
執行步驟與 curl 範例 |
3. API 端點
範例服務提供三個端點:
| Method | Path | 功能 |
|---|---|---|
GET |
/health |
檢查服務與模型是否可用 |
POST |
/predict |
單筆推論 |
POST |
/predict-batch |
多筆批次推論 |
單筆推論 request 範例:
response 會包含預測類別、類別名稱與每個類別的機率。
4. 為什麼要保存 Scaler 與 Metadata?
如果模型訓練時使用 StandardScaler,API 推論時也必須使用同一組 mean 與 scale。否則輸入資料尺度不同,模型結果會失真。
因此本專案會保存:
model.keras:Keras 模型。scaler.joblib:訓練集 fit 出來的標準化器。metadata.json:class names、feature count、模型版本。
5. 啟動服務
在專案資料夾中先訓練模型:
再啟動 API:
啟動後可打開:
FastAPI 會自動產生互動式 API 文件。
6. 如何套用到自己的模型?
替換成自己的模型時,建議保留這個專案分層:
- 訓練腳本負責產出模型與前處理物件。
- API 啟動時載入模型,不要每次 request 都重新載入。
- 使用 Pydantic schema 驗證輸入格式。
- 回傳可讀的 class name、機率與模型版本。
- 用基本測試或整合測試確認
/predict結果穩定。
正式部署時還需要處理 logging、錯誤追蹤、模型版本切換、驗證授權與容器化部署。
7. 小結
FastAPI 是把模型變成服務的實用入口。模型部署不只是 model.predict(),還包含輸入驗證、前處理一致性、版本資訊、錯誤處理與測試。先把這些流程整理成小型專案,後續才容易擴充成正式服務。