Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ethen8181
GitHub Repository: ethen8181/machine-learning
Path: blob/master/model_deployment/fastapi_kubernetes/app/main.py
1480 views
1
from typing import List
2
from fastapi import FastAPI
3
from pydantic import BaseModel
4
import numpy as np
5
import lightgbm as lgb
6
7
app = FastAPI()
8
model = lgb.Booster(model_file='/app/model.txt')
9
10
11
class Features(BaseModel):
12
MedInc: float
13
HouseAge: float
14
AveRooms: float
15
AveBedrms: float
16
Population: float
17
AveOccup: float
18
Latitude: float
19
Longitude: float
20
21
22
class PredictResponse(BaseModel):
23
score: float
24
25
26
class BatchPredictResponse(BaseModel):
27
scores: List[float]
28
29
30
@app.get("/")
31
def hello_world():
32
return {"message": "Hello World"}
33
34
35
@app.post("/predict", response_model=PredictResponse)
36
def predict(features: Features):
37
"""Endpoint for getting the score for a single record."""
38
row = np.array([getattr(features, name) for name in model.feature_name()])
39
40
# .predict expects a 2d array, hence for single record prediction, we need
41
# to reshape it to 2d first
42
row = row.reshape(1, -1)
43
score = model.predict(row)[0]
44
return {"score": score}
45
46
47
@app.post("/batch/predict", response_model=BatchPredictResponse)
48
def batch_predict(batch_features: List[Features]):
49
"""Endpoint for getting scores for a batch of record."""
50
num_features = len(model.feature_name())
51
rows = np.zeros((len(batch_features), num_features))
52
53
for i, features in enumerate(batch_features):
54
row = np.array([getattr(features, name) for name in model.feature_name()])
55
rows[i] = row
56
57
scores = model.predict(rows).tolist()
58
return {"scores": scores}
59
60