Skip to content

Commit 13cede4

Browse files
KCFindstrcopybara-github
authored andcommitted
feat: Expose system_labels field to model deployment APIs in Vertex public preview SDK
PiperOrigin-RevId: 697830649
1 parent 6a22bef commit 13cede4

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

google/cloud/aiplatform/preview/models.py

+30
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ def deploy(
582582
deployment_resource_pool: Optional[DeploymentResourcePool] = None,
583583
disable_container_logging: bool = False,
584584
fast_tryout_enabled: bool = False,
585+
system_labels: Optional[Dict[str, str]] = None,
585586
) -> None:
586587
"""Deploys a Model to the Endpoint.
587588
@@ -667,6 +668,9 @@ def deploy(
667668
If True, model will be deployed using faster deployment path.
668669
Useful for quick experiments. Not for production workloads. Only
669670
available for most popular models and machine types. Defaults to False.
671+
system_labels (Dict[str, str]):
672+
Optional. System labels to apply to Model Garden deployments.
673+
System labels are managed by Google for internal use only.
670674
671675
"""
672676
self._sync_gca_resource_if_skipped()
@@ -706,6 +710,7 @@ def deploy(
706710
deployment_resource_pool=deployment_resource_pool,
707711
disable_container_logging=disable_container_logging,
708712
fast_tryout_enabled=fast_tryout_enabled,
713+
system_labels=system_labels,
709714
)
710715

