Spaces:
Sleeping
Sleeping
Add dockerfile
Browse files- Dockerfile +5 -0
- README.md +5 -4
- custom_models.py +20 -0
- model.pkl +3 -0
- requirements.txt +4 -0
- 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:
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
colorTo: purple
|
6 |
-
sdk:
|
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)))
|