Skip to content

Commit c8526cc

Browse files
Aqua v1.0.1 release (#803)
2 parents 5862c24 + 556512c commit c8526cc

29 files changed

+928
-254
lines changed

ads/aqua/__init__.py

+24-14
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,35 @@
44
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
55

66

7-
import logging
8-
import sys
97
import os
8+
9+
from ads import logger, set_auth
1010
from ads.aqua.utils import fetch_service_compartment
1111
from ads.config import OCI_RESOURCE_PRINCIPAL_VERSION
12-
from ads import set_auth
1312

14-
logger = logging.getLogger(__name__)
15-
handler = logging.StreamHandler(sys.stdout)
16-
logger.setLevel(logging.INFO)
13+
ENV_VAR_LOG_LEVEL = "ADS_AQUA_LOG_LEVEL"
14+
15+
16+
def get_logger_level():
17+
"""Retrieves logging level from environment variable `ADS_AQUA_LOG_LEVEL`."""
18+
level = os.environ.get(ENV_VAR_LOG_LEVEL, "INFO").upper()
19+
return level
20+
21+
22+
logger.setLevel(get_logger_level())
23+
24+
25+
def set_log_level(log_level: str):
26+
"""Global for setting logging level."""
27+
28+
log_level = log_level.upper()
29+
logger.setLevel(log_level.upper())
30+
logger.handlers[0].setLevel(log_level)
31+
1732

1833
if OCI_RESOURCE_PRINCIPAL_VERSION:
1934
set_auth("resource_principal")
2035

21-
ODSC_MODEL_COMPARTMENT_OCID = os.environ.get("ODSC_MODEL_COMPARTMENT_OCID")
22-
if not ODSC_MODEL_COMPARTMENT_OCID:
23-
try:
24-
ODSC_MODEL_COMPARTMENT_OCID = fetch_service_compartment()
25-
except Exception as e:
26-
logger.error(
27-
f"ODSC_MODEL_COMPARTMENT_OCID environment variable is not set for Aqua, due to {e}."
28-
)
36+
ODSC_MODEL_COMPARTMENT_OCID = (
37+
os.environ.get("ODSC_MODEL_COMPARTMENT_OCID") or fetch_service_compartment()
38+
)

ads/aqua/base.py

-2
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,6 @@ 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
168166
try:
169167
model_version_set = ModelVersionSet.from_name(
170168
name=model_version_set_name,

ads/aqua/cli.py

+50-2
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,65 @@
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
7+
import sys
68

9+
from ads.aqua import (
10+
ENV_VAR_LOG_LEVEL,
11+
set_log_level,
12+
ODSC_MODEL_COMPARTMENT_OCID,
13+
logger,
14+
)
715
from ads.aqua.deployment import AquaDeploymentApp
16+
from ads.aqua.evaluation import AquaEvaluationApp
817
from ads.aqua.finetune import AquaFineTuningApp
918
from ads.aqua.model import AquaModelApp
10-
from ads.aqua.evaluation import AquaEvaluationApp
19+
from ads.config import NB_SESSION_OCID
20+
from ads.common.utils import LOG_LEVELS
1121

1222

1323
class AquaCommand:
14-
"""Contains the command groups for project Aqua."""
24+
"""Contains the command groups for project Aqua.
25+
26+
Acts as an entry point for managing different components of the Aqua
27+
project including model management, fine-tuning, deployment, and
28+
evaluation.
29+
"""
1530

1631
model = AquaModelApp
1732
fine_tuning = AquaFineTuningApp
1833
deployment = AquaDeploymentApp
1934
evaluation = AquaEvaluationApp
35+
36+
def __init__(
37+
self,
38+
log_level: str = os.environ.get(ENV_VAR_LOG_LEVEL, "ERROR").upper(),
39+
):
40+
"""
41+
Initialize the command line interface settings for the Aqua project.
42+
43+
FLAGS
44+
-----
45+
log_level (str):
46+
Sets the logging level for the application.
47+
Default is retrieved from environment variable `LOG_LEVEL`,
48+
or 'ERROR' if not set. Example values include 'DEBUG', 'INFO',
49+
'WARNING', 'ERROR', and 'CRITICAL'.
50+
"""
51+
if log_level.upper() not in LOG_LEVELS:
52+
logger.error(
53+
f"Log level should be one of {LOG_LEVELS}. Setting default to ERROR."
54+
)
55+
log_level = "ERROR"
56+
set_log_level(log_level)
57+
# gracefully exit if env var is not set
58+
if not ODSC_MODEL_COMPARTMENT_OCID:
59+
logger.debug(
60+
"ODSC_MODEL_COMPARTMENT_OCID environment variable is not set for Aqua."
61+
)
62+
if NB_SESSION_OCID:
63+
logger.error(
64+
f"Aqua is not available for the notebook session {NB_SESSION_OCID}. For more information, "
65+
f"please refer to the documentation."
66+
)
67+
sys.exit(1)

ads/aqua/decorator.py

+8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
RequestException,
1818
ServiceError,
1919
)
20+
from tornado.web import HTTPError
2021

2122
from ads.aqua.exception import AquaError
2223
from ads.aqua.extension.base_handler import AquaAPIhandler
@@ -58,6 +59,7 @@ def inner_function(self: AquaAPIhandler, *args, **kwargs):
5859
except ServiceError as error:
5960
self.write_error(
6061
status_code=error.status or 500,
62+
message=error.message,
6163
reason=error.message,
6264
service_payload=error.args[0] if error.args else None,
6365
exc_info=sys.exc_info(),
@@ -91,6 +93,12 @@ def inner_function(self: AquaAPIhandler, *args, **kwargs):
9193
service_payload=error.service_payload,
9294
exc_info=sys.exc_info(),
9395
)
96+
except HTTPError as e:
97+
self.write_error(
98+
status_code=e.status_code,
99+
reason=e.log_message,
100+
exc_info=sys.exc_info(),
101+
)
94102
except Exception as ex:
95103
self.write_error(
96104
status_code=500,

ads/aqua/deployment.py

+37-34
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
UNKNOWN_DICT,
2323
get_resource_name,
2424
get_model_by_reference_paths,
25+
get_ocid_substring,
26+
AQUA_MODEL_TYPE_SERVICE,
27+
AQUA_MODEL_TYPE_CUSTOM,
2528
)
2629
from ads.aqua.finetune import FineTuneCustomMetadata
2730
from ads.aqua.data import AquaResourceIdentifier
@@ -391,40 +394,27 @@ def create(
391394
.with_runtime(container_runtime)
392395
).deploy(wait_for_completion=False)
393396

394-
if is_fine_tuned_model:
395-
# tracks unique deployments that were created in the user compartment
396-
self.telemetry.record_event_async(
397-
category="aqua/custom/deployment", action="create", detail=model_name
398-
)
399-
# tracks the shape used for deploying the custom models
400-
self.telemetry.record_event_async(
401-
category="aqua/custom/deployment/create",
402-
action="shape",
403-
detail=instance_shape,
404-
)
405-
# tracks the shape used for deploying the custom models by name
406-
self.telemetry.record_event_async(
407-
category=f"aqua/custom/{model_name}/deployment/create",
408-
action="shape",
409-
detail=instance_shape,
410-
)
411-
else:
412-
# tracks unique deployments that were created in the user compartment
413-
self.telemetry.record_event_async(
414-
category="aqua/service/deployment", action="create", detail=model_name
415-
)
416-
# tracks the shape used for deploying the service models
417-
self.telemetry.record_event_async(
418-
category="aqua/service/deployment/create",
419-
action="shape",
420-
detail=instance_shape,
421-
)
422-
# tracks the shape used for deploying the service models by name
423-
self.telemetry.record_event_async(
424-
category=f"aqua/service/{model_name}/deployment/create",
425-
action="shape",
426-
detail=instance_shape,
427-
)
397+
model_type = (
398+
AQUA_MODEL_TYPE_CUSTOM if is_fine_tuned_model else AQUA_MODEL_TYPE_SERVICE
399+
)
400+
deployment_id = deployment.dsc_model_deployment.id
401+
# we arbitrarily choose last 8 characters of OCID to identify MD in telemetry
402+
telemetry_kwargs = {"ocid": get_ocid_substring(deployment_id, key_len=8)}
403+
404+
# tracks unique deployments that were created in the user compartment
405+
self.telemetry.record_event_async(
406+
category=f"aqua/{model_type}/deployment",
407+
action="create",
408+
detail=model_name,
409+
**telemetry_kwargs,
410+
)
411+
# tracks the shape used for deploying the custom or service models by name
412+
self.telemetry.record_event_async(
413+
category=f"aqua/{model_type}/deployment/create",
414+
action="shape",
415+
detail=instance_shape,
416+
value=model_name,
417+
)
428418

429419
return AquaDeployment.from_oci_model_deployment(
430420
deployment.dsc_model_deployment, self.region
@@ -471,6 +461,19 @@ def list(self, **kwargs) -> List["AquaDeployment"]:
471461
)
472462
)
473463

464+
# log telemetry if MD is in active or failed state
465+
deployment_id = model_deployment.id
466+
state = model_deployment.lifecycle_state.upper()
467+
if state in ["ACTIVE", "FAILED"]:
468+
# tracks unique deployments that were listed in the user compartment
469+
# we arbitrarily choose last 8 characters of OCID to identify MD in telemetry
470+
self.telemetry.record_event_async(
471+
category=f"aqua/deployment",
472+
action="list",
473+
detail=get_ocid_substring(deployment_id, key_len=8),
474+
value=state,
475+
)
476+
474477
# tracks number of times deployment listing was called
475478
self.telemetry.record_event_async(category="aqua/deployment", action="list")
476479

0 commit comments

Comments
 (0)