Deploy-ul unui model FastAI cu FastAPI

  • 1 minute de citit
  • 5 exemple de cod în Python, Shell și JSON

Disponibil și în English

Pe această pagină

Salut tuturor 👋,

În acest articol scurt îți arăt cum să faci deploy unui model FastAI folosind FastAPI.

Este o continuare a articolului meu anterior, pe care îl găsești aici și se bazează parțial pe această lecție FastAI:

https://www.youtube.com/watch?v=F4tvM4Vb3A0

Exportarea modelului

Înainte să creăm API-ul, trebuie să exportăm modelul ca fișier pickle.

Adaugă learn.export("<path>/cat_or_dog.pkl") cu calea absolută completă de export la finalul scriptului:

# ...learn = vision_learner(dls, resnet34, metrics=error_rate)learn.fine_tune(1)learn.export("C:\\Users\\nutiu\PycharmProjects\\fastaiIntro\cat_or_dog.pkl")

Deploy-ul cu FastAPI

Să creăm un proiect nou și să instalăm dependențele necesare:

pip install fastaipip install fastapipip install python-multipartpip install "uvicorn[standard]"

Acum creează un fișier Python main.py, în care vom defini aplicația FastAPI. Reține că acesta este doar un tutorial scurt, nu o introducere completă în FastAPI; poți găsi mai multe detalii despre el aici.

Handler-ul FastAPI este un simplu endpoint POST care primește un fișier și returnează un răspuns JSON cu predicția. Dacă fișierul nu este o imagine, returnează un răspuns 400.

Funcția is_cat este necesară la importul modelului; dacă nu este definită, modelul nu se va încărca corect.

import PILfrom fastai.learner import load_learnerfrom fastapi import FastAPI, UploadFile, HTTPExceptionapp = FastAPI()def is_cat(x):    return x[0].isupper()cat_or_dog_model = load_learner(open("cat_or_dog.pkl", "rb"))@app.post("/predict/cat-or-dog")async def post_predict_cat_or_dog(file: UploadFile):    try:        file_contents = await file.read()        is_cat, _, confidence = cat_or_dog_model.predict(file_contents)        return {            "is_cat": True if is_cat == "True" else False,            "confidence": float(confidence[1])        }    except PIL.UnidentifiedImageError as e:        raise HTTPException(status_code=400, detail="File is not an image")if __name__ == "__main__":    import uvicorn    uvicorn.run(app, host="0.0.0.0", port=8000)

Gata, acum poți rula aplicația cu python main.py și o poți testa cu curl:

curl -X 'POST' \  'http://localhost:8000/predict/cat-or-dog' \  -H 'accept: application/json' \  -H 'Content-Type: multipart/form-data' \  -F '[email protected];type=image/jpeg'

Ar trebui să primești un răspuns asemănător cu acesta:

{  "is_cat": true,  "confidence": 1}

Pe mașina mea, timpul de răspuns este de aproximativ 70 ms.

Concluzie

Ți-am arătat o modalitate simplă de a face deploy unui model FastAI cu FastAPI: îl exporți într-un fișier pickle și apoi îl încarci în API.

O variantă mai avansată de deploy ar fi să folosești ONNX Runtime. Alte metode de deploy sunt prezentate și de Jeremy în videoclipul de mai sus.

Mulțumesc pentru lectură! 📚🫶

Dacă vrei să fii anunțat când public conținut nou, abonează-te la newsletter-ul meu 📰.