[英]Python FastAPI backend get request path operation function access data saved outside of the function
[英]FastAPI/Unvicorn request hanging during invocation of call_next (path operation function) in middleware
我們在 EC2 上運行的 docker 容器內有一個機器學習 model。
我們使用 Cortex.dev 來自動縮放 GPU。
不確定地,請求將在 FastAPI 中間件中的call_next
function 期間掛起。 不幸的是,它不可重現。
Middleware pre-request
打印行被記錄,但路徑操作 function 中的第一個打印語句從未被記錄。
我們嘗試過的事情:
run
functionbytes
作為image
的參數類型而不是UploadFile
運行這些更改都不能解決懸而未決的問題,但這是性能最高的配置。
這是否意味着問題出在 FastAPI 而不是 Uvicorn?
如果是,什么可能導致 FastAPI 掛起? 如果不是,問題出在哪里,如何解決?
Dockerfile
FROM nvidia/cuda:11.4.0-runtime-ubuntu18.04
WORKDIR /usr/src/app
RUN apt-get -y update && \
apt-get install -y --fix-missing \
build-essential \
cmake \
python3 \
python3-pip \
ffmpeg \
libsm6 \
libxext6 \
&& apt-get clean && rm -rf /tmp/* /var/tmp/*
ADD ./requirements.txt ./
# install our dependencies
RUN python3 -m pip install --upgrade pip && python3 -m pip install -r requirements.txt && apt-get clean && rm -rf /tmp/* /var/tmp/*
ADD ./ ./
ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8
EXPOSE 8080
CMD uvicorn api:app --host 0.0.0.0 --port 8080 --workers 2
api.py
from my_predictor import PythonPredictor
from typing import Optional
from datetime import datetime
import time
from starlette.responses import Response
from fastapi import FastAPI, File, UploadFile, Form, Response, HTTPException, Request
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = ["*"]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
cortex_id = request.headers.get('x-request-id')
start_time = time.time()
print("Cortex ID: " + cortex_id + ". > Middleware pre-request. Time stamp: " + str(start_time), flush=True)
response = await call_next(request)
process_time = time.time() - start_time
print("Cortex ID: " + cortex_id + ". > Middleware post-response. Duration: " + str(process_time), flush=True)
return response
@app.post("/")
async def run(request: Request, image: UploadFile = File(...), renderFactor:Optional[int] = Form(12), requestId:Optional[str] = Form('-1'),include_header:Optional[str] = Form('bin')):
try:
cortexId = request.headers.get('x-request-id')
print("Cortex ID: " + cortexId + ". Request ID: " + requestId + " >>> Request received. Time stamp: " + str(datetime.now()))
start = time.time()
image = await image.read()
payload = {}
payload['image'] = image
payload['renderFactor'] = renderFactor
payload['requestId'] = requestId
payload['include_header'] = include_header
response = pred.predict(payload)
end = time.time()
totalTime = round(end - start, 2)
print("Cortex ID: " + cortexId + ". Request ID: " + requestId + " > Request processed. Duration: " + str(totalTime) + " seconds. Time stamp: " + str(datetime.now()))
if totalTime > 5:
print("Long request detected. Duration: " + str(totalTime))
return response
except Exception as error:
end = time.time()
print(str(error))
print("Cortex ID: " + cortexId + ". Request ID: " + requestId + " > Error. Duration: " + str(round(end - start, 2)) + " seconds . Time stamp: " + str(datetime.now()))
raise HTTPException(status_code = 500, detail = str(error))
config = {}
pred = PythonPredictor(config)
FastAPI 文檔說明從fastapi
package 導入的Request
最好來自Starlette
( Starlette 請求文檔鏈接)
您也可以使用
from starlette.requests import Request
。 FastAPI為您(開發人員)提供了便利。 但它直接來自Starlette 。
將from fastapi import Request
替換為from starlette.requests import Request
此鏈接中的官方 FASTAPI github 問題中存在類似問題,該應用程序使用uvicorn <file>:app
運行。
下面使用starlette.requests
直接實現的代碼塊沒有產生掛起問題,表明該問題是由於FASTAPI 造成的。
from starlette.applications import Starlette
from starlette.requests import Request
from starlette.responses import JSONResponse
app = Starlette()
@app.middleware("http")
async def func(request: Request, call_next):
#print(await request.json())
return await call_next(request)
@app.route('/', methods=["POST"])
def homepage(request):
return JSONResponse({"Hello": "World"})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.