Skip to content

Commit bb8166e

Browse files
authored
Momo GA Changes (#34029)
1 parent 125fa85 commit bb8166e

File tree

17 files changed

+343
-235
lines changed

17 files changed

+343
-235
lines changed

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/monitoring/monitor_definition.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
FeatureAttributionDriftSignalSchema,
1717
CustomMonitoringSignalSchema,
1818
GenerationSafetyQualitySchema,
19+
ModelPerformanceSignalSchema,
1920
)
2021
from azure.ai.ml._schema.monitoring.alert_notification import AlertNotificationSchema
2122
from azure.ai.ml._schema.core.fields import NestedField, UnionField, StringTransformedEnum
@@ -35,6 +36,7 @@ class MonitorDefinitionSchema(metaclass=PatchedSchemaMeta):
3536
NestedField(FeatureAttributionDriftSignalSchema),
3637
NestedField(CustomMonitoringSignalSchema),
3738
NestedField(GenerationSafetyQualitySchema),
39+
NestedField(ModelPerformanceSignalSchema),
3840
]
3941
),
4042
)

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/monitoring/signals.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class ProductionDataSchema(metaclass=PatchedSchemaMeta):
7575
data_context = StringTransformedEnum(allowed_values=[o.value for o in MonitorDatasetContext])
7676
pre_processing_component = fields.Str()
7777
data_window = NestedField(BaselineDataRangeSchema)
78+
data_column_names = fields.Dict(keys=fields.Str(), values=fields.Str())
7879

7980
@post_load
8081
def make(self, data, **kwargs):
@@ -89,6 +90,7 @@ class ReferenceDataSchema(metaclass=PatchedSchemaMeta):
8990
pre_processing_component = fields.Str()
9091
target_column_name = fields.Str()
9192
data_window = NestedField(BaselineDataRangeSchema)
93+
data_column_names = fields.Dict(keys=fields.Str(), values=fields.Str())
9294

9395
@post_load
9496
def make(self, data, **kwargs):
@@ -221,10 +223,14 @@ def make(self, data, **kwargs):
221223
return FeatureAttributionDriftSignal(**data)
222224

223225

224-
class ModelPerformanceSignalSchema(ModelSignalSchema):
226+
class ModelPerformanceSignalSchema(metaclass=PatchedSchemaMeta):
225227
type = StringTransformedEnum(allowed_values=MonitorSignalType.MODEL_PERFORMANCE, required=True)
228+
production_data = NestedField(ProductionDataSchema)
229+
reference_data = NestedField(ReferenceDataSchema)
226230
data_segment = NestedField(DataSegmentSchema)
231+
alert_enabled = fields.Bool()
227232
metric_thresholds = NestedField(ModelPerformanceMetricThresholdSchema)
233+
properties = fields.Dict()
228234

229235
@pre_dump
230236
def predump(self, data, **kwargs):
@@ -299,7 +305,7 @@ class GenerationSafetyQualitySchema(metaclass=PatchedSchemaMeta):
299305
metric_thresholds = NestedField(GenerationSafetyQualityMetricThresholdSchema)
300306
alert_enabled = fields.Bool()
301307
properties = fields.Dict()
302-
sampling_rate = fields.Int()
308+
sampling_rate = fields.Float()
303309

304310
@pre_dump
305311
def predump(self, data, **kwargs):

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/monitoring/thresholds.py

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
# Copyright (c) Microsoft Corporation. All rights reserved.
33
# ---------------------------------------------------------
44

5-
# pylint: disable=unused-argument, line-too-long
5+
# pylint: disable=unused-argument, line-too-long, name-too-long
66

77
from marshmallow import fields, post_load
88

9-
from azure.ai.ml.constants._monitoring import MonitorFeatureType, MonitorMetricName
9+
from azure.ai.ml.constants._monitoring import MonitorFeatureType
1010
from azure.ai.ml._schema.core.fields import StringTransformedEnum, NestedField
1111
from azure.ai.ml._schema.core.schema import PatchedSchemaMeta
1212

