Skip to content

Commit b3d598e

Browse files
authored
added toggle for evaluation step (#152)
# These are the default values set in ml_service\util\env_variables.py. Uncomment and override if desired. RUN_EVALUATION=true ALLOW_RUN_CANCEL=true
1 parent 45afe29 commit b3d598e

File tree

6 files changed

+89
-52
lines changed

6 files changed

+89
-52
lines changed

.env.example

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,10 @@ DATAFILE_NAME = 'diabetes.csv'
3939
DB_CLUSTER_ID = ''
4040

4141
# Optional. Container Image name for image creation
42-
IMAGE_NAME = 'mltrained'
42+
IMAGE_NAME = 'mltrained'
43+
44+
# Run Evaluation Step in AML pipeline
45+
RUN_EVALUATION = 'true'
46+
47+
# Set to true cancels the Azure ML pipeline run when evaluation criteria are not met.
48+
ALLOW_RUN_CANCEL = 'true'
Lines changed: 47 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,49 @@
11
variables:
22
# Azure ML Workspace Variables
3-
- name: EXPERIMENT_NAME
4-
value: mlopspython
5-
# AML Compute Cluster Config
6-
- name: AML_COMPUTE_CLUSTER_CPU_SKU
7-
value: STANDARD_DS2_V2
8-
- name: AML_COMPUTE_CLUSTER_NAME
9-
value: train-cluster
10-
- name: AML_CLUSTER_MIN_NODES
11-
value: 0
12-
- name: AML_CLUSTER_MAX_NODES
13-
value: 4
14-
- name: AML_CLUSTER_PRIORITY
15-
value: lowpriority
16-
# Training Config
17-
- name: BUILD_TRAIN_SCRIPT
18-
value: diabetes_regression_build_train_pipeline.py
19-
- name: TRAIN_SCRIPT_PATH
20-
value: training/train.py
21-
- name: MODEL_NAME
22-
value: sklearn_regression_model.pkl
23-
- name: MODEL_VERSION
24-
value: '1'
25-
# AML Pipeline Config
26-
- name: TRAINING_PIPELINE_NAME
27-
value: 'diabetes-Training-Pipeline'
28-
- name: MODEL_PATH
29-
value: ''
30-
- name: EVALUATE_SCRIPT_PATH
31-
value: evaluate/evaluate_model.py
32-
- name: REGISTER_SCRIPT_PATH
33-
value: register/register_model.py
34-
- name: SOURCES_DIR_TRAIN
35-
value: diabetes_regression
36-
- name: IMAGE_NAME
37-
value: 'diabetestrained'
38-
# Optional. Used by a training pipeline with R on Databricks
39-
- name: DB_CLUSTER_ID
40-
value: ''
41-
- name: SCORE_SCRIPT
42-
value: score.py
43-
- name: DATASET_NAME
44-
value: diabetes_ds
3+
- name: EXPERIMENT_NAME
4+
value: mlopspython
5+
# AML Compute Cluster Config
6+
- name: AML_COMPUTE_CLUSTER_CPU_SKU
7+
value: STANDARD_DS2_V2
8+
- name: AML_COMPUTE_CLUSTER_NAME
9+
value: train-cluster
10+
- name: AML_CLUSTER_MIN_NODES
11+
value: 0
12+
- name: AML_CLUSTER_MAX_NODES
13+
value: 4
14+
- name: AML_CLUSTER_PRIORITY
15+
value: lowpriority
16+
# Training Config
17+
- name: BUILD_TRAIN_SCRIPT
18+
value: diabetes_regression_build_train_pipeline.py
19+
- name: TRAIN_SCRIPT_PATH
20+
value: training/train.py
21+
- name: MODEL_NAME
22+
value: sklearn_regression_model.pkl
23+
- name: MODEL_VERSION
24+
value: "1"
25+
# AML Pipeline Config
26+
- name: TRAINING_PIPELINE_NAME
27+
value: "diabetes-Training-Pipeline"
28+
- name: MODEL_PATH
29+
value: ""
30+
- name: EVALUATE_SCRIPT_PATH
31+
value: evaluate/evaluate_model.py
32+
- name: REGISTER_SCRIPT_PATH
33+
value: register/register_model.py
34+
- name: SOURCES_DIR_TRAIN
35+
value: diabetes_regression
36+
- name: IMAGE_NAME
37+
value: "diabetestrained"
38+
# Optional. Used by a training pipeline with R on Databricks
39+
- name: DB_CLUSTER_ID
40+
value: ""
41+
- name: SCORE_SCRIPT
42+
value: score.py
43+
- name: DATASET_NAME
44+
value: diabetes_ds
45+
# These are the default values set in ml_service\util\env_variables.py. Uncomment and override if desired.
46+
# - name: RUN_EVALUATION
47+
# value: "true"
48+
# - name: ALLOW_RUN_CANCEL
49+
# value: "true"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ description: "Code which demonstrates how to set up and operationalize an MLOps
1212
# MLOps with Azure ML
1313

1414

15-
[![Build Status](https://aidemos.visualstudio.com/MLOps/_apis/build/status/microsoft.MLOpsPython-CI?branchName=master)](https://aidemos.visualstudio.com/MLOps/_build/latest?definitionId=127&branchName=master)
15+
[![Build Status](https://aidemos.visualstudio.com/MLOps/_apis/build/status/microsoft.MLOpsPython?branchName=master)](https://aidemos.visualstudio.com/MLOps/_build/latest?definitionId=151&branchName=master)
1616

1717

1818
MLOps will help you to understand how to build the Continuous Integration and Continuous Delivery pipeline for a ML/AI project. We will be using the Azure DevOps Project for build and release/deployment pipelines along with Azure ML services for model retraining pipeline, model management and operationalization.

diabetes_regression/evaluate/evaluate_model.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@
8383
help="Name of the Model",
8484
default="sklearn_regression_model.pkl",
8585
)
86+
parser.add_argument(
87+
"--allow_run_cancel",
88+
type=str,
89+
help="Set this to false to avoid evaluation step from cancelling run after an unsuccessful evaluation", # NOQA: E501
90+
default="true",
91+
)
8692

8793
args = parser.parse_args()
8894
if (args.build_id is not None):
@@ -98,8 +104,8 @@
98104
if (builduri_base is not None):
99105
build_uri = builduri_base + build_id
100106
run.tag("BuildUri", value=build_uri)
101-
102-
# Paramaterize the matrices on which the models should be compared
107+
allow_run_cancel = args.allow_run_cancel
108+
# Parameterize the matrices on which the models should be compared
103109
# Add golden data set on which all the model performance can be evaluated
104110
try:
105111
firstRegistration = False
@@ -124,7 +130,8 @@
124130
if (production_model_mse is None or new_model_mse is None):
125131
print("Unable to find", metric_eval, "metrics, "
126132
"exiting evaluation")
127-
run.parent.cancel()
133+
if((allow_run_cancel).lower() == 'true'):
134+
run.parent.cancel()
128135
else:
129136
print(
130137
"Current Production model mse: {}, "
@@ -139,7 +146,8 @@
139146
else:
140147
print("New trained model metric is less than or equal to "
141148
"production model so skipping model registration.")
142-
run.parent.cancel()
149+
if((allow_run_cancel).lower() == 'true'):
150+
run.parent.cancel()
143151
else:
144152
print("This is the first model, "
145153
"thus it should be registered")

ml_service/pipelines/diabetes_regression_build_train_pipeline.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ def main():
8989
arguments=[
9090
"--build_id", build_id_param,
9191
"--model_name", model_name_param,
92+
"--allow_run_cancel", e.allow_run_cancel,
9293
],
9394
runconfig=run_config,
9495
allow_reuse=False,
@@ -108,10 +109,16 @@ def main():
108109
allow_reuse=False,
109110
)
110111
print("Step Register created")
111-
112-
evaluate_step.run_after(train_step)
113-
register_step.run_after(evaluate_step)
114-
steps = [train_step, evaluate_step, register_step]
112+
# Check run_evaluation flag to include or exclude evaluation step.
113+
if ((e.run_evaluation).lower() == 'true'):
114+
print("Include evaluation step before register step.")
115+
evaluate_step.run_after(train_step)
116+
register_step.run_after(evaluate_step)
117+
steps = [train_step, evaluate_step, register_step]
118+
else:
119+
print("Exclude evaluation step and directly run register step.")
120+
register_step.run_after(train_step)
121+
steps = [train_step, register_step]
115122

116123
train_pipeline = Pipeline(workspace=aml_workspace, steps=steps)
117124
train_pipeline._set_experiment_name

ml_service/util/env_variables.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ def __init__(self):
4444
self._datastore_name = os.environ.get("DATASTORE_NAME")
4545
self._datafile_name = os.environ.get("DATAFILE_NAME")
4646
self._dataset_name = os.environ.get("DATASET_NAME")
47+
self._run_evaluation = os.environ.get("RUN_EVALUATION", "true")
48+
self._allow_run_cancel = os.environ.get(
49+
"ALLOW_RUN_CANCEL", "true")
4750

4851
@property
4952
def workspace_name(self):
@@ -160,3 +163,11 @@ def datafile_name(self):
160163
@property
161164
def dataset_name(self):
162165
return self._dataset_name
166+
167+
@property
168+
def run_evaluation(self):
169+
return self._run_evaluation
170+
171+
@property
172+
def allow_run_cancel(self):
173+
return self._allow_run_cancel

0 commit comments

Comments
 (0)