refactor: в блокноте research, использовать mlflow nested runs

lab_2/master
syropiatovvv 2 дней назад
Родитель c16caf2e6a
Сommit a7a0780f1a
Подписано: syropiatovvv
Идентификатор GPG ключа: 297380B8143A31BD

@ -44,14 +44,8 @@ mlflow_experiment_id: Optional[str] = None
# ID эксперимента MLFlow, имеет приоритет над `mlflow_experiment_name`. # ID эксперимента MLFlow, имеет приоритет над `mlflow_experiment_name`.
mlflow_experiment_name: Optional[str] = 'Current price predicion for used cars' mlflow_experiment_name: Optional[str] = 'Current price predicion for used cars'
# Имя эксперимента MLFlow (ниже приоритетом, чем `mlflow_experiment_id`). # Имя эксперимента MLFlow (ниже приоритетом, чем `mlflow_experiment_id`).
mlflow_baseline_run_name: str = 'Baseline model' mlflow_root_run_name: str = 'Models'
# Имя ноговго прогона MLFlow для baseline модели. # Имя корневого прогона MLFlow (остальные прогоны будут созданы блокнотом внутри этого, как nested)
mlflow_feateng_run_name: str = 'Model with engineered features'
# Имя ноговго прогона MLFlow для модели, использующей дополнительные признаки
mlflow_feateng_filtered_run_name: str = 'Model with filtered engineered features'
# Имя ноговго прогона MLFlow для модели, использующей дополнительные признаки и фильтрацию признаков
mlflow_optimized_feateng_filtered_run_name: str = 'Optimized model with filtered engineered features'
# Имя ноговго прогона MLFlow для модели с оптимизированными гиперпараметрами, использующей дополнительные признаки и фильтрацию признаков
# %% # %%
from collections.abc import Sequence from collections.abc import Sequence
@ -102,6 +96,7 @@ if mlflow_registry_uri is not None:
# %% # %%
if mlflow_do_log: if mlflow_do_log:
mlflow_experiment = mlflow.set_experiment(experiment_name=mlflow_experiment_name, experiment_id=mlflow_experiment_id) mlflow_experiment = mlflow.set_experiment(experiment_name=mlflow_experiment_name, experiment_id=mlflow_experiment_id)
mlflow_root_run_id = None # изменяется позже
# %% # %%
DATA_PATH = ( DATA_PATH = (
@ -282,34 +277,47 @@ def score_predictions(target_test, target_test_predicted):
# %% # %%
# использует глобальные переменные mlflow_do_log, mlflow_experiment # использует глобальные переменные mlflow_do_log, mlflow_experiment, mlflow_root_run_name
def mlflow_log_model( def mlflow_log_model(
model, model,
model_params, model_params,
metrics, metrics,
*, *,
run_name, nested_run_name,
model_signature=None, model_signature=None,
input_example=None, input_example=None,
#pip_requirements=None, #pip_requirements=None,
comment_file_path=None, comment_file_path=None,
): ):
global mlflow_root_run_id
if not mlflow_do_log: if not mlflow_do_log:
return return
with mlflow.start_run(experiment_id=mlflow_experiment.experiment_id, run_name=run_name): experiment_id = mlflow_experiment.experiment_id
_ = mlflow.sklearn.log_model( start_run_root_kwargs_extra = {}
model, if mlflow_root_run_id is not None:
'model', start_run_root_kwargs_extra['run_id'] = mlflow_root_run_id
signature=model_signature, else:
input_example=input_example, start_run_root_kwargs_extra['run_name'] = mlflow_root_run_name
#pip_requirements=pip_requirements, with mlflow.start_run(experiment_id=experiment_id, **start_run_root_kwargs_extra) as root_run:
) if root_run.info.status not in ('RUNNING',):
if model_params is not None: raise RuntimeError('Cannot get the root run to run')
_ = mlflow.log_params(model_params) if mlflow_root_run_id is None:
if metrics is not None: mlflow_root_run_id = root_run.info.run_id
_ = mlflow.log_metrics(metrics) # важно одновременно использовать nested=True и parent_run_id=...:
if (comment_file_path is not None) and comment_file_path.exists(): with mlflow.start_run(experiment_id=experiment_id, run_name=nested_run_name, nested=True, parent_run_id=mlflow_root_run_id):
mlflow.log_artifact(str(comment_file_path)) _ = mlflow.sklearn.log_model(
model,
'model',
signature=model_signature,
input_example=input_example,
#pip_requirements=pip_requirements,
)
if model_params is not None:
_ = mlflow.log_params(model_params)
if metrics is not None:
_ = mlflow.log_metrics(metrics)
if (comment_file_path is not None) and comment_file_path.exists():
mlflow.log_artifact(str(comment_file_path))
# %% [markdown] # %% [markdown]
@ -392,7 +400,7 @@ mlflow_log_model(
pipeline, pipeline,
model_params=model_params, model_params=model_params,
metrics={k: float(v) for k, v in metrics.items()}, metrics={k: float(v) for k, v in metrics.items()},
run_name=mlflow_baseline_run_name, nested_run_name='Baseline model',
model_signature=mlflow_model_signature, model_signature=mlflow_model_signature,
input_example=df_orig_features.head(MODEL_INOUT_EXAMPLE_SIZE), input_example=df_orig_features.head(MODEL_INOUT_EXAMPLE_SIZE),
#pip_requirements=str(MODEL_PIP_REQUIREMENTS_PATH), #pip_requirements=str(MODEL_PIP_REQUIREMENTS_PATH),
@ -545,7 +553,7 @@ mlflow_log_model(
pipeline, pipeline,
model_params=model_params, model_params=model_params,
metrics={k: float(v) for k, v in metrics.items()}, metrics={k: float(v) for k, v in metrics.items()},
run_name=mlflow_feateng_run_name, nested_run_name='Model with engineered features',
model_signature=mlflow_model_signature, model_signature=mlflow_model_signature,
input_example=df_orig_features.head(MODEL_INOUT_EXAMPLE_SIZE), input_example=df_orig_features.head(MODEL_INOUT_EXAMPLE_SIZE),
#pip_requirements=str(MODEL_PIP_REQUIREMENTS_PATH), #pip_requirements=str(MODEL_PIP_REQUIREMENTS_PATH),
@ -665,7 +673,7 @@ mlflow_log_model(
pipeline, pipeline,
model_params=model_params, model_params=model_params,
metrics={k: float(v) for k, v in metrics.items()}, metrics={k: float(v) for k, v in metrics.items()},
run_name=mlflow_feateng_filtered_run_name, nested_run_name='Model with filtered engineered features',
model_signature=mlflow_model_signature, model_signature=mlflow_model_signature,
input_example=df_orig_features.head(MODEL_INOUT_EXAMPLE_SIZE), input_example=df_orig_features.head(MODEL_INOUT_EXAMPLE_SIZE),
#pip_requirements=str(MODEL_PIP_REQUIREMENTS_PATH), #pip_requirements=str(MODEL_PIP_REQUIREMENTS_PATH),
@ -785,7 +793,7 @@ mlflow_log_model(
pipeline, pipeline,
model_params=model_params, model_params=model_params,
metrics={k: float(v) for k, v in metrics.items()}, metrics={k: float(v) for k, v in metrics.items()},
run_name=mlflow_optimized_feateng_filtered_run_name, nested_run_name='Optimized model with filtered engineered features',
model_signature=mlflow_model_signature, model_signature=mlflow_model_signature,
input_example=df_orig_features.head(MODEL_INOUT_EXAMPLE_SIZE), input_example=df_orig_features.head(MODEL_INOUT_EXAMPLE_SIZE),
#pip_requirements=str(MODEL_PIP_REQUIREMENTS_PATH), #pip_requirements=str(MODEL_PIP_REQUIREMENTS_PATH),

Загрузка…
Отмена
Сохранить