當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢?
首先我們來看看官方的文件:
📄 https://www.starlette.io/applications/#storing-state-on-the-app-instance
其中有提到, 我們可以透過「state」來儲存額外的狀態資料, 大致上這樣儲存…
app = FastAPI(...)
app.state.$共享的資料
再來我們可以設計一個函數專門來取狀態內容, 此時的函數命名就可以更直白一點, 未來閱讀實惠更加容易的閱讀。
def get_api_shared_params(connection: HTTPConnection) -> APISharedParams:
"""取得API共享參數
我們的VAD模型或者GPU模型通常需要共用, 而在FastAPI中我們透過 [State狀態](<https://www.vidavolta.io/sharing-memory/>) 來保存與取用,
那麼這邊的函式主要是取得共用參數的部份, 但我們還需要初始化設定參數, 如下:
# Step 1: 設定初始化參數
請使用 [lifespan](<https://fastapi.tiangolo.com/advanced/events/>) 於初始化時進行設定, 實際案例請參考 [main.py](./main.py)
```python
@asynccontextmanager
async def lifespan(app: FastAPI):
api_shared_params ...
app.state.api_shared_params = api_shared_params
```
# Step 2: 各路由注入並取得共用參數
```python
async def xxx(websocket: WebSocket, api_shared_params: APISharedParams = Depends(get_api_shared_params)):
...
```
"""
return connection.app.state.api_shared_params
最後透過依賴注入設置於路由函數之中。
async def xxx(websocket: WebSocket, api_shared_params: APISharedParams = Depends(get_api_shared_params)):
我們可以藉由 lifespan 來管理整個app的生命週期, 詳細請參考「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期」。
FastAPI真的是一個非常強大的API框架, 基本上我們需要的功能大部分都已經相當完善了, 我們只要照著標準的教學文件即可輕鬆上手, 接下來我們也會陸續的分享關於FastAPI的一些技巧與經驗, 歡迎持續關注我們的頻道, 也非常感謝大家的支持。