From b15741772c316c6a44ff17cb636c470814a0da97 Mon Sep 17 00:00:00 2001 From: Kumar Ranjan Date: Mon, 9 Jun 2025 20:57:02 +0530 Subject: [PATCH 1/2] SMC config updates --- ads/aqua/config/container_config.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ads/aqua/config/container_config.py b/ads/aqua/config/container_config.py index 3c45d192e..93d95993c 100644 --- a/ads/aqua/config/container_config.py +++ b/ads/aqua/config/container_config.py @@ -118,7 +118,7 @@ class AquaContainerConfig(Serializable): evaluate (Dict[str, AquaContainerConfigItem]): Evaluation container configuration items. """ - inference: Dict[str, AquaContainerConfigItem] = Field( + inference: Dict[str, List[AquaContainerConfigItem]] = Field( default_factory=dict, description="Inference container configuration items." ) finetune: Dict[str, AquaContainerConfigItem] = Field( @@ -130,7 +130,9 @@ class AquaContainerConfig(Serializable): def to_dict(self): return { - "inference": list(self.inference.values()), + "inference": [ + item for sublist in self.inference.values() for item in sublist + ], "finetune": list(self.finetune.values()), "evaluate": list(self.evaluate.values()), } @@ -149,12 +151,11 @@ def from_service_config( ------- AquaContainerConfig: The constructed container configuration. """ - - inference_items: Dict[str, AquaContainerConfigItem] = {} + inference_items: Dict[str, List[AquaContainerConfigItem]] = {} finetune_items: Dict[str, AquaContainerConfigItem] = {} evaluate_items: Dict[str, AquaContainerConfigItem] = {} for container in service_containers: - if not container.is_latest: + if "INFERENCE" not in container.usages and not container.is_latest: continue container_item = AquaContainerConfigItem( name=SERVICE_MANAGED_CONTAINER_URI_SCHEME + container.container_name, @@ -235,7 +236,9 @@ def from_service_config( ) if "INFERENCE" in usages or "MULTI_MODEL" in usages: - inference_items[container_type] = container_item + if container_type not in inference_items: + inference_items[container_type] = [] + inference_items[container_type].append(container_item) if "FINE_TUNE" in usages: finetune_items[container_type] = container_item if "EVALUATION" in usages: From 72fb3c092e5f602f2e48177ef00ce8cbde39e13c Mon Sep 17 00:00:00 2001 From: Kumar Ranjan Date: Wed, 30 Jul 2025 00:31:25 +0530 Subject: [PATCH 2/2] Updates in create MD request --- ads/aqua/app.py | 31 +++++++++++++++++++------- ads/aqua/modeldeployment/deployment.py | 11 +++++++-- ads/aqua/modeldeployment/entities.py | 3 +++ 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/ads/aqua/app.py b/ads/aqua/app.py index 305de2d1f..78d337b5c 100644 --- a/ads/aqua/app.py +++ b/ads/aqua/app.py @@ -454,7 +454,9 @@ def get_config( return ModelConfigResult(config=config, model_details=oci_model) - def get_container_image(self, container_type: str = None) -> str: + def get_container_image( + self, container_type: str = None, container_tag: str = None + ) -> str: """ Gets the latest smc container complete image name from the given container type. @@ -463,6 +465,9 @@ def get_container_image(self, container_type: str = None) -> str: container_type: str type of container, can be either odsc-vllm-serving, odsc-llm-fine-tuning, odsc-llm-evaluate + container_tag: str + tag of container, ex: 0.8.5.post1.1 + Returns ------- str: @@ -476,13 +481,23 @@ def get_container_image(self, container_type: str = None) -> str: ) if not container: raise AquaValueError(f"Invalid container type : {container_type}") - container_image = ( - SERVICE_MANAGED_CONTAINER_URI_SCHEME - + container.container_name - + ":" - + container.tag - ) - return container_image + + if container_tag: + container_image = ( + SERVICE_MANAGED_CONTAINER_URI_SCHEME + + container.container_name + + ":" + + container_tag + ) + return container_image + else: + container_image = ( + SERVICE_MANAGED_CONTAINER_URI_SCHEME + + container.container_name + + ":" + + container.tag + ) + return container_image @cached(cache=TTLCache(maxsize=20, ttl=timedelta(minutes=30), timer=datetime.now)) def list_service_containers(self) -> List[ContainerSummary]: diff --git a/ads/aqua/modeldeployment/deployment.py b/ads/aqua/modeldeployment/deployment.py index 3e93f38ee..c652c29fc 100644 --- a/ads/aqua/modeldeployment/deployment.py +++ b/ads/aqua/modeldeployment/deployment.py @@ -155,6 +155,7 @@ def create( health_check_port (Optional[int]): Health check port for the Docker container image. env_var (Optional[Dict[str, str]]): Environment variables for deployment. container_family (Optional[str]): Image family of the model deployment container runtime. + container_tag (Optional[str]): Image tag of the model deployment container runtime memory_in_gbs (Optional[float]): Memory (in GB) for the selected shape. ocpus (Optional[float]): OCPU count for the selected shape. model_file (Optional[str]): File used for model deployment. @@ -425,7 +426,10 @@ def _create( container_image_uri = ( create_deployment_details.container_image_uri - or self.get_container_image(container_type=container_type_key) + or self.get_container_image( + container_type=container_type_key, + container_tag=create_deployment_details.container_tag, + ) ) if not container_image_uri: try: @@ -631,7 +635,10 @@ def _create_multi( container_image_uri = ( create_deployment_details.container_image_uri - or self.get_container_image(container_type=container_type_key) + or self.get_container_image( + container_type=container_type_key, + container_tag=create_deployment_details.container_tag, + ) ) server_port = create_deployment_details.server_port or ( container_spec.server_port if container_spec else None diff --git a/ads/aqua/modeldeployment/entities.py b/ads/aqua/modeldeployment/entities.py index ebce26dc8..d9f06b181 100644 --- a/ads/aqua/modeldeployment/entities.py +++ b/ads/aqua/modeldeployment/entities.py @@ -270,6 +270,9 @@ class CreateModelDeploymentDetails(BaseModel): container_family: Optional[str] = Field( None, description="Image family of the model deployment container runtime." ) + container_tag: Optional[str] = Field( + None, description="Image tag of the model deployment container runtime." + ) memory_in_gbs: Optional[float] = Field( None, description="Memory (in GB) for the selected shape." )