@@ -112,18 +112,33 @@ def make(self, data, **kwargs):
112112
return FeatureAttributionDriftMetricThreshold(**data)
113113

114114

115+
class ModelPerformanceClassificationThresholdsSchema(metaclass=PatchedSchemaMeta):
116+
accuracy = fields.Number()
117+
precision = fields.Number()
118+
recall = fields.Number()
119+
120+
@post_load
121+
def make(self, data, **kwargs):
122+
from azure.ai.ml.entities._monitoring.thresholds import ModelPerformanceClassificationThresholds
123+
124+
return ModelPerformanceClassificationThresholds(**data)
125+
126+
127+
class ModelPerformanceRegressionThresholdsSchema(metaclass=PatchedSchemaMeta):
128+
mae = fields.Number()
129+
mse = fields.Number()
130+
rmse = fields.Number()
131+
132+
@post_load
133+
def make(self, data, **kwargs):
134+
from azure.ai.ml.entities._monitoring.thresholds import ModelPerformanceRegressionThresholds
135+
136+
return ModelPerformanceRegressionThresholds(**data)
137+
138+
115139
class ModelPerformanceMetricThresholdSchema(MetricThresholdSchema):
116-
metric_name = StringTransformedEnum(
117-
allowed_values=[
118-
MonitorMetricName.ACCURACY,
119-
MonitorMetricName.PRECISION,
120-
MonitorMetricName.RECALL,
121-
MonitorMetricName.F1_SCORE,
122-
MonitorMetricName.MAE,
123-
MonitorMetricName.MSE,
124-
MonitorMetricName.RMSE,
125-
]
126-
)
140+
classification = NestedField(ModelPerformanceClassificationThresholdsSchema)
141+
regression = NestedField(ModelPerformanceRegressionThresholdsSchema)
127142

128143
@post_load
129144
def make(self, data, **kwargs):

sdk/ml/azure-ai-ml/azure/ai/ml/entities/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@
169169
PredictionDriftSignal,
170170
ProductionData,
171171
ReferenceData,
172+
ModelPerformanceSignal,
172173
)
173174
from ._monitoring.target import MonitoringTarget
174175
from ._monitoring.thresholds import (
@@ -182,6 +183,9 @@
182183
GenerationSafetyQualityMonitoringMetricThreshold,
183184
NumericalDriftMetrics,
184185
PredictionDriftMetricThreshold,
186+
ModelPerformanceMetricThreshold,
187+
ModelPerformanceClassificationThresholds,
188+
ModelPerformanceRegressionThresholds,
185189
)
186190
from ._notification.notification import Notification
187191
from ._registry.registry import Registry
@@ -434,6 +438,7 @@
434438
"FeatureAttributionDriftSignal",
435439
"CustomMonitoringSignal",
436440
"GenerationSafetyQualitySignal",
441+
"ModelPerformanceSignal",
437442
"MonitorFeatureFilter",
438443
"DataSegment",
439444
"FADProductionData",
@@ -455,6 +460,9 @@
455460
"NumericalDriftMetrics",
456461
"DataQualityMetricsNumerical",
457462
"DataQualityMetricsCategorical",
463+
"ModelPerformanceMetricThreshold",
464+
"ModelPerformanceClassificationThresholds",
465+
"ModelPerformanceRegressionThresholds",
458466
"DataCollector",
459467
"IntellectualProperty",
460468
"DeploymentCollection",

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_monitoring/alert_notification.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@
99
EmailNotificationEnableType,
1010
NotificationSetting,
1111
)
12-
from azure.ai.ml._utils._experimental import experimental
1312
from azure.ai.ml.entities._mixins import RestTranslatableMixin
1413

1514

