diff --git a/README.md b/README.md index ff02fce..5c76e67 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ | 10.10.2024 | [Feature engineering](./lectures/lec6-feature_engineering.odp) - [в формате pptx](./lectures/lec6-feature_engineering.pptx) - код в [ноутбуке к mlflow](./assets/mlflow/research.ipynb) | | 17.10.2024 | [Feature extraction. Настройка гиперпараметров](./lectures/lec7-feature_selection_hyperparams.odp) - [в формате pptx](./lectures/lec7-feature_selection_hyperparams.pptx) - код в [ноутбуке к mlflow](./assets/mlflow/research.ipynb) | | 24.10.2024 | [Архитекура сервиса. API](./lectures/lec8-api.odp) - [в формате pptx](./lectures/lec8-api.pptx) | +| 14.11.2024 | [Создание микросервиса](./lectures/lec9-webserver.pptx) | ## Перенос занятий diff --git a/assets/service/ml_service/.dockerignore b/assets/service/ml_service/.dockerignore new file mode 100644 index 0000000..ed8ebf5 --- /dev/null +++ b/assets/service/ml_service/.dockerignore @@ -0,0 +1 @@ +__pycache__ \ No newline at end of file diff --git a/assets/service/ml_service/Dockerfile b/assets/service/ml_service/Dockerfile new file mode 100644 index 0000000..23045e8 --- /dev/null +++ b/assets/service/ml_service/Dockerfile @@ -0,0 +1,14 @@ +FROM python:3.11-slim + +COPY . /app +WORKDIR /app + +RUN pip install -r requirements.txt + +EXPOSE 8000 +VOLUME /models + +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000" ] + +# docker build . --tag estate_model:0 +# docker run -p 8001:8000 -v $(pwd)/../models:/models estate_model:0 \ No newline at end of file diff --git a/assets/service/ml_service/api_handler.py b/assets/service/ml_service/api_handler.py new file mode 100644 index 0000000..32cd62e --- /dev/null +++ b/assets/service/ml_service/api_handler.py @@ -0,0 +1,20 @@ + +import logging +import pandas as pd +import pickle as pkl + +logger = logging.getLogger("uvicorn.error") +class FastAPIHandler(): + + def __init__(self): + logger.warning('Loading model...') + try: + self.model = pkl.load(open('../models/model.pkl', 'rb')) + logger.info('Model is loaded') + except Exception as e: + logger.error('Error loading model') + + def predict(self, item_features:dict): + item_df = pd.DataFrame(data=item_features, index=[0]) + prediction = self.model.predict(item_df) + return (prediction[0]) \ No newline at end of file diff --git a/assets/service/ml_service/main.py b/assets/service/ml_service/main.py new file mode 100644 index 0000000..17706c6 --- /dev/null +++ b/assets/service/ml_service/main.py @@ -0,0 +1,19 @@ + +import random +from fastapi import FastAPI +from api_handler import FastAPIHandler + +app = FastAPI() +app.handler = FastAPIHandler() + +@app.get('/') +def root_dir(): + return({'Hello': 'world'}) + +@app.post('/api/prediction') +def make_prediction(flat_id: int, item_features: dict): + prediction = app.handler.predict(item_features) + return ({ + 'price': prediction, + 'flat_id': flat_id + }) diff --git a/assets/service/ml_service/requirements.txt b/assets/service/ml_service/requirements.txt new file mode 100644 index 0000000..6b03979 --- /dev/null +++ b/assets/service/ml_service/requirements.txt @@ -0,0 +1,5 @@ +fastapi +uvicorn +pandas +pickle4 +scikit-learn \ No newline at end of file diff --git a/assets/service/models/get_model.py b/assets/service/models/get_model.py new file mode 100644 index 0000000..9c5b839 --- /dev/null +++ b/assets/service/models/get_model.py @@ -0,0 +1,18 @@ +import mlflow +import pickle as pkl + +# Работаем с MLflow локально +TRACKING_SERVER_HOST = "127.0.0.1" +TRACKING_SERVER_PORT = 5001 + +registry_uri = f"http://{TRACKING_SERVER_HOST}:{TRACKING_SERVER_PORT}" +tracking_uri = f"http://{TRACKING_SERVER_HOST}:{TRACKING_SERVER_PORT}" + +mlflow.set_tracking_uri(tracking_uri) +mlflow.set_registry_uri(registry_uri) + +RUN_NAME = '96a46920d98c48dfa3c019926b44018b' +loaded_model = mlflow.sklearn.load_model(f'runs:/{RUN_NAME}/models') + +with open('model.pkl', 'wb+') as f: + pkl.dump(loaded_model, f) \ No newline at end of file diff --git a/lectures/lec9-webserver.pptx b/lectures/lec9-webserver.pptx new file mode 100644 index 0000000..c1bb05a Binary files /dev/null and b/lectures/lec9-webserver.pptx differ