diff --git a/README.md b/README.md index 478c6d3..5337b28 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ | 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) | +| 19.11.2024 | [Docker compose](./lectures/lec10-docker_compose.pptx) | +| 21.11.2024 | [Мониторинг сервиса. Prometheus. Graphana](./lectures/lec11-monitoring.pptx) | ## Перенос занятий diff --git a/assets/service/compose.yml b/assets/service/compose.yml new file mode 100644 index 0000000..38b4ec2 --- /dev/null +++ b/assets/service/compose.yml @@ -0,0 +1,15 @@ +name: lec_app + +services: + price-predict: + image: estate_model:0 + ports: + - "8001:8000" + volumes: + - ./models:/models + + + requests: + image: test_requests:2 + + diff --git a/assets/service/ml_service/main.py b/assets/service/ml_service/main.py index 17706c6..4e0989f 100644 --- a/assets/service/ml_service/main.py +++ b/assets/service/ml_service/main.py @@ -2,10 +2,22 @@ import random from fastapi import FastAPI from api_handler import FastAPIHandler +from prometheus_fastapi_instrumentator import Instrumentator +from prometheus_client import Histogram, Gauge, Counter, Summary + app = FastAPI() app.handler = FastAPIHandler() +instrumentator = Instrumentator() +instrumentator.instrument(app).expose(app) + +prediction_metric = Histogram( + 'prediction_metric_histogram', + 'histogram of predicted prices', + buckets=(100000, 1000000, 3000000, 5000000, 15000000, 50000000, 100000000) +) + @app.get('/') def root_dir(): return({'Hello': 'world'}) @@ -13,6 +25,9 @@ def root_dir(): @app.post('/api/prediction') def make_prediction(flat_id: int, item_features: dict): prediction = app.handler.predict(item_features) + + prediction_metric.observe(prediction) + return ({ 'price': prediction, 'flat_id': flat_id diff --git a/assets/service/ml_service/requirements.txt b/assets/service/ml_service/requirements.txt index 6b03979..8b3eb26 100644 --- a/assets/service/ml_service/requirements.txt +++ b/assets/service/ml_service/requirements.txt @@ -2,4 +2,6 @@ fastapi uvicorn pandas pickle4 -scikit-learn \ No newline at end of file +scikit-learn +requests +prometheus_fastapi_instrumentator \ No newline at end of file diff --git a/assets/service/requests/Dockerfile b/assets/service/requests/Dockerfile new file mode 100644 index 0000000..fda567b --- /dev/null +++ b/assets/service/requests/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.11-slim + +COPY . /app +WORKDIR /app + +RUN pip install requests + +CMD ["python3", "req.py"] + +# docker build . --tag test_requests:0 +# docker run test_requests:0 \ No newline at end of file diff --git a/assets/service/requests/req.py b/assets/service/requests/req.py new file mode 100644 index 0000000..53b5bfe --- /dev/null +++ b/assets/service/requests/req.py @@ -0,0 +1,23 @@ +import requests +import time +import random + +time.sleep(3) +for i in range(50): + params = {'flat_id': i} + data = { + "geo_lat": 51.3153190612793, + "geo_lon": 37.920509338378906, + "region": 5952, + "building_type": 3, + "level": random.randint(1,20), + "levels": 9, + "rooms": 2, + "area": random.uniform(10, 200), + "kitchen_area": 10, + "object_type": 1, + "floor_level": "mid" + } + response = requests.post('http://localhost:8000/api/prediction', params=params, json=data) + time.sleep(4) + print(response.json()) \ No newline at end of file diff --git a/lectures/lec10-docker_compose.pptx b/lectures/lec10-docker_compose.pptx new file mode 100644 index 0000000..2ccbdb0 Binary files /dev/null and b/lectures/lec10-docker_compose.pptx differ diff --git a/lectures/lec11-monitoring.pptx b/lectures/lec11-monitoring.pptx new file mode 100644 index 0000000..22a33ce Binary files /dev/null and b/lectures/lec11-monitoring.pptx differ