Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 38 additions & 22 deletions ads/aqua/modeldeployment/entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -511,28 +511,34 @@ def validate_input_models(self, model_details: Dict[str, DataScienceModel]) -> N

if not base_model:
logger.error(
"Validation failed: Base model ID '%s' not found.", base_model_id
"Validation failed: Base model '%s' (id: '%s') not found.",
model.model_name,
base_model_id,
)
raise ConfigValidationError(
f"Model not found: '{model.model_name}' (id: '{base_model_id}')."
)
raise ConfigValidationError(f"Model not found: '{base_model_id}'.")

if Tags.AQUA_FINE_TUNED_MODEL_TAG in (base_model.freeform_tags or {}):
logger.error(
"Validation failed: Base model ID '%s' is a fine-tuned model.",
"Validation failed: Base model '%s' (id: '%s') is a fine-tuned model.",
base_model.display_name,
base_model_id,
)
raise ConfigValidationError(
f"Invalid base model ID '{base_model_id}'. "
f"Invalid base model '{base_model.display_name}' (id: '{base_model_id}'). "
"Specify a base model OCID in the `models` input, not a fine-tuned model."
)

if base_model.lifecycle_state != "ACTIVE":
logger.error(
"Validation failed: Base model '%s' is in state '%s'.",
"Validation failed: Base model '%s' (id: '%s') is in state '%s'.",
base_model.display_name,
base_model_id,
base_model.lifecycle_state,
)
raise ConfigValidationError(
f"Invalid base model ID '{base_model_id}': must be in ACTIVE state."
f"Invalid base model '{base_model.display_name}' (id: '{base_model_id}'): must be in ACTIVE state."
)

# Normalize and validate model name uniqueness
Expand All @@ -548,31 +554,34 @@ def validate_input_models(self, model_details: Dict[str, DataScienceModel]) -> N

if not ft_model:
logger.error(
"Validation failed: Fine-tuned model ID '%s' not found.",
"Validation failed: Fine-tuned model '%s' (id: '%s') not found.",
lora_module.model_name,
ft_model_id,
)
raise ConfigValidationError(
f"Fine-tuned model not found: '{ft_model_id}'."
f"Fine-tuned model not found: '{lora_module.model_name}' (id: '{ft_model_id}')."
)

if ft_model.lifecycle_state != "ACTIVE":
logger.error(
"Validation failed: Fine-tuned model '%s' is in state '%s'.",
"Validation failed: Fine-tuned model '%s' (id: '%s') is in state '%s'.",
ft_model.display_name,
ft_model_id,
ft_model.lifecycle_state,
)
raise ConfigValidationError(
f"Invalid Fine-tuned model ID '{ft_model_id}': must be in ACTIVE state."
f"Invalid Fine-tuned model '{ft_model.display_name}' (id: '{ft_model_id}'): must be in ACTIVE state."
)

if Tags.AQUA_FINE_TUNED_MODEL_TAG not in (ft_model.freeform_tags or {}):
logger.error(
"Validation failed: Model ID '%s' is missing tag '%s'.",
"Validation failed: Model '%s' (id: '%s') is missing tag '%s'.",
ft_model.display_name,
ft_model_id,
Tags.AQUA_FINE_TUNED_MODEL_TAG,
)
raise ConfigValidationError(
f"Invalid fine-tuned model ID '{ft_model_id}': missing tag '{Tags.AQUA_FINE_TUNED_MODEL_TAG}'."
f"Invalid fine-tuned model '{ft_model.display_name}' (id: '{ft_model_id}'): missing tag '{Tags.AQUA_FINE_TUNED_MODEL_TAG}'."
)

self.validate_ft_model_v2(model=ft_model)
Expand All @@ -586,14 +595,16 @@ def validate_input_models(self, model_details: Dict[str, DataScienceModel]) -> N

