Skip to content

Commit 75fffad

Browse files
Merge branch 'feature/aquav1.0.1' into update_telemetry_for_model_shapes
2 parents 3d28514 + 09e6dc3 commit 75fffad

File tree

11 files changed

+262
-58
lines changed

11 files changed

+262
-58
lines changed

ads/aqua/__init__.py

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,58 @@
55

66

77
import logging
8-
import sys
98
import os
9+
import sys
10+
11+
from ads import set_auth
1012
from ads.aqua.utils import fetch_service_compartment
1113
from ads.config import NB_SESSION_OCID, OCI_RESOURCE_PRINCIPAL_VERSION
12-
from ads import set_auth
1314

14-
logger = logging.getLogger(__name__)
15-
handler = logging.StreamHandler(sys.stdout)
16-
logger.setLevel(logging.INFO)
15+
ENV_VAR_LOG_LEVEL = "ADS_AQUA_LOG_LEVEL"
16+
17+
18+
def get_logger_level():
19+
"""Retrieves logging level from environment variable `LOG_LEVEL`."""
20+
level = os.environ.get(ENV_VAR_LOG_LEVEL, "INFO").upper()
21+
return level
22+
23+
24+
def configure_aqua_logger():
25+
"""Configures the AQUA logger."""
26+
log_level = get_logger_level()
27+
logger = logging.getLogger(__name__)
28+
logger.setLevel(log_level)
29+
30+
handler = logging.StreamHandler(sys.stdout)
31+
formatter = logging.Formatter(
32+
"%(asctime)s - %(name)s.%(module)s - %(levelname)s - %(message)s"
33+
)
34+
handler.setFormatter(formatter)
35+
handler.setLevel(log_level)
36+
37+
logger.addHandler(handler)
38+
logger.propagate = False
39+
return logger
40+
41+
42+
logger = configure_aqua_logger()
43+
44+
45+
def set_log_level(log_level: str):
46+
"""Global for setting logging level."""
47+
48+
log_level = log_level.upper()
49+
logger.setLevel(log_level.upper())
50+
logger.handlers[0].setLevel(log_level)
51+
1752

1853
if OCI_RESOURCE_PRINCIPAL_VERSION:
1954
set_auth("resource_principal")
2055

