跳轉到

9.4 FastAPI Deployment

專案範例:9_4_fastapi_deployment

FastAPI 可以把訓練好的模型包裝成 HTTP API,讓前端、批次系統或其他服務用 request 呼叫模型推論。本篇提供一個完整的小型專案,包含模型訓練腳本、FastAPI app、單筆推論、批次推論與基本測試。

1. 學習目標

Notebook 適合訓練與實驗,但不適合直接當正式服務。若要讓其他系統使用模型,常見做法是建立推論 API:

訓練模型 -> 儲存模型與前處理資訊 -> 啟動 FastAPI -> 接收 JSON -> 回傳預測結果

本篇專案使用合成三類表格分類資料,讓讀者可以專注在 API 結構,不需要先處理複雜資料來源。

2. 專案結構

範例專案位於:

code/tensorflow/cookbook/9_deployment/9_4_fastapi_deployment/

主要檔案包含:

檔案 用途
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 範例:

{
  "features": [0.2, -1.1, 0.5, 1.0, 0.3, -0.7, 0.8, 1.2]
}

response 會包含預測類別、類別名稱與每個類別的機率。

4. 為什麼要保存 Scaler 與 Metadata?

如果模型訓練時使用 StandardScaler,API 推論時也必須使用同一組 mean 與 scale。否則輸入資料尺度不同,模型結果會失真。

因此本專案會保存:

  1. model.keras:Keras 模型。
  2. scaler.joblib:訓練集 fit 出來的標準化器。
  3. metadata.json:class names、feature count、模型版本。

5. 啟動服務

在專案資料夾中先訓練模型:

python train_model.py

再啟動 API:

uvicorn app:app --reload

啟動後可打開:

http://127.0.0.1:8000/docs

FastAPI 會自動產生互動式 API 文件。

6. 如何套用到自己的模型?

替換成自己的模型時,建議保留這個專案分層:

  1. 訓練腳本負責產出模型與前處理物件。
  2. API 啟動時載入模型,不要每次 request 都重新載入。
  3. 使用 Pydantic schema 驗證輸入格式。
  4. 回傳可讀的 class name、機率與模型版本。
  5. 用基本測試或整合測試確認 /predict 結果穩定。

正式部署時還需要處理 logging、錯誤追蹤、模型版本切換、驗證授權與容器化部署。

7. 小結

FastAPI 是把模型變成服務的實用入口。模型部署不只是 model.predict(),還包含輸入驗證、前處理一致性、版本資訊、錯誤處理與測試。先把這些流程整理成小型專案,後續才容易擴充成正式服務。