Skip to content

Commit e3ad075

Browse files
Merge branch 'main' into auto_transform_bug_fix
2 parents 69ead2e + 60d48f2 commit e3ad075

File tree

17 files changed

+224
-225
lines changed

17 files changed

+224
-225
lines changed

.github/workflows/run-forecast-unit-tests.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ jobs:
5656
$CONDA/bin/conda init
5757
source /home/runner/.bashrc
5858
pip install -r test-requirements-operators.txt
59-
pip install "oracle-automlx[classic]>=24.2.0"
60-
pip install "oracle-automlx[forecasting]>=24.2.0"
59+
pip install "oracle-automlx[forecasting]>=24.4.0"
6160
pip install pandas>=2.2.0
6261
python -m pytest -v -p no:warnings --durations=5 tests/operators/forecast

ads/aqua/evaluation/entities.py

Lines changed: 45 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,18 @@
99
This module contains dataclasses for aqua evaluation.
1010
"""
1111

12-
from dataclasses import dataclass, field
13-
from typing import List, Optional, Union
12+
from pydantic import Field
13+
from typing import Any, Dict, List, Optional, Union
1414

1515
from ads.aqua.data import AquaResourceIdentifier
16-
from ads.common.serializer import DataClassSerializable
16+
from ads.aqua.config.utils.serializer import Serializable
1717

1818

19-
@dataclass(repr=False)
20-
class CreateAquaEvaluationDetails(DataClassSerializable):
21-
"""Dataclass to create aqua model evaluation.
19+
class CreateAquaEvaluationDetails(Serializable):
20+
"""Class for creating aqua model evaluation.
2221
23-
Fields
24-
------
22+
Properties
23+
----------
2524
evaluation_source_id: str
2625
The evaluation source id. Must be either model or model deployment ocid.
2726
evaluation_name: str
@@ -83,69 +82,64 @@ class CreateAquaEvaluationDetails(DataClassSerializable):
8382
ocpus: Optional[float] = None
8483
log_group_id: Optional[str] = None
8584
log_id: Optional[str] = None
86-
metrics: Optional[List] = None
85+
metrics: Optional[List[str]] = None
8786
force_overwrite: Optional[bool] = False
8887

88+
class Config:
89+
extra = "ignore"
8990

90-
@dataclass(repr=False)
91-
class AquaEvalReport(DataClassSerializable):
91+
class AquaEvalReport(Serializable):
9292
evaluation_id: str = ""
9393
content: str = ""
9494

95+
class Config:
96+
extra = "ignore"
9597

96-
@dataclass(repr=False)
97-
class ModelParams(DataClassSerializable):
98-
max_tokens: str = ""
99-
top_p: str = ""
100-
top_k: str = ""
101-
temperature: str = ""
102-
presence_penalty: Optional[float] = 0.0
103-
frequency_penalty: Optional[float] = 0.0
104-
stop: Optional[Union[str, List[str]]] = field(default_factory=list)
105-
model: Optional[str] = "odsc-llm"
106-
107-
108-
@dataclass(repr=False)
109-
class AquaEvalParams(ModelParams, DataClassSerializable):
98+
class AquaEvalParams(Serializable):
11099
shape: str = ""
111100
dataset_path: str = ""
112101
report_path: str = ""
113102

103+
class Config:
104+
extra = "allow"
114105

115-
@dataclass(repr=False)
116-
class AquaEvalMetric(DataClassSerializable):
106+
class AquaEvalMetric(Serializable):
117107
key: str
118108
name: str
119109
description: str = ""
120110

111+
class Config:
112+
extra = "ignore"
121113

122-
@dataclass(repr=False)
123-
class AquaEvalMetricSummary(DataClassSerializable):
114+
class AquaEvalMetricSummary(Serializable):
124115
metric: str = ""
125116
score: str = ""
126117
grade: str = ""
127118

119+
class Config:
120+
extra = "ignore"
128121

129-
@dataclass(repr=False)
130-
class AquaEvalMetrics(DataClassSerializable):
122+
class AquaEvalMetrics(Serializable):
131123
id: str
132124
report: str
133-
metric_results: List[AquaEvalMetric] = field(default_factory=list)
134-
metric_summary_result: List[AquaEvalMetricSummary] = field(default_factory=list)
125+
metric_results: List[AquaEvalMetric] = Field(default_factory=list)
126+
metric_summary_result: List[AquaEvalMetricSummary] = Field(default_factory=list)
135127

128+
class Config:
129+
extra = "ignore"
136130

137-
@dataclass(repr=False)
138-
class AquaEvaluationCommands(DataClassSerializable):
131+
class AquaEvaluationCommands(Serializable):
139132
evaluation_id: str
140133
evaluation_target_id: str
141-
input_data: dict
142-
metrics: list
134+
input_data: Dict[str, Any]
135+
metrics: List[str]
143136
output_dir: str
144-
params: dict
137+
params: Dict[str, Any]
145138

139+
class Config:
140+
extra = "ignore"
146141

147-
@dataclass(repr=False)
148-
class AquaEvaluationSummary(DataClassSerializable):
142+
class AquaEvaluationSummary(Serializable):
149143
"""Represents a summary of Aqua evalution."""
150144

151145
id: str
@@ -154,17 +148,18 @@ class AquaEvaluationSummary(DataClassSerializable):
154148
lifecycle_state: str
155149
lifecycle_details: str
156150
time_created: str
157-
tags: dict
158-
experiment: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
159-
source: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
160-
job: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
161-
parameters: AquaEvalParams = field(default_factory=AquaEvalParams)
151+
tags: Dict[str, Any]
152+
experiment: AquaResourceIdentifier = Field(default_factory=AquaResourceIdentifier)
153+
source: AquaResourceIdentifier = Field(default_factory=AquaResourceIdentifier)
154+
job: AquaResourceIdentifier = Field(default_factory=AquaResourceIdentifier)
155+
parameters: AquaEvalParams = Field(default_factory=AquaEvalParams)
162156

157+
class Config:
158+
extra = "ignore"
163159

164-
@dataclass(repr=False)
165-
class AquaEvaluationDetail(AquaEvaluationSummary, DataClassSerializable):
160+
class AquaEvaluationDetail(AquaEvaluationSummary):
166161
"""Represents a details of Aqua evalution."""
167162

168-
log_group: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
169-
log: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
170-
introspection: dict = field(default_factory=dict)
163+
log_group: AquaResourceIdentifier = Field(default_factory=AquaResourceIdentifier)
164+
log: AquaResourceIdentifier = Field(default_factory=AquaResourceIdentifier)
165+
introspection: dict = Field(default_factory=dict)

ads/aqua/evaluation/evaluation.py

Lines changed: 26 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import re
88
import tempfile
99
from concurrent.futures import ThreadPoolExecutor, as_completed
10-
from dataclasses import asdict, fields
1110
from datetime import datetime, timedelta
1211
from pathlib import Path
1312
from threading import Lock
@@ -46,7 +45,6 @@
4645
upload_local_to_os,
4746
)
4847
from ads.aqua.config.config import get_evaluation_service_config
49-
from ads.aqua.config.evaluation.evaluation_service_config import EvaluationServiceConfig
5048
from ads.aqua.constants import (
5149
CONSOLE_LINK_RESOURCE_TYPE_MAPPING,
5250
EVALUATION_REPORT,
@@ -75,7 +73,6 @@
7573
AquaEvaluationSummary,
7674
AquaResourceIdentifier,
7775
CreateAquaEvaluationDetails,
78-
ModelParams,
7976
)
8077
from ads.aqua.evaluation.errors import EVALUATION_JOB_EXIT_CODE_MESSAGE
8178
from ads.aqua.ui import AquaContainerConfig
@@ -161,10 +158,11 @@ def create(
161158
try:
162159
create_aqua_evaluation_details = CreateAquaEvaluationDetails(**kwargs)
163160
except Exception as ex:
161+
custom_errors = {
162+
".".join(map(str, e["loc"])): e["msg"] for e in json.loads(ex.json())
163+
}
164164
raise AquaValueError(
165-
"Invalid create evaluation parameters. "
166-
"Allowable parameters are: "
167-
f"{', '.join([field.name for field in fields(CreateAquaEvaluationDetails)])}."
165+
f"Invalid create evaluation parameters. Error details: {custom_errors}."
168166
) from ex
169167

170168
if not is_valid_ocid(create_aqua_evaluation_details.evaluation_source_id):
@@ -175,15 +173,7 @@ def create(
175173

176174
# The model to evaluate
177175
evaluation_source = None
178-
# The evaluation service config
179-
evaluation_config: EvaluationServiceConfig = get_evaluation_service_config()
180-
# The evaluation inference configuration. The inference configuration will be extracted
181-
# based on the inferencing container family.
182176
eval_inference_configuration: Dict = {}
183-
# The evaluation inference model sampling params. The system parameters that will not be
184-
# visible for user, but will be applied implicitly for evaluation. The service model params
185-
# will be extracted based on the container family and version.
186-
eval_inference_service_model_params: Dict = {}
187177

188178
if (
189179
DataScienceResource.MODEL_DEPLOYMENT
@@ -200,29 +190,14 @@ def create(
200190
runtime = ModelDeploymentContainerRuntime.from_dict(
201191
evaluation_source.runtime.to_dict()
202192
)
203-
container_config = AquaContainerConfig.from_container_index_json(
193+
inference_config = AquaContainerConfig.from_container_index_json(
204194
enable_spec=True
205-
)
206-
for (
207-
inference_container_family,
208-
inference_container_info,
209-
) in container_config.inference.items():
210-
if (
211-
inference_container_info.name
212-
== runtime.image[: runtime.image.rfind(":")]
213-
):
195+
).inference
196+
for container in inference_config.values():
197+
if container.name == runtime.image[: runtime.image.rfind(":")]:
214198
eval_inference_configuration = (
215-
evaluation_config.get_merged_inference_params(
216-
inference_container_family
217-
).to_dict()
218-
)
219-
eval_inference_service_model_params = (
220-
evaluation_config.get_merged_inference_model_params(
221-
inference_container_family,
222-
inference_container_info.version,
223-
)
199+
container.spec.evaluation_configuration
224200
)
225-
226201
except Exception:
227202
logger.debug(
228203
f"Could not load inference config details for the evaluation source id: "
@@ -277,19 +252,12 @@ def create(
277252
)
278253
evaluation_dataset_path = dst_uri
279254

280-
evaluation_model_parameters = None
281-
try:
282-
evaluation_model_parameters = AquaEvalParams(
283-
shape=create_aqua_evaluation_details.shape_name,
284-
dataset_path=evaluation_dataset_path,
285-
report_path=create_aqua_evaluation_details.report_path,
286-
**create_aqua_evaluation_details.model_parameters,
287-
)
288-
except Exception as ex:
289-
raise AquaValueError(
290-
"Invalid model parameters. Model parameters should "
291-
f"be a dictionary with keys: {', '.join(list(ModelParams.__annotations__.keys()))}."
292-
) from ex
255+
evaluation_model_parameters = AquaEvalParams(
256+
shape=create_aqua_evaluation_details.shape_name,
257+
dataset_path=evaluation_dataset_path,
258+
report_path=create_aqua_evaluation_details.report_path,
259+
**create_aqua_evaluation_details.model_parameters,
260+
)
293261

294262
target_compartment = (
295263
create_aqua_evaluation_details.compartment_id or COMPARTMENT_OCID
@@ -370,7 +338,7 @@ def create(
370338
evaluation_model_taxonomy_metadata = ModelTaxonomyMetadata()
371339
evaluation_model_taxonomy_metadata[
372340
MetadataTaxonomyKeys.HYPERPARAMETERS
373-
].value = {"model_params": dict(asdict(evaluation_model_parameters))}
341+
].value = {"model_params": evaluation_model_parameters.to_dict()}
374342

375343
evaluation_model = (
376344
DataScienceModel()
@@ -443,7 +411,6 @@ def create(
443411
dataset_path=evaluation_dataset_path,
444412
report_path=create_aqua_evaluation_details.report_path,
445413
model_parameters={
446-
**eval_inference_service_model_params,
447414
**create_aqua_evaluation_details.model_parameters,
448415
},
449416
metrics=create_aqua_evaluation_details.metrics,
@@ -580,16 +547,14 @@ def _build_evaluation_runtime(
580547
**{
581548
"AIP_SMC_EVALUATION_ARGUMENTS": json.dumps(
582549
{
583-
**asdict(
584-
self._build_launch_cmd(
585-
evaluation_id=evaluation_id,
586-
evaluation_source_id=evaluation_source_id,
587-
dataset_path=dataset_path,
588-
report_path=report_path,
589-
model_parameters=model_parameters,
590-
metrics=metrics,
591-
),
592-
),
550+
**self._build_launch_cmd(
551+
evaluation_id=evaluation_id,
552+
evaluation_source_id=evaluation_source_id,
553+
dataset_path=dataset_path,
554+
report_path=report_path,
555+
model_parameters=model_parameters,
556+
metrics=metrics,
557+
).to_dict(),
593558
**(inference_configuration or {}),
594559
},
595560
),
@@ -662,9 +627,9 @@ def _build_launch_cmd(
662627
"format": Path(dataset_path).suffix,
663628
"url": dataset_path,
664629
},
665-
metrics=metrics,
630+
metrics=metrics or [],
666631
output_dir=report_path,
667-
params=model_parameters,
632+
params=model_parameters or {},
668633
)
669634

670635
@telemetry(entry_point="plugin=evaluation&action=get", name="aqua")

ads/aqua/extension/evaluation_handler.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from ads.aqua.evaluation.entities import CreateAquaEvaluationDetails
1313
from ads.aqua.extension.base_handler import AquaAPIhandler
1414
from ads.aqua.extension.errors import Errors
15-
from ads.aqua.extension.utils import validate_function_parameters
1615
from ads.config import COMPARTMENT_OCID
1716

1817

@@ -47,10 +46,6 @@ def post(self, *args, **kwargs): # noqa
4746
if not input_data:
4847
raise HTTPError(400, Errors.NO_INPUT_DATA)
4948

50-
validate_function_parameters(
51-
data_class=CreateAquaEvaluationDetails, input_data=input_data
52-
)
53-
5449
self.finish(
5550
# TODO: decide what other kwargs will be needed for create aqua evaluation.
5651
AquaEvaluationApp().create(

ads/opctl/operator/lowcode/forecast/cmd.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
#!/usr/bin/env python
2-
# -*- coding: utf-8 -*--
32

4-
# Copyright (c) 2023 Oracle and/or its affiliates.
3+
# Copyright (c) 2023, 2024 Oracle and/or its affiliates.
54
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
65

76
from typing import Dict
87

9-
import click
10-
11-
from ads.opctl import logger
12-
from ads.opctl.operator.common.utils import _load_yaml_from_uri
138
from ads.opctl.operator.common.operator_yaml_generator import YamlGenerator
14-
15-
from .const import SupportedModels
9+
from ads.opctl.operator.common.utils import _load_yaml_from_uri
1610

1711

1812
def init(**kwargs: Dict) -> str:
@@ -39,7 +33,7 @@ def init(**kwargs: Dict) -> str:
3933
# type=click.Choice(SupportedModels.values()),
4034
# default=SupportedModels.Auto,
4135
# )
42-
model_type = "auto"
36+
model_type = "prophet"
4337

4438
return YamlGenerator(
4539
schema=_load_yaml_from_uri(__file__.replace("cmd.py", "schema.yaml"))

0 commit comments

Comments
 (0)