From b66aed2636c8c9b14eeb3310ba1b27954ebd97d6 Mon Sep 17 00:00:00 2001 From: syropiatovvv Date: Wed, 15 Oct 2025 12:41:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B3=D0=BE=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20MLFlow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- research/research.py | 81 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/research/research.py b/research/research.py index 6213f39..0f2fa6a 100644 --- a/research/research.py +++ b/research/research.py @@ -1,7 +1,7 @@ # --- # jupyter: # jupytext: -# formats: ipynb,py:percent +# formats: py:percent,ipynb # text_representation: # extension: .py # format_name: percent @@ -16,12 +16,34 @@ # %% from typing import Optional +# %% +# %% tags=["parameters"] +data_path: Optional[str] = None +# Полный путь к файлу (CSV) с исходным датасетом. Если не установлен, ищется файл в `data/`. +data_relpath: str = 'cars.csv' +# Путь к файлу (CSV) с исходным датасетом относительно директории данных `data`. Игнорируется, если установлен data_path. + +data_aug_pickle_path: Optional[str] = None +# Полный путь к файлу (pickle) для сохранения очищенного датасета. Если не установлен, используется `data/`. +data_aug_pickle_relpath: str = 'cars.aug.pickle' +# Путь к файлу (pickle) для сохранения очищенного датасета относительно директории данных `data`. Игнорируется, если установлен data_aug_pickle_path. + +mlflow_tracking_server_uri: str = 'http://localhost:5000' +mlflow_registry_uri: Optional[str] = None + +mlflow_experiment_name: str = 'Current price predicion for used cars' +mlflow_experiment_new: bool = False +mlflow_run_name: str = 'Baseline model' + # %% import os import pathlib import pickle # %% +import mlflow +import mlflow.models +import mlflow.sklearn import sklearn.compose import sklearn.ensemble import sklearn.metrics @@ -30,19 +52,12 @@ import sklearn.pipeline import sklearn.preprocessing # %% -# %% tags=["parameters"] -data_path: Optional[str] = None -# Полный путь к файлу (CSV) с исходным датасетом. Если не установлен, ищется файл в `data/`. -data_relpath: str = 'cars.csv' -# Путь к файлу (CSV) с исходным датасетом относительно директории данных `data`. Игнорируется, если установлен data_path. - -data_aug_pickle_path: Optional[str] = None -# Полный путь к файлу (pickle) для сохранения очищенного датасета. Если не установлен, используется `data/`. -data_aug_pickle_relpath: str = 'cars.aug.pickle' -# Путь к файлу (pickle) для сохранения очищенного датасета относительно директории данных `data`. Игнорируется, если установлен data_aug_pickle_path. +BASE_PATH = pathlib.Path('..') # %% -BASE_PATH = pathlib.Path('..') +mlflow.set_tracking_uri(mlflow_tracking_server_uri) +if mlflow_registry_uri is not None: + mlflow.set_registry_uri(mlflow_registry_uri) # %% DATA_PATH = ( @@ -171,3 +186,45 @@ metrics = { # %% metrics + +# %% +MODEL_PIP_REQUIREMENTS_PATH = BASE_PATH / 'requirements.txt' +MODEL_COMMENTS_FILE_PATH = BASE_PATH / 'comment.txt' + +# %% +MODEL_INOUT_EXAMPLE_SIZE = 0x10 + +# %% +model_inout_example = (df_orig_features.head(MODEL_INOUT_EXAMPLE_SIZE), df_target.head(MODEL_INOUT_EXAMPLE_SIZE)) + +# %% +mlflow_model_signature = mlflow.models.infer_signature(model_input=model_inout_example[0], model_output=model_inout_example[1]) + +# %% +mlflow_model_signature + +# %% +model_params = pipeline.get_params() + +# %% +model_params + +# %% +if mlflow_experiment_new: + experiment = mlflow.get_experiment(mlflow.create_experiment(mlflow_experiment_name)) +else: + experiment = mlflow.set_experiment(experiment_name=mlflow_experiment_name) + +# %% +with mlflow.start_run(experiment_id=experiment.experiment_id, run_name=mlflow_run_name): + _ = mlflow.sklearn.log_model( + pipeline, + 'model', + signature=mlflow_model_signature, + input_example=model_inout_example[0], + pip_requirements=str(MODEL_PIP_REQUIREMENTS_PATH), + ) + _ = mlflow.log_params(model_params) + _ = mlflow.log_metrics({k: float(v) for k, v in metrics.items()}) + if MODEL_COMMENTS_FILE_PATH.exists(): + mlflow.log_artifact(str(MODEL_COMMENTS_FILE_PATH))