711716
@base.optional_sync()
@@ -730,6 +735,7 @@ def _deploy(
730735
deployment_resource_pool: Optional[DeploymentResourcePool] = None,
731736
disable_container_logging: bool = False,
732737
fast_tryout_enabled: bool = False,
738+
system_labels: Optional[Dict[str, str]] = None,
733739
) -> None:
734740
"""Deploys a Model to the Endpoint.
735741
@@ -809,6 +815,9 @@ def _deploy(
809815
If True, model will be deployed using faster deployment path.
810816
Useful for quick experiments. Not for production workloads. Only
811817
available for most popular models and machine types. Defaults to False.
818+
system_labels (Dict[str, str]):
819+
Optional. System labels to apply to Model Garden deployments.
820+
System labels are managed by Google for internal use only.
812821
813822
"""
814823
_LOGGER.log_action_start_against_resource(
@@ -838,6 +847,7 @@ def _deploy(
838847
deployment_resource_pool=deployment_resource_pool,
839848
disable_container_logging=disable_container_logging,
840849
fast_tryout_enabled=fast_tryout_enabled,
850+
system_labels=system_labels,
841851
)
842852

843853
_LOGGER.log_action_completed_against_resource("model", "deployed", self)
@@ -869,6 +879,7 @@ def _deploy_call(
869879
deployment_resource_pool: Optional[DeploymentResourcePool] = None,
870880
disable_container_logging: bool = False,
871881
fast_tryout_enabled: bool = False,
882+
system_labels: Optional[Dict[str, str]] = None,
872883
) -> None:
873884
"""Helper method to deploy model to endpoint.
874885
@@ -955,6 +966,9 @@ def _deploy_call(
955966
If True, model will be deployed using faster deployment path.
956967
Useful for quick experiments. Not for production workloads. Only
957968
available for most popular models and machine types. Defaults to False.
969+
system_labels (Dict[str, str]):
970+
Optional. System labels to apply to Model Garden deployments.
971+
System labels are managed by Google for internal use only.
958972
959973
Raises:
960974
ValueError: If only `accelerator_type` or `accelerator_count` is
@@ -990,6 +1004,9 @@ def _deploy_call(
9901004
enable_container_logging=not disable_container_logging,
9911005
)
9921006

1007+
if system_labels:
1008+
deployed_model.system_labels = system_labels
1009+
9931010
supports_automatic_resources = (
9941011
gca_model_compat.Model.DeploymentResourcesType.AUTOMATIC_RESOURCES
9951012
in model.supported_deployment_resources_types
@@ -1074,6 +1091,9 @@ def _deploy_call(
10741091
enable_container_logging=not disable_container_logging,
10751092
)
10761093

1094+
if system_labels:
1095+
deployed_model.system_labels = system_labels
1096+
10771097
supports_shared_resources = (
10781098
gca_model_compat.Model.DeploymentResourcesType.SHARED_RESOURCES
10791099
in model.supported_deployment_resources_types
@@ -1359,6 +1379,7 @@ def deploy(
13591379
deployment_resource_pool: Optional[DeploymentResourcePool] = None,
13601380
disable_container_logging: bool = False,
13611381
fast_tryout_enabled: bool = False,
1382+
system_labels: Optional[Dict[str, str]] = None,
13621383
) -> Union[Endpoint, models.PrivateEndpoint]:
13631384
"""Deploys model to endpoint.
13641385
@@ -1465,6 +1486,9 @@ def deploy(
14651486
If True, model will be deployed using faster deployment path.
14661487
Useful for quick experiments. Not for production workloads. Only
14671488
available for most popular models and machine types. Defaults to False.
1489+
system_labels (Dict[str, str]):
1490+
Optional. System labels to apply to Model Garden deployments.
1491+
System labels are managed by Google for internal use only.
14681492
14691493
Returns:
14701494
endpoint (Union[Endpoint, models.PrivateEndpoint]):
@@ -1521,6 +1545,7 @@ def deploy(
15211545
deployment_resource_pool=deployment_resource_pool,
15221546
disable_container_logging=disable_container_logging,
15231547
fast_tryout_enabled=fast_tryout_enabled,
1548+
system_labels=system_labels,
15241549
)
15251550

15261551
@base.optional_sync(return_input_arg="endpoint", bind_future_to_self=False)
@@ -1547,6 +1572,7 @@ def _deploy(
15471572
deployment_resource_pool: Optional[DeploymentResourcePool] = None,
15481573
disable_container_logging: bool = False,
15491574
fast_tryout_enabled: bool = False,
1575+
system_labels: Optional[Dict[str, str]] = None,
15501576
) -> Union[Endpoint, models.PrivateEndpoint]:
15511577
"""Deploys model to endpoint.
15521578
@@ -1644,6 +1670,9 @@ def _deploy(
16441670
fast_tryout_enabled (bool):
16451671
Optional. Whether to enable fast deployment. Defaults to False.
16461672
Useful for quick experiments. Not for production workloads.
1673+
system_labels (Dict[str, str]):
1674+
Optional. System labels to apply to Model Garden deployments.
1675+
System labels are managed by Google for internal use only.
16471676
16481677
Returns:
16491678
endpoint (Union[Endpoint, models.PrivateEndpoint]):
@@ -1696,6 +1725,7 @@ def _deploy(
16961725
deployment_resource_pool=deployment_resource_pool,
16971726
disable_container_logging=disable_container_logging,
16981727
fast_tryout_enabled=fast_tryout_enabled,
1728+
system_labels=system_labels,
16991729
)
17001730

17011731
_LOGGER.log_action_completed_against_resource("model", "deployed", endpoint)

tests/unit/aiplatform/test_endpoints.py

+47
Original file line numberDiff line numberDiff line change
@@ -2161,6 +2161,53 @@ def test_deploy_with_fast_tryout_enabled(self, deploy_model_mock, sync):
21612161
timeout=None,
21622162
)
21632163

2164+
@pytest.mark.usefixtures("get_endpoint_mock", "get_model_mock")
2165+
@pytest.mark.parametrize("sync", [True, False])
2166+
def test_preview_deploy_with_system_labels(self, preview_deploy_model_mock, sync):
2167+
test_endpoint = preview_models.Endpoint(_TEST_ENDPOINT_NAME)
2168+
test_model = preview_models.Model(_TEST_ID)
2169+
test_model._gca_resource.supported_deployment_resources_types.append(
2170+
aiplatform.gapic.Model.DeploymentResourcesType.DEDICATED_RESOURCES,
2171+
)
2172+
2173+
test_endpoint.deploy(
2174+
model=test_model,
2175+
sync=sync,
2176+
deploy_request_timeout=None,
2177+
machine_type=_TEST_MACHINE_TYPE,
2178+
accelerator_type=_TEST_ACCELERATOR_TYPE,
2179+
accelerator_count=_TEST_ACCELERATOR_COUNT,
2180+
system_labels=_TEST_LABELS,
2181+
)
2182+
if not sync:
2183+
test_endpoint.wait()
2184+
2185+
expected_machine_spec = gca_machine_resources_v1beta1.MachineSpec(
2186+
machine_type=_TEST_MACHINE_TYPE,
2187+
accelerator_type=_TEST_ACCELERATOR_TYPE,
2188+
accelerator_count=_TEST_ACCELERATOR_COUNT,
2189+
)
2190+
expected_dedicated_resources = gca_machine_resources_v1beta1.DedicatedResources(
2191+
machine_spec=expected_machine_spec,
2192+
min_replica_count=1,
2193+
max_replica_count=1,
2194+
)
2195+
expected_deployed_model = gca_endpoint_v1beta1.DeployedModel(
2196+
dedicated_resources=expected_dedicated_resources,
2197+
model=test_model.resource_name,
2198+
display_name=None,
2199+
faster_deployment_config=gca_endpoint_v1beta1.FasterDeploymentConfig(),
2200+
enable_container_logging=True,
2201+
system_labels=_TEST_LABELS,
2202+
)
2203+
preview_deploy_model_mock.assert_called_once_with(
2204+
endpoint=test_endpoint.resource_name,
2205+
deployed_model=expected_deployed_model,
2206+
traffic_split={"0": 100},
2207+
metadata=(),
2208+
timeout=None,
2209+
)
2210+
21642211
@pytest.mark.usefixtures("get_endpoint_mock", "get_model_mock", "get_drp_mock")
21652212
@pytest.mark.parametrize("sync", [True, False])
21662213
def test_deploy_with_deployment_resource_pool(self, deploy_model_mock, sync):

tests/unit/aiplatform/test_models.py

+52
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,8 @@
501501
"aiplatform.googleapis.com/prediction/online/accelerator/duty_cycle"
502502
)
503503

504+
_TEST_LABELS = {"label1": "value1", "label2": "value2"}
505+
504506

505507
@pytest.fixture
506508
def mock_model():
@@ -2627,6 +2629,56 @@ def test_deploy_with_fast_tryout_enabled(self, deploy_model_mock, sync):
26272629
timeout=None,
26282630
)
26292631

2632+
@pytest.mark.usefixtures(
2633+
"get_model_mock",
2634+
"create_endpoint_mock",
2635+
"get_endpoint_mock",
2636+
)
2637+
@pytest.mark.parametrize("sync", [True, False])
2638+
def test_preview_deploy_with_system_labels(self, preview_deploy_model_mock, sync):
2639+
test_model = models.Model(_TEST_ID).preview
2640+
test_model._gca_resource.supported_deployment_resources_types.append(
2641+
aiplatform.gapic.Model.DeploymentResourcesType.DEDICATED_RESOURCES
2642+
)
2643+
2644+
test_endpoint = test_model.deploy(
2645+
machine_type=_TEST_MACHINE_TYPE,
2646+
accelerator_type=_TEST_ACCELERATOR_TYPE,
2647+
accelerator_count=_TEST_ACCELERATOR_COUNT,
2648+
sync=sync,
2649+
deploy_request_timeout=None,
2650+
system_labels=_TEST_LABELS,
2651+
)
2652+
2653+
if not sync:
2654+
test_endpoint.wait()
2655+
2656+
expected_machine_spec = gca_machine_resources_v1beta1.MachineSpec(
2657+
machine_type=_TEST_MACHINE_TYPE,
2658+
accelerator_type=_TEST_ACCELERATOR_TYPE,
2659+
accelerator_count=_TEST_ACCELERATOR_COUNT,
2660+
)
2661+
expected_dedicated_resources = gca_machine_resources_v1beta1.DedicatedResources(
2662+
machine_spec=expected_machine_spec,
2663+
min_replica_count=1,
2664+
max_replica_count=1,
2665+
)
2666+
expected_deployed_model = gca_endpoint_v1beta1.DeployedModel(
2667+
dedicated_resources=expected_dedicated_resources,
2668+
model=test_model.resource_name,
2669+
display_name=None,
2670+
enable_container_logging=True,
2671+
faster_deployment_config=gca_endpoint_v1beta1.FasterDeploymentConfig(),
2672+
system_labels=_TEST_LABELS,
2673+
)
2674+
preview_deploy_model_mock.assert_called_once_with(
2675+
endpoint=test_endpoint.resource_name,
2676+
deployed_model=expected_deployed_model,
2677+
traffic_split={"0": 100},
2678+
metadata=(),
2679+
timeout=None,
2680+
)
2681+
26302682
@pytest.mark.usefixtures(
26312683
"get_model_mock",
26322684
"preview_get_drp_mock",

0 commit comments

Comments
 (0)