16-
@experimental
1715
class AlertNotification(RestTranslatableMixin):
1816
"""Alert notification configuration for monitoring jobs
1917

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_monitoring/compute.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44

55
from azure.ai.ml._exception_helper import log_and_raise_error
66
from azure.ai.ml._restclient.v2023_06_01_preview.models import AmlTokenComputeIdentity, MonitorServerlessSparkCompute
7-
from azure.ai.ml._utils._experimental import experimental
87
from azure.ai.ml.exceptions import ErrorCategory, ErrorTarget, ValidationErrorType, ValidationException
98

109

11-
@experimental
1210
class ServerlessSparkCompute:
1311
"""Serverless Spark compute.
1412

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_monitoring/definition.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
from azure.ai.ml._restclient.v2023_06_01_preview.models import AzMonMonitoringAlertNotificationSettings
1212
from azure.ai.ml._restclient.v2023_06_01_preview.models import MonitorDefinition as RestMonitorDefinition
13-
from azure.ai.ml._utils._experimental import experimental
1413
from azure.ai.ml.constants._monitoring import (
1514
AZMONITORING,
1615
DEFAULT_DATA_DRIFT_SIGNAL_NAME,
@@ -29,7 +28,6 @@
2928
from azure.ai.ml.entities._monitoring.target import MonitoringTarget
3029

3130

32-
@experimental
3331
class MonitorDefinition(RestTranslatableMixin):
3432
"""Monitor definition
3533
@@ -44,7 +42,8 @@ class MonitorDefinition(RestTranslatableMixin):
4442
, ~azure.ai.ml.entities.DataQualitySignal, ~azure.ai.ml.entities.PredictionDriftSignal
4543
, ~azure.ai.ml.entities.FeatureAttributionDriftSignal
4644
, ~azure.ai.ml.entities.CustomMonitoringSignal
47-
, ~azure.ai.ml.entities.GenerationSafetyQualitySignal]]]
45+
, ~azure.ai.ml.entities.GenerationSafetyQualitySignal
46+
, ~azure.ai.ml.entities.ModelPerformanceSignal]]]
4847
:keyword alert_notification: The alert configuration for the monitor.
4948
:paramtype alert_notification: Optional[Union[Literal['azmonitoring'], ~azure.ai.ml.entities.AlertNotification]]
5049
@@ -73,6 +72,7 @@ def __init__(
7372

7473
def _to_rest_object(self, **kwargs: Any) -> RestMonitorDefinition:
7574
default_data_window_size = kwargs.get("default_data_window_size")
75+
ref_data_window_size = kwargs.get("ref_data_window_size")
7676
rest_alert_notification = None
7777
if self.alert_notification:
7878
if isinstance(self.alert_notification, str) and self.alert_notification.lower() == AZMONITORING:
@@ -85,6 +85,7 @@ def _to_rest_object(self, **kwargs: Any) -> RestMonitorDefinition:
8585
_signals = {
8686
signal_name: signal._to_rest_object(
8787
default_data_window_size=default_data_window_size,
88+
ref_data_window_size=ref_data_window_size,
8889
)
8990
for signal_name, signal in self.monitoring_signals.items()
9091
}

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_monitoring/input_data.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@
1313
from azure.ai.ml._restclient.v2023_06_01_preview.models import MonitoringInputDataBase as RestMonitorInputBase
1414
from azure.ai.ml._restclient.v2023_06_01_preview.models import StaticInputData as RestStaticInputData
1515
from azure.ai.ml._restclient.v2023_06_01_preview.models import TrailingInputData as RestTrailingInputData
16-
from azure.ai.ml._utils._experimental import experimental
1716
from azure.ai.ml._utils.utils import camel_to_snake, snake_to_camel
1817
from azure.ai.ml.constants._monitoring import MonitorDatasetContext, MonitorInputDataType
1918
from azure.ai.ml.entities._mixins import RestTranslatableMixin
2019

2120

22-
@experimental
2321
class MonitorInputData(RestTranslatableMixin):
2422
"""Monitor input data.
2523
@@ -64,7 +62,6 @@ def _from_rest_object(cls, obj: RestMonitorInputBase) -> Optional["MonitorInputD
6462
return None
6563

6664

67-
@experimental
6865
class FixedInputData(MonitorInputData):
6966
"""
7067
:ivar type: Specifies the type of monitoring input data. Set automatically to "Fixed" for this class.
@@ -105,7 +102,6 @@ def _from_rest_object(cls, obj: RestFixedInputData) -> "FixedInputData":
105102
)
106103

107104

108-
@experimental
109105
class TrailingInputData(MonitorInputData):
110106
"""
111107
:ivar type: Specifies the type of monitoring input data. Set automatically to "Trailing" for this class.
@@ -158,7 +154,6 @@ def _from_rest_object(cls, obj: RestTrailingInputData) -> "TrailingInputData":
158154
)
159155

160156

161-
@experimental
162157
class StaticInputData(MonitorInputData):
163158
"""
164159
:ivar type: Specifies the type of monitoring input data. Set automatically to "Static" for this class.

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_monitoring/schedule.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from azure.ai.ml._restclient.v2023_06_01_preview.models import Schedule as RestSchedule
1414
from azure.ai.ml._restclient.v2023_06_01_preview.models import ScheduleProperties
1515
from azure.ai.ml._schema.monitoring.schedule import MonitorScheduleSchema
16-
from azure.ai.ml._utils._experimental import experimental
1716
from azure.ai.ml._utils.utils import dump_yaml_to_file
1817
from azure.ai.ml.constants._common import BASE_PATH_CONTEXT_KEY, PARAMS_OVERRIDE_KEY, ScheduleType
1918
from azure.ai.ml.entities._mixins import RestTranslatableMixin
@@ -26,7 +25,6 @@
2625
module_logger = logging.getLogger(__name__)
2726

2827

29-
@experimental
3028
class MonitorSchedule(Schedule, RestTranslatableMixin):
3129
"""Monitor schedule.
3230
@@ -98,25 +96,31 @@ def _to_rest_object(self) -> RestSchedule:
9896
# by default 7 days if user provides incorrect recurrence frequency
9997
# or a cron expression
10098
default_data_window_size = "P7D"
99+
ref_data_window_size = "P14D"
101100
if isinstance(self.trigger, RecurrenceTrigger):
102101
frequency = self.trigger.frequency.lower()
103102
interval = self.trigger.interval
104103
if frequency == RecurrenceFrequency.MINUTE.lower() or frequency == RecurrenceFrequency.HOUR.lower():
105104
default_data_window_size = "P1D"
105+
ref_data_window_size = "P2D"
106106
elif frequency == RecurrenceFrequency.DAY.lower():
107107
default_data_window_size = f"P{interval}D"
108+
ref_data_window_size = f"P{interval * 2}D"
108109
elif frequency == RecurrenceFrequency.WEEK.lower():
109110
default_data_window_size = f"P{interval * 7}D"
111+
ref_data_window_size = f"P{(interval * 7) * 2}D"
110112
elif frequency == RecurrenceFrequency.MONTH.lower():
111113
default_data_window_size = f"P{interval * 30}D"
114+
ref_data_window_size = f"P{(interval * 30) * 2}D"
115+
112116
return RestSchedule(
113117
properties=ScheduleProperties(
114118
description=self.description,
115119
properties=self.properties,
116120
tags=tags,
117121
action=CreateMonitorAction(
118122
monitor_definition=self.create_monitor._to_rest_object(
119-
default_data_window_size=default_data_window_size
123+
default_data_window_size=default_data_window_size, ref_data_window_size=ref_data_window_size
120124
)
121125
),
122126
display_name=self.display_name,

0 commit comments

Comments
 (0)