Сравнить коммиты
2 Коммитов
41497aa039
...
b66aed2636
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
b66aed2636
|
|||
|
462ab85b18
|
2
mlflow/.gitignore
поставляемый
Обычный файл
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
Исполняемый файл
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
|
||||||
Ссылка в новой задаче
Block a user