jrno commited on
Commit
f6b6982
1 Parent(s): 121e26a

Add dockerfile

Browse files
Files changed (6) hide show
  1. Dockerfile +5 -0
  2. README.md +5 -4
  3. custom_models.py +20 -0
  4. model.pkl +3 -0
  5. requirements.txt +4 -0
  6. server.py +49 -0
Dockerfile ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ FROM python:3.10.9-slim
2
+ WORKDIR /app
3
+ COPY . .
4
+ RUN pip install -r requirements.txt
5
+ CMD ["python", "server.py"]
README.md CHANGED
@@ -1,10 +1,11 @@
1
  ---
2
- title: Song Recommender
3
- emoji: 🐠
4
- colorFrom: red
5
  colorTo: purple
6
- sdk: docker
7
  pinned: false
 
8
  ---
9
 
10
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: Recommender Api
3
+ emoji: 📚
4
+ colorFrom: yellow
5
  colorTo: purple
6
+ sdk: static
7
  pinned: false
8
+ license: mit
9
  ---
10
 
11
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
custom_models.py ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastai.tabular.all import *
2
+
3
+ def create_params(size):
4
+ return nn.Parameter(torch.zeros(*size).normal_(0, 0.01))
5
+
6
+ class DotProductBias(Module):
7
+ def __init__(self, n_users, n_items, n_factors, y_range=(0, 1.5)):
8
+ super().__init__()
9
+ self.user_factors = create_params([n_users, n_factors])
10
+ self.user_bias = create_params([n_users])
11
+ self.item_factors = create_params([n_items, n_factors])
12
+ self.item_bias = create_params([n_items])
13
+ self.y_range = y_range
14
+
15
+ def forward(self, x):
16
+ users = self.user_factors[x[:,0]]
17
+ items = self.item_factors[x[:,1]]
18
+ res = (users * items).sum(dim=1)
19
+ res += self.user_bias[x[:,0]] + self.item_bias[x[:,1]]
20
+ return sigmoid_range(res, *self.y_range)
model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e924702f82931c0136765bdd8006a8c272769bd1090883b3964179740e5ca541
3
+ size 6970809
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ fastai
2
+ fastapi
3
+ uvicorn
4
+ asyncio
server.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastai.collab import load_learner
2
+ from fastapi import FastAPI
3
+ from fastapi.middleware.cors import CORSMiddleware
4
+ from custom_models import DotProductBias
5
+ import asyncio
6
+ import uvicorn
7
+ import pandas as pd
8
+ import os
9
+
10
+ # FastAPI app
11
+ app = FastAPI()
12
+
13
+ app.add_middleware(
14
+ CORSMiddleware,
15
+ allow_origins=["*"],
16
+ allow_credentials=True,
17
+ allow_methods=["*"],
18
+ allow_headers=["*"],
19
+ )
20
+
21
+ # Model filename
22
+ model_filename = 'model.pkl'
23
+
24
+ async def setup_learner():
25
+ learn = load_learner(model_filename)
26
+ learn.dls.device = 'cpu'
27
+ return learn
28
+
29
+ learn = None
30
+ @app.on_event("startup")
31
+ async def startup_event():
32
+ """Setup the learner on server start"""
33
+ global learn
34
+ loop = asyncio.get_event_loop() # get event loop
35
+ tasks = [asyncio.ensure_future(setup_learner())] # assign some task
36
+ learn = (await asyncio.gather(*tasks))[0]
37
+
38
+ @app.get("/recommend/{user_id}")
39
+ async def analyze(user_id: str):
40
+ not_listened_songs = ["Revelry, Kings of Leon, 2008", "Gears, Miss May I, 2010", "Sexy Bitch, David Guetta, 2009"]
41
+ input_dataframe = pd.DataFrame({'user_id': ["440abe26940ae9d9268157222a4a3d5735d44ed8"] * len(not_listened_songs), 'entry': not_listened_songs})
42
+ test_dl = learn.dls.test_dl(input_dataframe)
43
+ predictions = learn.get_preds(dl=test_dl)
44
+ print(predictions)
45
+ #pred = learn.predict(file)
46
+ return {"result": predictions[0].numpy().tolist()}
47
+
48
+ if __name__ == "__main__":
49
+ uvicorn.run(app, host="0.0.0.0", port=int(os.getenv("PORT", 7860)))