Implementarea 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 vă arăt cum să implementați un model FastAI folosind FastAPI.

Este o continuare a articolului meu anterior de 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.

Adăugați 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")

Implementarea 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 creați un fișier Python main.py pe care îl vom folosi pentru a defini aplicația FastAPI. Rețineți că acesta este doar un tutorial scurt, nu este o introducere completă în FastAPI; puteț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ă pentru importul modelului; dacă nu este definită, modelul nu va fi încărcat 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 puteți rula aplicația folosind python main.py și o puteț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ă primiți un răspuns similar cu acesta:

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

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

Concluzie

Am prezentat o modalitate simplă de a implementa un model FastAI folosind FastAPI, prin exportarea acestuia într-un fișier pickle și apoi încărcarea lui în API.

O modalitate mai avansată de a implementa modelul ar fi folosirea ONNX Runtime. Alte modalități de implementare a modelului sunt, de asemenea, prezentate de Jeremy în videoclipul de mai sus.

Mulțumesc pentru lectură! 📚🫶

Dacă doriți să fiți anunțat când public conținut nou, vă rog să vă abonați la newsletter-ul meu 📰.