diff --git a/ads/aqua/modeldeployment/deployment.py b/ads/aqua/modeldeployment/deployment.py index 7b5d379de..de1275a96 100644 --- a/ads/aqua/modeldeployment/deployment.py +++ b/ads/aqua/modeldeployment/deployment.py @@ -232,7 +232,7 @@ def create( model = create_deployment_details.models[0] else: try: - create_deployment_details.validate_ft_model_v2(model_id=model) + create_deployment_details.validate_base_model(model_id=model) except ConfigValidationError as err: raise AquaValueError(f"{err}") from err diff --git a/ads/aqua/modeldeployment/entities.py b/ads/aqua/modeldeployment/entities.py index cbcb499ad..0ded5281c 100644 --- a/ads/aqua/modeldeployment/entities.py +++ b/ads/aqua/modeldeployment/entities.py @@ -713,6 +713,35 @@ def validate_ft_model_v2( f"Invalid fine-tuned model ID '{base_model.id}': for fine tuned models like Phi4, the deployment is not supported. " ) + def validate_base_model(self, model_id: str) -> None: + """ + Validates the input base model for single model deployment configuration. + + Validation Criteria: + - Fine-tuned models are not supported in single model deployment. + + Parameters + ---------- + model_id : str + The OCID of DataScienceModel instance. + + Raises + ------ + ConfigValidationError + If any of the above conditions are violated. + """ + base_model = DataScienceModel.from_id(model_id) + if Tags.AQUA_FINE_TUNED_MODEL_TAG in base_model.freeform_tags: + logger.error( + "Validation failed: Fine-tuned model ID '%s' is not supported for single-model deployment.", + base_model.id, + ) + raise ConfigValidationError( + f"Invalid base model ID '{base_model.id}': " + "single-model deployment does not support fine-tuned models. " + f"Please deploy the fine-tuned model '{base_model.id}' as a stacked model deployment instead." + ) + class Config: extra = "allow" protected_namespaces = () diff --git a/tests/unitary/with_extras/aqua/test_deployment.py b/tests/unitary/with_extras/aqua/test_deployment.py index 172937a22..925fa28d8 100644 --- a/tests/unitary/with_extras/aqua/test_deployment.py +++ b/tests/unitary/with_extras/aqua/test_deployment.py @@ -1438,11 +1438,11 @@ def test_verify_compatibility(self): @patch("ads.model.deployment.model_deployment.ModelDeployment.deploy") @patch.object(AquaApp, "get_container_config") @patch( - "ads.aqua.modeldeployment.entities.CreateModelDeploymentDetails.validate_ft_model_v2" + "ads.aqua.modeldeployment.entities.CreateModelDeploymentDetails.validate_base_model" ) def test_create_deployment_for_foundation_model( self, - mock_validate_ft_model_v2, + mock_validate_base_model, mock_get_container_config, mock_deploy, mock_get_container_image, @@ -1518,7 +1518,7 @@ def test_create_deployment_for_foundation_model( defined_tags=defined_tags, ) - mock_validate_ft_model_v2.assert_called() + mock_validate_base_model.assert_called() mock_create.assert_called_with( model=TestDataset.MODEL_ID, compartment_id=TestDataset.USER_COMPARTMENT_ID, @@ -1544,11 +1544,11 @@ def test_create_deployment_for_foundation_model( @patch("ads.model.deployment.model_deployment.ModelDeployment.deploy") @patch.object(AquaApp, "get_container_config") @patch( - "ads.aqua.modeldeployment.entities.CreateModelDeploymentDetails.validate_ft_model_v2" + "ads.aqua.modeldeployment.entities.CreateModelDeploymentDetails.validate_base_model" ) def test_create_deployment_for_fine_tuned_model( self, - mock_validate_ft_model_v2, + mock_validate_base_model, mock_get_container_config, mock_deploy, mock_get_container_image, @@ -1619,7 +1619,7 @@ def test_create_deployment_for_fine_tuned_model( predict_log_id="ocid1.log.oc1..", ) - mock_validate_ft_model_v2.assert_called() + mock_validate_base_model.assert_called() mock_create.assert_called_with( model=TestDataset.MODEL_ID, compartment_id=TestDataset.USER_COMPARTMENT_ID, @@ -1643,11 +1643,11 @@ def test_create_deployment_for_fine_tuned_model( @patch("ads.model.deployment.model_deployment.ModelDeployment.deploy") @patch.object(AquaApp, "get_container_config") @patch( - "ads.aqua.modeldeployment.entities.CreateModelDeploymentDetails.validate_ft_model_v2" + "ads.aqua.modeldeployment.entities.CreateModelDeploymentDetails.validate_base_model" ) def test_create_deployment_for_gguf_model( self, - mock_validate_ft_model_v2, + mock_validate_base_model, mock_get_container_config, mock_deploy, mock_get_container_image, @@ -1720,7 +1720,7 @@ def test_create_deployment_for_gguf_model( memory_in_gbs=60.0, ) - mock_validate_ft_model_v2.assert_called() + mock_validate_base_model.assert_called() mock_create.assert_called_with( model=TestDataset.MODEL_ID, compartment_id=TestDataset.USER_COMPARTMENT_ID, @@ -1748,11 +1748,11 @@ def test_create_deployment_for_gguf_model( @patch("ads.model.deployment.model_deployment.ModelDeployment.deploy") @patch.object(AquaApp, "get_container_config") @patch( - "ads.aqua.modeldeployment.entities.CreateModelDeploymentDetails.validate_ft_model_v2" + "ads.aqua.modeldeployment.entities.CreateModelDeploymentDetails.validate_base_model" ) def test_create_deployment_for_tei_byoc_embedding_model( self, - mock_validate_ft_model_v2, + mock_validate_base_model, mock_get_container_config, mock_deploy, mock_get_container_image, @@ -1828,7 +1828,7 @@ def test_create_deployment_for_tei_byoc_embedding_model( cmd_var=[], ) - mock_validate_ft_model_v2.assert_called() + mock_validate_base_model.assert_called() mock_create.assert_called_with( model=TestDataset.MODEL_ID, compartment_id=TestDataset.USER_COMPARTMENT_ID,