21-
ODSC_MODEL_COMPARTMENT_OCID = os.environ.get("ODSC_MODEL_COMPARTMENT_OCID")
56+
ODSC_MODEL_COMPARTMENT_OCID = (
57+
os.environ.get("ODSC_MODEL_COMPARTMENT_OCID") or fetch_service_compartment()
58+
)
2259
if not ODSC_MODEL_COMPARTMENT_OCID:
23-
try:
24-
ODSC_MODEL_COMPARTMENT_OCID = fetch_service_compartment()
25-
except:
26-
pass
27-
28-
if not ODSC_MODEL_COMPARTMENT_OCID:
29-
logger.error(
30-
f"ODSC_MODEL_COMPARTMENT_OCID environment variable is not set for Aqua."
31-
)
3260
if NB_SESSION_OCID:
3361
logger.error(
3462
f"Aqua is not available for this notebook session {NB_SESSION_OCID}."

ads/aqua/base.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
get_artifact_path,
2020
is_valid_ocid,
2121
load_config,
22-
logger,
2322
)
2423
from ads.common import oci_client as oc
2524
from ads.common.auth import default_signer
@@ -164,7 +163,7 @@ def create_model_version_set(
164163
tag = Tags.AQUA_FINE_TUNING.value
165164

166165
if not model_version_set_id:
167-
tag = Tags.AQUA_FINE_TUNING.value # TODO: Fix this
166+
tag = Tags.AQUA_FINE_TUNING.value # TODO: Fix this
168167
try:
169168
model_version_set = ModelVersionSet.from_name(
170169
name=model_version_set_name,

ads/aqua/cli.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,41 @@
33

44
# Copyright (c) 2024 Oracle and/or its affiliates.
55
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
6+
import os
67

8+
from ads.aqua import ENV_VAR_LOG_LEVEL, set_log_level
79
from ads.aqua.deployment import AquaDeploymentApp
10+
from ads.aqua.evaluation import AquaEvaluationApp
811
from ads.aqua.finetune import AquaFineTuningApp
912
from ads.aqua.model import AquaModelApp
10-
from ads.aqua.evaluation import AquaEvaluationApp
1113

1214

1315
class AquaCommand:
14-
"""Contains the command groups for project Aqua."""
16+
"""Contains the command groups for project Aqua.
17+
18+
Acts as an entry point for managing different components of the Aqua
19+
project including model management, fine-tuning, deployment, and
20+
evaluation.
21+
"""
1522

1623
model = AquaModelApp
1724
fine_tuning = AquaFineTuningApp
1825
deployment = AquaDeploymentApp
1926
evaluation = AquaEvaluationApp
27+
28+
def __init__(
29+
self,
30+
log_level: str = os.environ.get(ENV_VAR_LOG_LEVEL, "ERROR").upper(),
31+
):
32+
"""
33+
Initialize the command line interface settings for the Aqua project.
34+
35+
FLAGS
36+
-----
37+
log_level (str):
38+
Sets the logging level for the application.
39+
Default is retrieved from environment variable `LOG_LEVEL`,
40+
or 'ERROR' if not set. Example values include 'DEBUG', 'INFO',
41+
'WARNING', 'ERROR', and 'CRITICAL'.
42+
"""
43+
set_log_level(log_level)

ads/aqua/evaluation.py

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
JOB_INFRASTRUCTURE_TYPE_DEFAULT_NETWORKING,
3939
NB_SESSION_IDENTIFIER,
4040
UNKNOWN,
41+
extract_id_and_name_from_tag,
4142
fire_and_forget,
4243
get_container_image,
4344
is_valid_ocid,
@@ -694,7 +695,7 @@ def create(
694695
self.telemetry.record_event_async(
695696
category="aqua/evaluation",
696697
action="create",
697-
detail=evaluation_source.display_name,
698+
detail=self._get_service_model_name(evaluation_source),
698699
)
699700

700701
return AquaEvaluationSummary(
@@ -784,6 +785,34 @@ def _build_evaluation_runtime(
784785
)
785786

786787
return runtime
788+
789+
@staticmethod
790+
def _get_service_model_name(
791+
source: Union[ModelDeployment, DataScienceModel]
792+
) -> str:
793+
"""Gets the service model name from source. If it's ModelDeployment, needs to check
794+
if its model has been fine tuned or not.
795+
796+
Parameters
797+
----------
798+
source: Union[ModelDeployment, DataScienceModel]
799+
An instance of either ModelDeployment or DataScienceModel
800+
801+
Returns
802+
-------
803+
str:
804+
The service model name of source.
805+
"""
806+
if isinstance(source, ModelDeployment):
807+
fine_tuned_model_tag = source.freeform_tags.get(
808+
Tags.AQUA_FINE_TUNED_MODEL_TAG.value, UNKNOWN
809+
)
810+
if not fine_tuned_model_tag:
811+
return source.freeform_tags.get(Tags.AQUA_MODEL_NAME_TAG.value)
812+
else:
813+
return extract_id_and_name_from_tag(fine_tuned_model_tag)[1]
814+
815+
return source.display_name
787816

788817
@staticmethod
789818
def _get_evaluation_container(source_id: str) -> str:
@@ -983,7 +1012,7 @@ def list(
9831012
self._process_evaluation_summary(model=model, jobrun=jobrun)
9841013
)
9851014
except Exception as exc:
986-
logger.error(
1015+
logger.debug(
9871016
f"Processing evaluation: {model.identifier} generated an exception: {exc}"
9881017
)
9891018
evaluations.append(
@@ -1028,7 +1057,7 @@ def _if_eval_artifact_exist(
10281057
return True if response.status == 200 else False
10291058
except oci.exceptions.ServiceError as ex:
10301059
if ex.status == 404:
1031-
logger.info("Evaluation artifact not found.")
1060+
logger.debug(f"Evaluation artifact not found for {model.identifier}.")
10321061
return False
10331062

10341063
@telemetry(entry_point="plugin=evaluation&action=get_status", name="aqua")
@@ -1574,8 +1603,9 @@ def _build_resource_identifier(
15741603
),
15751604
)
15761605
except Exception as e:
1577-
logger.error(
1578-
f"Failed to construct AquaResourceIdentifier from given id=`{id}`, and name=`{name}`, {str(e)}"
1606+
logger.debug(
1607+
f"Failed to construct AquaResourceIdentifier from given id=`{id}`, and name=`{name}`. "
1608+
f"DEBUG INFO: {str(e)}"
15791609
)
15801610
return AquaResourceIdentifier()
15811611

@@ -1621,7 +1651,7 @@ def _fetch_runtime_params(
16211651
)
16221652
if not params.get(EvaluationConfig.PARAMS):
16231653
raise AquaMissingKeyError(
1624-
"model parameters have not been saved in correct format in model taxonomy.",
1654+
"model parameters have not been saved in correct format in model taxonomy. ",
16251655
service_payload={"params": params},
16261656
)
16271657
# TODO: validate the format of parameters.
@@ -1653,7 +1683,7 @@ def _build_job_identifier(
16531683

16541684
except Exception as e:
16551685
logger.debug(
1656-
f"Failed to get job details from job_run_details: {job_run_details}"
1686+
f"Failed to get job details from job_run_details: {job_run_details} "
16571687
f"DEBUG INFO:{str(e)}"
16581688
)
16591689
return AquaResourceIdentifier()

ads/aqua/extension/common_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ads.aqua.decorator import handle_exceptions
1111
from ads.aqua.exception import AquaResourceAccessError
1212
from ads.aqua.extension.base_handler import AquaAPIhandler
13-
from ads.aqua.utils import known_realm
13+
from ads.aqua.utils import known_realm, fetch_service_compartment
1414

1515

1616
class ADSVersionHandler(AquaAPIhandler):
@@ -39,7 +39,7 @@ def get(self):
3939
AquaResourceAccessError: raised when aqua is not accessible in the given session/region.
4040
4141
"""
42-
if ODSC_MODEL_COMPARTMENT_OCID:
42+
if ODSC_MODEL_COMPARTMENT_OCID or fetch_service_compartment():
4343
return self.finish(dict(status="ok"))
4444
elif known_realm():
4545
return self.finish(dict(status="compatible"))

ads/aqua/finetune.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
UpdateModelProvenanceDetails,
1616
)
1717

18-
from ads.aqua import ODSC_MODEL_COMPARTMENT_OCID
18+
from ads.aqua import ODSC_MODEL_COMPARTMENT_OCID, logger
1919
from ads.aqua.base import AquaApp
2020
from ads.aqua.data import AquaResourceIdentifier, Resource, Tags
2121
from ads.aqua.exception import AquaFileExistsError, AquaValueError
@@ -29,7 +29,6 @@
2929
UNKNOWN,
3030
UNKNOWN_DICT,
3131
get_container_image,
32-
logger,
3332
upload_local_to_os,
3433
)
3534
from ads.common.auth import default_signer
@@ -470,6 +469,7 @@ def create(
470469
**telemetry_kwargs,
471470
)
472471
# tracks unique fine-tuned models that were created in the user compartment
472+
# TODO: retrieve the service model name for FT custom models.
473473
self.telemetry.record_event_async(
474474
category="aqua/service/finetune",
475475
action="create",

ads/aqua/model.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from cachetools import TTLCache
1515
from oci.data_science.models import JobRun, Model
1616

17-
from ads.aqua import logger, utils
17+
from ads.aqua import ODSC_MODEL_COMPARTMENT_OCID, logger, utils
1818
from ads.aqua.base import AquaApp
1919
from ads.aqua.constants import (
2020
TRAINING_METRICS_FINAL,
@@ -26,7 +26,6 @@
2626
)
2727
from ads.aqua.data import AquaResourceIdentifier, Tags
2828
from ads.aqua.exception import AquaRuntimeError
29-
3029
from ads.aqua.training.exceptions import exit_code_dict
3130
from ads.aqua.utils import (
3231
LICENSE_TXT,
@@ -50,7 +49,6 @@
5049
PROJECT_OCID,
5150
TENANCY_OCID,
5251
)
53-
from ads.aqua import ODSC_MODEL_COMPARTMENT_OCID
5452
from ads.model import DataScienceModel
5553
from ads.model.model_metadata import MetadataTaxonomyKeys, ModelCustomMetadata
5654
from ads.telemetry import telemetry
@@ -228,7 +226,7 @@ def __post_init__(
228226
).value
229227
except Exception as e:
230228
logger.debug(
231-
f"Failed to extract model hyperparameters from {model.id}:" f"{str(e)}"
229+
f"Failed to extract model hyperparameters from {model.id}: " f"{str(e)}"
232230
)
233231
model_hyperparameters = {}
234232

0 commit comments

Comments
 (0)