if ft_base_model_id != base_model_id:
logger.error(
"Validation failed: Fine-tuned model '%s' is linked to base model '%s' (expected '%s').",
"Validation failed: Fine-tuned model '%s' (id: '%s') is linked to base model '%s' (expected '%s' with id: '%s').",
ft_model.display_name,
ft_model_id,
ft_base_model_id,
base_model.display_name,
base_model_id,
)
raise ConfigValidationError(
f"Fine-tuned model '{ft_model_id}' belongs to base model '{ft_base_model_id}', "
f"but was included under base model '{base_model_id}'."
f"Fine-tuned model '{ft_model.display_name}' (id: '{ft_model_id}') belongs to base model '{ft_base_model_id}', "
f"but was included under base model '{base_model.display_name}' (id: '{base_model_id}')."
)

# Validate fine-tuned model name uniqueness
Expand All @@ -604,8 +615,10 @@ def validate_input_models(self, model_details: Dict[str, DataScienceModel]) -> N
seen_names.add(lora_model_name)

logger.debug(
"Validated fine-tuned model '%s' under base model '%s'.",
"Validated fine-tuned model '%s' (id: '%s') under base model '%s' (id: '%s').",
ft_model.display_name,
ft_model_id,
base_model.display_name,
base_model_id,
)

Expand Down Expand Up @@ -649,11 +662,12 @@ def validate_ft_model_v2(
!= AQUA_FINE_TUNE_MODEL_VERSION
):
logger.error(
"Validation failed: Fine-tuned model ID '%s' is not supported for model deployment.",
"Validation failed: Fine-tuned model '%s' (id: '%s') is not supported for model deployment.",
base_model.display_name,
base_model.id,
)
raise ConfigValidationError(
f"Invalid fine-tuned model ID '{base_model.id}': only fine tune model {AQUA_FINE_TUNE_MODEL_VERSION} is supported for model deployment. "
f"Invalid fine-tuned model '{base_model.display_name}' (id: '{base_model.id}'): only fine tune model {AQUA_FINE_TUNE_MODEL_VERSION} is supported for model deployment. "
f"Run 'ads aqua model convert_fine_tune --model_id {base_model.id}' to convert legacy AQUA fine tuned model to version {AQUA_FINE_TUNE_MODEL_VERSION} for deployment."
)

Expand All @@ -666,11 +680,12 @@ def validate_ft_model_v2(

if include_base_model_artifact == INCLUDE_BASE_MODEL:
logger.error(
"Validation failed: Fine-tuned model ID '%s' is not supported for model deployment.",
"Validation failed: Fine-tuned model '%s' (id: '%s') is not supported for model deployment.",
base_model.display_name,
base_model.id,
)
raise ConfigValidationError(
f"Invalid fine-tuned model ID '{base_model.id}': for fine tuned models like Phi4, the deployment is not supported. "
f"Invalid fine-tuned model '{base_model.display_name}' (id: '{base_model.id}'): for fine tuned models like Phi4, the deployment is not supported. "
)

def validate_base_model(self, model_id: str) -> Union[str, AquaMultiModelRef]:
Expand Down Expand Up @@ -714,11 +729,12 @@ def validate_base_model(self, model_id: str) -> Union[str, AquaMultiModelRef]:
segments = aqua_fine_tuned_model.split("#")
if not segments or not is_valid_ocid(segments[0]):
logger.error(
"Validation failed: Fine-tuned model ID '%s' is not supported for model deployment.",
"Validation failed: Fine-tuned model '%s' (id: '%s') is not supported for model deployment.",
base_model.display_name,
base_model.id,
)
raise ConfigValidationError(
f"Invalid fine-tuned model ID '{base_model.id}': missing or invalid tag '{Tags.AQUA_FINE_TUNED_MODEL_TAG}' format. "
f"Invalid fine-tuned model '{base_model.display_name}' (id: '{base_model.id}'): missing or invalid tag '{Tags.AQUA_FINE_TUNED_MODEL_TAG}' format. "
f"Make sure tag '{Tags.AQUA_FINE_TUNED_MODEL_TAG}' is added with format <service_model_id>#<service_model_name>."
)
# reset the model_id and models in create_model_deployment_details for stack deployment
Expand Down