From 12f62d2dc0e745347eb00bfe67df8fe6db7a842e Mon Sep 17 00:00:00 2001 From: Victor Skvortsov Date: Wed, 30 Apr 2025 14:57:05 +0500 Subject: [PATCH 1/3] Use AS_COMPACT collocation for gcp placement groups --- .../_internal/core/backends/gcp/compute.py | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/dstack/_internal/core/backends/gcp/compute.py b/src/dstack/_internal/core/backends/gcp/compute.py index 3846e4f4d..43a2970ad 100644 --- a/src/dstack/_internal/core/backends/gcp/compute.py +++ b/src/dstack/_internal/core/backends/gcp/compute.py @@ -6,6 +6,7 @@ import google.api_core.exceptions import google.cloud.compute_v1 as compute_v1 from google.cloud import tpu_v2 +from googleapiclient import discovery from gpuhunt import KNOWN_TPUS import dstack._internal.core.backends.gcp.auth as auth @@ -98,6 +99,7 @@ def __init__(self, config: GCPConfig): self.resource_policies_client = compute_v1.ResourcePoliciesClient( credentials=self.credentials ) + self.compute_beta_client = discovery.build("compute", "beta", credentials=self.credentials) def get_offers( self, requirements: Optional[Requirements] = None @@ -407,19 +409,21 @@ def create_placement_group( self, placement_group: PlacementGroup, ) -> PlacementGroupProvisioningData: - policy = compute_v1.ResourcePolicy( - name=placement_group.name, - region=placement_group.configuration.region, - group_placement_policy=compute_v1.ResourcePolicyGroupPlacementPolicy( - availability_domain_count=1, - collocation="COLLOCATED", - ), - ) - self.resource_policies_client.insert( + policy_body = { + "name": placement_group.name, + "region": placement_group.configuration.region, + "groupPlacementPolicy": { + "collocation": "AS_COMPACT", + # "availabilityDomainCount": 1, + # "maxDistance": 0, + }, + } + request = self.compute_beta_client.resourcePolicies().insert( project=self.config.project_id, region=placement_group.configuration.region, - resource_policy_resource=policy, + body=policy_body, ) + request.execute() return PlacementGroupProvisioningData(backend=BackendType.GCP) def delete_placement_group( From 3d3c2c47ad65e910499ce867f3e5629b2c90d5b2 Mon Sep 17 00:00:00 2001 From: Victor Skvortsov Date: Wed, 30 Apr 2025 15:19:30 +0500 Subject: [PATCH 2/3] Revert "Use AS_COMPACT collocation for gcp placement groups" This reverts commit 12f62d2dc0e745347eb00bfe67df8fe6db7a842e. --- .../_internal/core/backends/gcp/compute.py | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/dstack/_internal/core/backends/gcp/compute.py b/src/dstack/_internal/core/backends/gcp/compute.py index 43a2970ad..3846e4f4d 100644 --- a/src/dstack/_internal/core/backends/gcp/compute.py +++ b/src/dstack/_internal/core/backends/gcp/compute.py @@ -6,7 +6,6 @@ import google.api_core.exceptions import google.cloud.compute_v1 as compute_v1 from google.cloud import tpu_v2 -from googleapiclient import discovery from gpuhunt import KNOWN_TPUS import dstack._internal.core.backends.gcp.auth as auth @@ -99,7 +98,6 @@ def __init__(self, config: GCPConfig): self.resource_policies_client = compute_v1.ResourcePoliciesClient( credentials=self.credentials ) - self.compute_beta_client = discovery.build("compute", "beta", credentials=self.credentials) def get_offers( self, requirements: Optional[Requirements] = None @@ -409,21 +407,19 @@ def create_placement_group( self, placement_group: PlacementGroup, ) -> PlacementGroupProvisioningData: - policy_body = { - "name": placement_group.name, - "region": placement_group.configuration.region, - "groupPlacementPolicy": { - "collocation": "AS_COMPACT", - # "availabilityDomainCount": 1, - # "maxDistance": 0, - }, - } - request = self.compute_beta_client.resourcePolicies().insert( + policy = compute_v1.ResourcePolicy( + name=placement_group.name, + region=placement_group.configuration.region, + group_placement_policy=compute_v1.ResourcePolicyGroupPlacementPolicy( + availability_domain_count=1, + collocation="COLLOCATED", + ), + ) + self.resource_policies_client.insert( project=self.config.project_id, region=placement_group.configuration.region, - body=policy_body, + resource_policy_resource=policy, ) - request.execute() return PlacementGroupProvisioningData(backend=BackendType.GCP) def delete_placement_group( From c2062cbb089a7ba554466de2b48cb88ac2e943f3 Mon Sep 17 00:00:00 2001 From: Victor Skvortsov Date: Wed, 30 Apr 2025 15:45:46 +0500 Subject: [PATCH 3/3] Use AS_COMPACT collocation for gcp placement groups --- src/dstack/_internal/core/backends/gcp/compute.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dstack/_internal/core/backends/gcp/compute.py b/src/dstack/_internal/core/backends/gcp/compute.py index 3846e4f4d..e2b54b1e4 100644 --- a/src/dstack/_internal/core/backends/gcp/compute.py +++ b/src/dstack/_internal/core/backends/gcp/compute.py @@ -411,8 +411,10 @@ def create_placement_group( name=placement_group.name, region=placement_group.configuration.region, group_placement_policy=compute_v1.ResourcePolicyGroupPlacementPolicy( - availability_domain_count=1, - collocation="COLLOCATED", + # GCP documents only collocation="COLLOCATED" + # but collocation="AS_COMPACT" actually places VMs on the same host + # and improves networking performance. Discovered with Gemini. + collocation="AS_COMPACT", ), ) self.resource_policies_client.insert(