oracle-ads 2.11.9__py3-none-any.whl → 2.11.11__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ads/aqua/__init__.py +1 -1
- ads/aqua/{base.py → app.py} +27 -7
- ads/aqua/cli.py +59 -17
- ads/aqua/common/__init__.py +5 -0
- ads/aqua/{decorator.py → common/decorator.py} +14 -8
- ads/aqua/common/enums.py +69 -0
- ads/aqua/{exception.py → common/errors.py} +28 -0
- ads/aqua/{utils.py → common/utils.py} +193 -95
- ads/aqua/config/config.py +18 -0
- ads/aqua/constants.py +51 -33
- ads/aqua/data.py +15 -26
- ads/aqua/evaluation/__init__.py +8 -0
- ads/aqua/evaluation/constants.py +53 -0
- ads/aqua/evaluation/entities.py +170 -0
- ads/aqua/evaluation/errors.py +71 -0
- ads/aqua/{evaluation.py → evaluation/evaluation.py} +122 -370
- ads/aqua/extension/__init__.py +2 -0
- ads/aqua/extension/aqua_ws_msg_handler.py +97 -0
- ads/aqua/extension/base_handler.py +0 -7
- ads/aqua/extension/common_handler.py +12 -6
- ads/aqua/extension/deployment_handler.py +70 -4
- ads/aqua/extension/errors.py +10 -0
- ads/aqua/extension/evaluation_handler.py +5 -3
- ads/aqua/extension/evaluation_ws_msg_handler.py +43 -0
- ads/aqua/extension/finetune_handler.py +41 -3
- ads/aqua/extension/model_handler.py +56 -4
- ads/aqua/extension/models/__init__.py +0 -0
- ads/aqua/extension/models/ws_models.py +69 -0
- ads/aqua/extension/ui_handler.py +65 -4
- ads/aqua/extension/ui_websocket_handler.py +124 -0
- ads/aqua/extension/utils.py +1 -1
- ads/aqua/finetuning/__init__.py +7 -0
- ads/aqua/finetuning/constants.py +17 -0
- ads/aqua/finetuning/entities.py +102 -0
- ads/aqua/{finetune.py → finetuning/finetuning.py} +170 -141
- ads/aqua/model/__init__.py +8 -0
- ads/aqua/model/constants.py +46 -0
- ads/aqua/model/entities.py +266 -0
- ads/aqua/model/enums.py +26 -0
- ads/aqua/{model.py → model/model.py} +405 -309
- ads/aqua/modeldeployment/__init__.py +8 -0
- ads/aqua/modeldeployment/constants.py +26 -0
- ads/aqua/{deployment.py → modeldeployment/deployment.py} +288 -227
- ads/aqua/modeldeployment/entities.py +142 -0
- ads/aqua/modeldeployment/inference.py +75 -0
- ads/aqua/ui.py +88 -8
- ads/cli.py +55 -7
- ads/common/decorator/threaded.py +97 -0
- ads/common/serializer.py +2 -2
- ads/config.py +5 -1
- ads/jobs/builders/infrastructure/dsc_job.py +49 -6
- ads/model/datascience_model.py +1 -1
- ads/model/deployment/model_deployment.py +11 -0
- ads/model/model_metadata.py +17 -6
- ads/opctl/operator/lowcode/anomaly/README.md +0 -2
- ads/opctl/operator/lowcode/anomaly/__main__.py +3 -3
- ads/opctl/operator/lowcode/anomaly/environment.yaml +0 -2
- ads/opctl/operator/lowcode/anomaly/model/automlx.py +2 -2
- ads/opctl/operator/lowcode/anomaly/model/autots.py +1 -1
- ads/opctl/operator/lowcode/anomaly/model/base_model.py +13 -17
- ads/opctl/operator/lowcode/anomaly/operator_config.py +2 -0
- ads/opctl/operator/lowcode/anomaly/schema.yaml +1 -2
- ads/opctl/operator/lowcode/anomaly/utils.py +3 -2
- ads/opctl/operator/lowcode/common/transformations.py +2 -1
- ads/opctl/operator/lowcode/common/utils.py +1 -1
- ads/opctl/operator/lowcode/forecast/README.md +1 -3
- ads/opctl/operator/lowcode/forecast/__main__.py +3 -18
- ads/opctl/operator/lowcode/forecast/const.py +2 -0
- ads/opctl/operator/lowcode/forecast/environment.yaml +1 -2
- ads/opctl/operator/lowcode/forecast/model/arima.py +1 -0
- ads/opctl/operator/lowcode/forecast/model/automlx.py +7 -4
- ads/opctl/operator/lowcode/forecast/model/autots.py +1 -0
- ads/opctl/operator/lowcode/forecast/model/base_model.py +38 -22
- ads/opctl/operator/lowcode/forecast/model/factory.py +33 -4
- ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py +15 -1
- ads/opctl/operator/lowcode/forecast/model/ml_forecast.py +234 -0
- ads/opctl/operator/lowcode/forecast/model/neuralprophet.py +9 -1
- ads/opctl/operator/lowcode/forecast/model/prophet.py +1 -0
- ads/opctl/operator/lowcode/forecast/model_evaluator.py +147 -0
- ads/opctl/operator/lowcode/forecast/operator_config.py +2 -1
- ads/opctl/operator/lowcode/forecast/schema.yaml +7 -2
- ads/opctl/operator/lowcode/forecast/utils.py +18 -44
- {oracle_ads-2.11.9.dist-info → oracle_ads-2.11.11.dist-info}/METADATA +9 -12
- {oracle_ads-2.11.9.dist-info → oracle_ads-2.11.11.dist-info}/RECORD +87 -61
- ads/aqua/job.py +0 -29
- {oracle_ads-2.11.9.dist-info → oracle_ads-2.11.11.dist-info}/LICENSE.txt +0 -0
- {oracle_ads-2.11.9.dist-info → oracle_ads-2.11.11.dist-info}/WHEEL +0 -0
- {oracle_ads-2.11.9.dist-info → oracle_ads-2.11.11.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,266 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# Copyright (c) 2024 Oracle and/or its affiliates.
|
4
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
5
|
+
|
6
|
+
"""
|
7
|
+
aqua.model.entities
|
8
|
+
~~~~~~~~~~~~~~~~~~~
|
9
|
+
|
10
|
+
This module contains dataclasses for Aqua Model.
|
11
|
+
"""
|
12
|
+
import re
|
13
|
+
from dataclasses import InitVar, dataclass, field
|
14
|
+
from typing import List, Optional
|
15
|
+
|
16
|
+
import oci
|
17
|
+
|
18
|
+
from ads.aqua import logger
|
19
|
+
from ads.aqua.app import CLIBuilderMixin
|
20
|
+
from ads.aqua.common import utils
|
21
|
+
from ads.aqua.constants import UNKNOWN_VALUE
|
22
|
+
from ads.aqua.data import AquaResourceIdentifier
|
23
|
+
from ads.aqua.model.enums import FineTuningDefinedMetadata
|
24
|
+
from ads.aqua.training.exceptions import exit_code_dict
|
25
|
+
from ads.common.serializer import DataClassSerializable
|
26
|
+
from ads.common.utils import get_log_links
|
27
|
+
from ads.model.datascience_model import DataScienceModel
|
28
|
+
from ads.model.model_metadata import MetadataTaxonomyKeys
|
29
|
+
|
30
|
+
|
31
|
+
@dataclass(repr=False)
|
32
|
+
class FineTuningShapeInfo(DataClassSerializable):
|
33
|
+
instance_shape: str = field(default_factory=str)
|
34
|
+
replica: int = field(default_factory=int)
|
35
|
+
|
36
|
+
|
37
|
+
# TODO: give a better name
|
38
|
+
@dataclass(repr=False)
|
39
|
+
class AquaFineTuneValidation(DataClassSerializable):
|
40
|
+
type: str = "Automatic split"
|
41
|
+
value: str = ""
|
42
|
+
|
43
|
+
|
44
|
+
@dataclass(repr=False)
|
45
|
+
class AquaFineTuningMetric(DataClassSerializable):
|
46
|
+
name: str = field(default_factory=str)
|
47
|
+
category: str = field(default_factory=str)
|
48
|
+
scores: list = field(default_factory=list)
|
49
|
+
|
50
|
+
|
51
|
+
@dataclass(repr=False)
|
52
|
+
class AquaModelLicense(DataClassSerializable):
|
53
|
+
"""Represents the response of Get Model License."""
|
54
|
+
|
55
|
+
id: str = field(default_factory=str)
|
56
|
+
license: str = field(default_factory=str)
|
57
|
+
|
58
|
+
|
59
|
+
@dataclass(repr=False)
|
60
|
+
class AquaModelSummary(DataClassSerializable):
|
61
|
+
"""Represents a summary of Aqua model."""
|
62
|
+
|
63
|
+
compartment_id: str = None
|
64
|
+
icon: str = None
|
65
|
+
id: str = None
|
66
|
+
is_fine_tuned_model: bool = None
|
67
|
+
license: str = None
|
68
|
+
name: str = None
|
69
|
+
organization: str = None
|
70
|
+
project_id: str = None
|
71
|
+
tags: dict = None
|
72
|
+
task: str = None
|
73
|
+
time_created: str = None
|
74
|
+
console_link: str = None
|
75
|
+
search_text: str = None
|
76
|
+
ready_to_deploy: bool = True
|
77
|
+
ready_to_finetune: bool = False
|
78
|
+
ready_to_import: bool = False
|
79
|
+
|
80
|
+
|
81
|
+
@dataclass(repr=False)
|
82
|
+
class AquaModel(AquaModelSummary, DataClassSerializable):
|
83
|
+
"""Represents an Aqua model."""
|
84
|
+
|
85
|
+
model_card: str = None
|
86
|
+
inference_container: str = None
|
87
|
+
finetuning_container: str = None
|
88
|
+
evaluation_container: str = None
|
89
|
+
|
90
|
+
|
91
|
+
@dataclass(repr=False)
|
92
|
+
class HFModelContainerInfo:
|
93
|
+
"""Container defauls for model"""
|
94
|
+
|
95
|
+
inference_container: str = None
|
96
|
+
finetuning_container: str = None
|
97
|
+
|
98
|
+
|
99
|
+
@dataclass(repr=False)
|
100
|
+
class AquaEvalFTCommon(DataClassSerializable):
|
101
|
+
"""Represents common fields for evaluation and fine-tuning."""
|
102
|
+
|
103
|
+
lifecycle_state: str = None
|
104
|
+
lifecycle_details: str = None
|
105
|
+
job: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
|
106
|
+
source: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
|
107
|
+
experiment: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
|
108
|
+
log_group: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
|
109
|
+
log: AquaResourceIdentifier = field(default_factory=AquaResourceIdentifier)
|
110
|
+
|
111
|
+
model: InitVar = None
|
112
|
+
region: InitVar = None
|
113
|
+
jobrun: InitVar = None
|
114
|
+
|
115
|
+
def __post_init__(
|
116
|
+
self, model, region: str, jobrun: oci.data_science.models.JobRun = None
|
117
|
+
):
|
118
|
+
try:
|
119
|
+
log_id = jobrun.log_details.log_id
|
120
|
+
except Exception as e:
|
121
|
+
logger.debug(f"No associated log found. {str(e)}")
|
122
|
+
log_id = ""
|
123
|
+
|
124
|
+
try:
|
125
|
+
loggroup_id = jobrun.log_details.log_group_id
|
126
|
+
except Exception as e:
|
127
|
+
logger.debug(f"No associated loggroup found. {str(e)}")
|
128
|
+
loggroup_id = ""
|
129
|
+
|
130
|
+
loggroup_url = get_log_links(region=region, log_group_id=loggroup_id)
|
131
|
+
log_url = (
|
132
|
+
get_log_links(
|
133
|
+
region=region,
|
134
|
+
log_group_id=loggroup_id,
|
135
|
+
log_id=log_id,
|
136
|
+
compartment_id=jobrun.compartment_id,
|
137
|
+
source_id=jobrun.id,
|
138
|
+
)
|
139
|
+
if jobrun
|
140
|
+
else ""
|
141
|
+
)
|
142
|
+
|
143
|
+
log_name = None
|
144
|
+
loggroup_name = None
|
145
|
+
|
146
|
+
if log_id:
|
147
|
+
try:
|
148
|
+
log = utils.query_resource(log_id, return_all=False)
|
149
|
+
log_name = log.display_name if log else ""
|
150
|
+
except:
|
151
|
+
pass
|
152
|
+
|
153
|
+
if loggroup_id:
|
154
|
+
try:
|
155
|
+
loggroup = utils.query_resource(loggroup_id, return_all=False)
|
156
|
+
loggroup_name = loggroup.display_name if loggroup else ""
|
157
|
+
except:
|
158
|
+
pass
|
159
|
+
|
160
|
+
experiment_id, experiment_name = utils._get_experiment_info(model)
|
161
|
+
|
162
|
+
self.log_group = AquaResourceIdentifier(
|
163
|
+
loggroup_id, loggroup_name, loggroup_url
|
164
|
+
)
|
165
|
+
self.log = AquaResourceIdentifier(log_id, log_name, log_url)
|
166
|
+
self.experiment = utils._build_resource_identifier(
|
167
|
+
id=experiment_id, name=experiment_name, region=region
|
168
|
+
)
|
169
|
+
self.job = utils._build_job_identifier(job_run_details=jobrun, region=region)
|
170
|
+
self.lifecycle_details = (
|
171
|
+
utils.LIFECYCLE_DETAILS_MISSING_JOBRUN
|
172
|
+
if not jobrun
|
173
|
+
else jobrun.lifecycle_details
|
174
|
+
)
|
175
|
+
|
176
|
+
|
177
|
+
@dataclass(repr=False)
|
178
|
+
class AquaFineTuneModel(AquaModel, AquaEvalFTCommon, DataClassSerializable):
|
179
|
+
"""Represents an Aqua Fine Tuned Model."""
|
180
|
+
|
181
|
+
dataset: str = field(default_factory=str)
|
182
|
+
validation: AquaFineTuneValidation = field(default_factory=AquaFineTuneValidation)
|
183
|
+
shape_info: FineTuningShapeInfo = field(default_factory=FineTuningShapeInfo)
|
184
|
+
metrics: List[AquaFineTuningMetric] = field(default_factory=list)
|
185
|
+
|
186
|
+
def __post_init__(
|
187
|
+
self,
|
188
|
+
model: DataScienceModel,
|
189
|
+
region: str,
|
190
|
+
jobrun: oci.data_science.models.JobRun = None,
|
191
|
+
):
|
192
|
+
super().__post_init__(model=model, region=region, jobrun=jobrun)
|
193
|
+
|
194
|
+
if jobrun is not None:
|
195
|
+
jobrun_env_vars = (
|
196
|
+
jobrun.job_configuration_override_details.environment_variables or {}
|
197
|
+
)
|
198
|
+
self.shape_info = FineTuningShapeInfo(
|
199
|
+
instance_shape=jobrun.job_infrastructure_configuration_details.shape_name,
|
200
|
+
# TODO: use variable for `NODE_COUNT` in ads/jobs/builders/runtimes/base.py
|
201
|
+
replica=jobrun_env_vars.get("NODE_COUNT", UNKNOWN_VALUE),
|
202
|
+
)
|
203
|
+
|
204
|
+
try:
|
205
|
+
model_hyperparameters = model.defined_metadata_list.get(
|
206
|
+
MetadataTaxonomyKeys.HYPERPARAMETERS
|
207
|
+
).value
|
208
|
+
except Exception as e:
|
209
|
+
logger.debug(
|
210
|
+
f"Failed to extract model hyperparameters from {model.id}: " f"{str(e)}"
|
211
|
+
)
|
212
|
+
model_hyperparameters = {}
|
213
|
+
|
214
|
+
self.dataset = model_hyperparameters.get(
|
215
|
+
FineTuningDefinedMetadata.TRAINING_DATA
|
216
|
+
)
|
217
|
+
if not self.dataset:
|
218
|
+
logger.debug(
|
219
|
+
f"Key={FineTuningDefinedMetadata.TRAINING_DATA} not found in model hyperparameters."
|
220
|
+
)
|
221
|
+
|
222
|
+
self.validation = AquaFineTuneValidation(
|
223
|
+
value=model_hyperparameters.get(FineTuningDefinedMetadata.VAL_SET_SIZE)
|
224
|
+
)
|
225
|
+
if not self.validation:
|
226
|
+
logger.debug(
|
227
|
+
f"Key={FineTuningDefinedMetadata.VAL_SET_SIZE} not found in model hyperparameters."
|
228
|
+
)
|
229
|
+
|
230
|
+
if self.lifecycle_details:
|
231
|
+
self.lifecycle_details = self._extract_job_lifecycle_details(
|
232
|
+
self.lifecycle_details
|
233
|
+
)
|
234
|
+
|
235
|
+
def _extract_job_lifecycle_details(self, lifecycle_details):
|
236
|
+
message = lifecycle_details
|
237
|
+
try:
|
238
|
+
# Extract exit code
|
239
|
+
match = re.search(r"exit code (\d+)", lifecycle_details)
|
240
|
+
if match:
|
241
|
+
exit_code = int(match.group(1))
|
242
|
+
if exit_code == 1:
|
243
|
+
return message
|
244
|
+
# Match exit code to message
|
245
|
+
exception = exit_code_dict().get(
|
246
|
+
exit_code,
|
247
|
+
lifecycle_details,
|
248
|
+
)
|
249
|
+
message = f"{exception.reason} (exit code {exit_code})"
|
250
|
+
except:
|
251
|
+
pass
|
252
|
+
|
253
|
+
return message
|
254
|
+
|
255
|
+
|
256
|
+
@dataclass
|
257
|
+
class ImportModelDetails(CLIBuilderMixin):
|
258
|
+
model: str
|
259
|
+
os_path: str
|
260
|
+
inference_container: Optional[str] = None
|
261
|
+
finetuning_container: Optional[str] = None
|
262
|
+
compartment_id: Optional[str] = None
|
263
|
+
project_id: Optional[str] = None
|
264
|
+
|
265
|
+
def __post_init__(self):
|
266
|
+
self._command = "model register"
|
ads/aqua/model/enums.py
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# Copyright (c) 2024 Oracle and/or its affiliates.
|
4
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
5
|
+
from ads.common.extended_enum import ExtendedEnumMeta
|
6
|
+
|
7
|
+
|
8
|
+
class FineTuningDefinedMetadata(str, metaclass=ExtendedEnumMeta):
|
9
|
+
"""Represents the defined metadata keys used in Fine Tuning."""
|
10
|
+
|
11
|
+
VAL_SET_SIZE = "val_set_size"
|
12
|
+
TRAINING_DATA = "training_data"
|
13
|
+
|
14
|
+
|
15
|
+
class FineTuningCustomMetadata(str, metaclass=ExtendedEnumMeta):
|
16
|
+
"""Represents the custom metadata keys used in Fine Tuning."""
|
17
|
+
|
18
|
+
FT_SOURCE = "fine_tune_source"
|
19
|
+
FT_SOURCE_NAME = "fine_tune_source_name"
|
20
|
+
FT_OUTPUT_PATH = "fine_tune_output_path"
|
21
|
+
FT_JOB_ID = "fine_tune_job_id"
|
22
|
+
FT_JOB_RUN_ID = "fine_tune_jobrun_id"
|
23
|
+
TRAINING_METRICS_FINAL = "train_metrics_final"
|
24
|
+
VALIDATION_METRICS_FINAL = "val_metrics_final"
|
25
|
+
TRAINING_METRICS_EPOCH = "train_metrics_epoch"
|
26
|
+
VALIDATION_METRICS_EPOCH = "val_metrics_epoch"
|