oracle-ads 2.11.8__py3-none-any.whl → 2.11.10__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.
Files changed (87) hide show
  1. ads/aqua/__init__.py +1 -1
  2. ads/aqua/{base.py → app.py} +27 -7
  3. ads/aqua/cli.py +59 -17
  4. ads/aqua/common/__init__.py +5 -0
  5. ads/aqua/{decorator.py → common/decorator.py} +14 -8
  6. ads/aqua/common/enums.py +69 -0
  7. ads/aqua/{exception.py → common/errors.py} +28 -0
  8. ads/aqua/{utils.py → common/utils.py} +171 -79
  9. ads/aqua/config/config.py +18 -0
  10. ads/aqua/constants.py +51 -33
  11. ads/aqua/data.py +15 -26
  12. ads/aqua/evaluation/__init__.py +8 -0
  13. ads/aqua/evaluation/constants.py +53 -0
  14. ads/aqua/evaluation/entities.py +170 -0
  15. ads/aqua/evaluation/errors.py +71 -0
  16. ads/aqua/{evaluation.py → evaluation/evaluation.py} +122 -370
  17. ads/aqua/extension/__init__.py +2 -0
  18. ads/aqua/extension/aqua_ws_msg_handler.py +97 -0
  19. ads/aqua/extension/base_handler.py +0 -7
  20. ads/aqua/extension/common_handler.py +12 -6
  21. ads/aqua/extension/deployment_handler.py +70 -4
  22. ads/aqua/extension/errors.py +10 -0
  23. ads/aqua/extension/evaluation_handler.py +5 -3
  24. ads/aqua/extension/evaluation_ws_msg_handler.py +43 -0
  25. ads/aqua/extension/finetune_handler.py +41 -3
  26. ads/aqua/extension/model_handler.py +56 -4
  27. ads/aqua/extension/models/__init__.py +0 -0
  28. ads/aqua/extension/models/ws_models.py +69 -0
  29. ads/aqua/extension/ui_handler.py +65 -4
  30. ads/aqua/extension/ui_websocket_handler.py +124 -0
  31. ads/aqua/extension/utils.py +1 -1
  32. ads/aqua/finetuning/__init__.py +7 -0
  33. ads/aqua/finetuning/constants.py +17 -0
  34. ads/aqua/finetuning/entities.py +102 -0
  35. ads/aqua/{finetune.py → finetuning/finetuning.py} +162 -136
  36. ads/aqua/model/__init__.py +8 -0
  37. ads/aqua/model/constants.py +46 -0
  38. ads/aqua/model/entities.py +266 -0
  39. ads/aqua/model/enums.py +26 -0
  40. ads/aqua/{model.py → model/model.py} +401 -309
  41. ads/aqua/modeldeployment/__init__.py +8 -0
  42. ads/aqua/modeldeployment/constants.py +26 -0
  43. ads/aqua/{deployment.py → modeldeployment/deployment.py} +288 -227
  44. ads/aqua/modeldeployment/entities.py +142 -0
  45. ads/aqua/modeldeployment/inference.py +75 -0
  46. ads/aqua/ui.py +88 -8
  47. ads/cli.py +55 -7
  48. ads/common/serializer.py +2 -2
  49. ads/config.py +2 -1
  50. ads/jobs/builders/infrastructure/dsc_job.py +49 -6
  51. ads/model/datascience_model.py +21 -1
  52. ads/model/deployment/model_deployment.py +11 -0
  53. ads/model/model_metadata.py +17 -6
  54. ads/opctl/operator/lowcode/anomaly/README.md +0 -2
  55. ads/opctl/operator/lowcode/anomaly/__main__.py +3 -3
  56. ads/opctl/operator/lowcode/anomaly/environment.yaml +0 -2
  57. ads/opctl/operator/lowcode/anomaly/model/automlx.py +2 -2
  58. ads/opctl/operator/lowcode/anomaly/model/autots.py +1 -1
  59. ads/opctl/operator/lowcode/anomaly/model/base_model.py +13 -17
  60. ads/opctl/operator/lowcode/anomaly/operator_config.py +2 -0
  61. ads/opctl/operator/lowcode/anomaly/schema.yaml +1 -2
  62. ads/opctl/operator/lowcode/anomaly/utils.py +3 -2
  63. ads/opctl/operator/lowcode/common/transformations.py +2 -1
  64. ads/opctl/operator/lowcode/common/utils.py +1 -1
  65. ads/opctl/operator/lowcode/forecast/README.md +1 -3
  66. ads/opctl/operator/lowcode/forecast/__main__.py +3 -18
  67. ads/opctl/operator/lowcode/forecast/const.py +2 -0
  68. ads/opctl/operator/lowcode/forecast/environment.yaml +1 -2
  69. ads/opctl/operator/lowcode/forecast/model/arima.py +1 -0
  70. ads/opctl/operator/lowcode/forecast/model/automlx.py +7 -4
  71. ads/opctl/operator/lowcode/forecast/model/autots.py +1 -0
  72. ads/opctl/operator/lowcode/forecast/model/base_model.py +38 -22
  73. ads/opctl/operator/lowcode/forecast/model/factory.py +33 -4
  74. ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py +15 -1
  75. ads/opctl/operator/lowcode/forecast/model/ml_forecast.py +234 -0
  76. ads/opctl/operator/lowcode/forecast/model/neuralprophet.py +9 -1
  77. ads/opctl/operator/lowcode/forecast/model/prophet.py +1 -0
  78. ads/opctl/operator/lowcode/forecast/model_evaluator.py +147 -0
  79. ads/opctl/operator/lowcode/forecast/operator_config.py +2 -1
  80. ads/opctl/operator/lowcode/forecast/schema.yaml +7 -2
  81. ads/opctl/operator/lowcode/forecast/utils.py +18 -44
  82. {oracle_ads-2.11.8.dist-info → oracle_ads-2.11.10.dist-info}/METADATA +9 -12
  83. {oracle_ads-2.11.8.dist-info → oracle_ads-2.11.10.dist-info}/RECORD +86 -61
  84. ads/aqua/job.py +0 -29
  85. {oracle_ads-2.11.8.dist-info → oracle_ads-2.11.10.dist-info}/LICENSE.txt +0 -0
  86. {oracle_ads-2.11.8.dist-info → oracle_ads-2.11.10.dist-info}/WHEEL +0 -0
  87. {oracle_ads-2.11.8.dist-info → oracle_ads-2.11.10.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"
@@ -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"