2 Коммитов

Автор SHA1 Сообщение Дата
b66aed2636 добавить логирование прогонов в MLFlow 2025-10-15 12:41:17 +03:00
462ab85b18 ввести MLFlow в работу 2025-10-15 12:40:14 +03:00
4 изменённых файлов: 87 добавлений и 14 удалений

2
mlflow/.gitignore поставляемый Обычный файл
Просмотреть файл

@@ -0,0 +1,2 @@
mlruns.sqlite
mlartifacts/

Просмотреть файл

@@ -2,6 +2,7 @@ bokeh >=3.7.2,<4
ipykernel >=6.30.1,<7 ipykernel >=6.30.1,<7
ipympl ~=0.9.6 ipympl ~=0.9.6
matplotlib >=3.10.1,<4 matplotlib >=3.10.1,<4
mlflow>=2.16,<2.22
numpy >=2.2.6,<3 numpy >=2.2.6,<3
pandas >=2.3.1,<3 pandas >=2.3.1,<3
scipy >=1.15.3,<2 scipy >=1.15.3,<2

Просмотреть файл

@@ -1,7 +1,7 @@
# --- # ---
# jupyter: # jupyter:
# jupytext: # jupytext:
# formats: ipynb,py:percent # formats: py:percent,ipynb
# text_representation: # text_representation:
# extension: .py # extension: .py
# format_name: percent # format_name: percent
@@ -16,19 +16,6 @@
# %% # %%
from typing import Optional from typing import Optional
# %%
import os
import pathlib
import pickle
# %%
import sklearn.compose
import sklearn.ensemble
import sklearn.metrics
import sklearn.model_selection
import sklearn.pipeline
import sklearn.preprocessing
# %% # %%
# %% tags=["parameters"] # %% tags=["parameters"]
data_path: Optional[str] = None data_path: Optional[str] = None
@@ -41,9 +28,37 @@ data_aug_pickle_path: Optional[str] = None
data_aug_pickle_relpath: str = 'cars.aug.pickle' data_aug_pickle_relpath: str = 'cars.aug.pickle'
# Путь к файлу (pickle) для сохранения очищенного датасета относительно директории данных `data`. Игнорируется, если установлен data_aug_pickle_path. # Путь к файлу (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
import sklearn.model_selection
import sklearn.pipeline
import sklearn.preprocessing
# %% # %%
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 = ( DATA_PATH = (
pathlib.Path(os.path.dirname(data_path)) pathlib.Path(os.path.dirname(data_path))
@@ -171,3 +186,45 @@ metrics = {
# %% # %%
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))

13
run_mlflow_server.sh Исполняемый файл
Просмотреть файл

@@ -0,0 +1,13 @@
# Must be a relative path to be used in an option for mlflow server.
BACKEND_STORE_DB_PATH="./mlflow/mlruns.sqlite"
DEFAULT_ARTIFACTS_ROOT="./mlflow/"
if [ ! -e "$BACKEND_STORE_DB_PATH" ]; then
printf '%s\n' "Error: '$BACKEND_STORE_DB_PATH' does not exist." >&2
exit 1
fi
mlflow server \
--backend-store-uri="sqlite:///$BACKEND_STORE_DB_PATH" \
--default-artifacts-root="$DEFAULT_ARTIFACTS_ROOT" \
-p 5000