skypilot-nightly 1.0.0.dev20250602__py3-none-any.whl → 1.0.0.dev20250604__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sky/__init__.py +3 -3
- sky/adaptors/kubernetes.py +8 -0
- sky/backends/backend_utils.py +1 -0
- sky/backends/cloud_vm_ray_backend.py +8 -4
- sky/{clouds/service_catalog → catalog}/__init__.py +6 -17
- sky/{clouds/service_catalog → catalog}/aws_catalog.py +3 -3
- sky/{clouds/service_catalog → catalog}/azure_catalog.py +2 -2
- sky/{clouds/service_catalog → catalog}/common.py +10 -8
- sky/{clouds/service_catalog → catalog}/cudo_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/data_fetchers/analyze.py +1 -1
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_aws.py +1 -1
- sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vsphere.py +1 -1
- sky/{clouds/service_catalog → catalog}/do_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/fluidstack_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/gcp_catalog.py +2 -2
- sky/{clouds/service_catalog → catalog}/ibm_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/kubernetes_catalog.py +2 -2
- sky/{clouds/service_catalog → catalog}/lambda_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/nebius_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/oci_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/paperspace_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/runpod_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/scp_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/ssh_catalog.py +3 -3
- sky/{clouds/service_catalog → catalog}/vast_catalog.py +1 -1
- sky/{clouds/service_catalog → catalog}/vsphere_catalog.py +1 -1
- sky/cli.py +7 -6
- sky/client/cli.py +7 -6
- sky/client/sdk.py +3 -4
- sky/clouds/aws.py +41 -40
- sky/clouds/azure.py +31 -34
- sky/clouds/cloud.py +8 -8
- sky/clouds/cudo.py +26 -26
- sky/clouds/do.py +24 -24
- sky/clouds/fluidstack.py +27 -29
- sky/clouds/gcp.py +45 -48
- sky/clouds/ibm.py +26 -26
- sky/clouds/kubernetes.py +24 -12
- sky/clouds/lambda_cloud.py +28 -30
- sky/clouds/nebius.py +26 -28
- sky/clouds/oci.py +32 -32
- sky/clouds/paperspace.py +24 -26
- sky/clouds/runpod.py +26 -28
- sky/clouds/scp.py +37 -36
- sky/clouds/utils/gcp_utils.py +3 -2
- sky/clouds/vast.py +27 -27
- sky/clouds/vsphere.py +12 -15
- sky/core.py +2 -2
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/chunks/236-fef38aa6e5639300.js +6 -0
- sky/dashboard/out/_next/static/chunks/37-947904ccc5687bac.js +6 -0
- sky/dashboard/out/_next/static/chunks/682-2be9b0f169727f2f.js +6 -0
- sky/dashboard/out/_next/static/chunks/856-f1b1f7f47edde2e8.js +1 -0
- sky/dashboard/out/_next/static/chunks/969-d7b6fb7f602bfcb3.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-158b70da336d8607.js +6 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-62c9982dc3675725.js +6 -0
- sky/dashboard/out/_next/static/chunks/pages/{clusters-f37ff20f0af29aae.js → clusters-5549a350f97d7ef3.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/config-35383adcb0edb5e2.js +6 -0
- sky/dashboard/out/_next/static/chunks/pages/infra/{[context]-342bc15bb78ab2e5.js → [context]-b68ddeed712d45b5.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/{infra-7b4b8e7fa9fa0827.js → infra-13b117a831702196.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-a62a3c65dc9bc57c.js +11 -0
- sky/dashboard/out/_next/static/chunks/pages/{jobs-78a6c5ba3e24c0cf.js → jobs-a76b2700eca236f7.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/{users-89f9212b81d8897e.js → users-07b523ccb19317ad.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/workspace/{new-198b6e00d7d724c5.js → new-c7516f2b4c3727c0.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/workspaces/{[name]-2ce792183b03c341.js → [name]-7799de9e691e35d8.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/workspaces-f54921ec9eb20965.js +1 -0
- sky/dashboard/out/_next/static/css/63d3995d8b528eb1.css +3 -0
- sky/dashboard/out/_next/static/vWwfD3jOky5J5jULHp8JT/_buildManifest.js +1 -0
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -1
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -1
- sky/dashboard/out/infra.html +1 -1
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -1
- sky/dashboard/out/workspace/new.html +1 -1
- sky/dashboard/out/workspaces/[name].html +1 -1
- sky/dashboard/out/workspaces.html +1 -1
- sky/data/storage_utils.py +5 -2
- sky/execution.py +1 -2
- sky/global_user_state.py +2 -4
- sky/jobs/server/core.py +1 -1
- sky/jobs/utils.py +31 -1
- sky/optimizer.py +1 -1
- sky/provision/cudo/cudo_machine_type.py +1 -1
- sky/provision/gcp/constants.py +4 -0
- sky/provision/kubernetes/utils.py +35 -22
- sky/provision/vast/utils.py +1 -1
- sky/provision/vsphere/common/vim_utils.py +1 -2
- sky/provision/vsphere/instance.py +1 -1
- sky/provision/vsphere/vsphere_utils.py +7 -11
- sky/resources.py +33 -2
- sky/serve/server/core.py +1 -1
- sky/server/common.py +86 -53
- sky/server/constants.py +1 -1
- sky/server/requests/executor.py +4 -1
- sky/server/requests/payloads.py +16 -0
- sky/server/requests/serializers/decoders.py +1 -1
- sky/server/server.py +3 -3
- sky/skypilot_config.py +88 -37
- sky/usage/usage_lib.py +4 -3
- sky/utils/accelerator_registry.py +3 -3
- sky/utils/controller_utils.py +4 -14
- sky/utils/kubernetes/deploy_remote_cluster.py +2 -1
- sky/utils/schemas.py +6 -9
- {skypilot_nightly-1.0.0.dev20250602.dist-info → skypilot_nightly-1.0.0.dev20250604.dist-info}/METADATA +1 -1
- {skypilot_nightly-1.0.0.dev20250602.dist-info → skypilot_nightly-1.0.0.dev20250604.dist-info}/RECORD +127 -126
- sky/dashboard/out/_next/static/chunks/236-7458fda7b295f305.js +0 -6
- sky/dashboard/out/_next/static/chunks/37-b638675d511d58b4.js +0 -6
- sky/dashboard/out/_next/static/chunks/682-5c12535476a21ce3.js +0 -6
- sky/dashboard/out/_next/static/chunks/856-ab9627e7e8ac35e8.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-8f270e2c9c59fa1a.js +0 -6
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-25edb867a41b6b20.js +0 -6
- sky/dashboard/out/_next/static/chunks/pages/config-3c6a2dabf56e8cd6.js +0 -6
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-c0c1dff3cd463d9e.js +0 -11
- sky/dashboard/out/_next/static/chunks/pages/workspaces-17d41826537196e7.js +0 -1
- sky/dashboard/out/_next/static/css/2b3ee34e586949a3.css +0 -3
- sky/dashboard/out/_next/static/dev-ndwjPgd_uQ4dcXXiv/_buildManifest.js +0 -1
- /sky/{clouds/service_catalog → catalog}/config.py +0 -0
- /sky/{clouds/service_catalog → catalog}/constants.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/__init__.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_azure.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_fluidstack.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_ibm.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_lambda_cloud.py +0 -0
- /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vast.py +0 -0
- /sky/dashboard/out/_next/static/chunks/{843-786c36624d5ff61f.js → 843-a097338acb89b7d7.js} +0 -0
- /sky/dashboard/out/_next/static/chunks/pages/{_app-ad1edd7fe17ea796.js → _app-67925f5e6382e22f.js} +0 -0
- /sky/dashboard/out/_next/static/{dev-ndwjPgd_uQ4dcXXiv → vWwfD3jOky5J5jULHp8JT}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250602.dist-info → skypilot_nightly-1.0.0.dev20250604.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250602.dist-info → skypilot_nightly-1.0.0.dev20250604.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250602.dist-info → skypilot_nightly-1.0.0.dev20250604.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250602.dist-info → skypilot_nightly-1.0.0.dev20250604.dist-info}/top_level.txt +0 -0
sky/clouds/nebius.py
CHANGED
@@ -4,11 +4,11 @@ import os
|
|
4
4
|
import typing
|
5
5
|
from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
|
6
6
|
|
7
|
+
from sky import catalog
|
7
8
|
from sky import clouds
|
8
9
|
from sky import exceptions
|
9
10
|
from sky import skypilot_config
|
10
11
|
from sky.adaptors import nebius
|
11
|
-
from sky.clouds import service_catalog
|
12
12
|
from sky.utils import annotations
|
13
13
|
from sky.utils import registry
|
14
14
|
from sky.utils import resources_utils
|
@@ -92,7 +92,7 @@ class Nebius(clouds.Cloud):
|
|
92
92
|
del accelerators, zone # unused
|
93
93
|
if use_spot:
|
94
94
|
return []
|
95
|
-
regions =
|
95
|
+
regions = catalog.get_region_zones_for_instance_type(
|
96
96
|
instance_type, use_spot, 'nebius')
|
97
97
|
|
98
98
|
if region is not None:
|
@@ -104,8 +104,8 @@ class Nebius(clouds.Cloud):
|
|
104
104
|
cls,
|
105
105
|
instance_type: str,
|
106
106
|
) -> Tuple[Optional[float], Optional[float]]:
|
107
|
-
return
|
108
|
-
|
107
|
+
return catalog.get_vcpus_mem_from_instance_type(instance_type,
|
108
|
+
clouds='nebius')
|
109
109
|
|
110
110
|
@classmethod
|
111
111
|
def zones_provision_loop(
|
@@ -132,11 +132,11 @@ class Nebius(clouds.Cloud):
|
|
132
132
|
use_spot: bool,
|
133
133
|
region: Optional[str] = None,
|
134
134
|
zone: Optional[str] = None) -> float:
|
135
|
-
return
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
135
|
+
return catalog.get_hourly_cost(instance_type,
|
136
|
+
use_spot=use_spot,
|
137
|
+
region=region,
|
138
|
+
zone=zone,
|
139
|
+
clouds='nebius')
|
140
140
|
|
141
141
|
def accelerators_to_hourly_cost(self,
|
142
142
|
accelerators: Dict[str, int],
|
@@ -165,18 +165,18 @@ class Nebius(clouds.Cloud):
|
|
165
165
|
disk_tier: Optional[resources_utils.DiskTier] = None
|
166
166
|
) -> Optional[str]:
|
167
167
|
"""Returns the default instance type for Nebius."""
|
168
|
-
return
|
169
|
-
|
170
|
-
|
171
|
-
|
168
|
+
return catalog.get_default_instance_type(cpus=cpus,
|
169
|
+
memory=memory,
|
170
|
+
disk_tier=disk_tier,
|
171
|
+
clouds='nebius')
|
172
172
|
|
173
173
|
@classmethod
|
174
174
|
def get_accelerators_from_instance_type(
|
175
175
|
cls,
|
176
176
|
instance_type: str,
|
177
177
|
) -> Optional[Dict[str, Union[int, float]]]:
|
178
|
-
return
|
179
|
-
|
178
|
+
return catalog.get_accelerators_from_instance_type(instance_type,
|
179
|
+
clouds='nebius')
|
180
180
|
|
181
181
|
@classmethod
|
182
182
|
def get_zone_shell_cmd(cls) -> Optional[str]:
|
@@ -277,15 +277,15 @@ class Nebius(clouds.Cloud):
|
|
277
277
|
|
278
278
|
assert len(accelerators) == 1, resources
|
279
279
|
acc, acc_count = list(accelerators.items())[0]
|
280
|
-
(instance_list,
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
280
|
+
(instance_list,
|
281
|
+
fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
|
282
|
+
acc,
|
283
|
+
acc_count,
|
284
|
+
use_spot=resources.use_spot,
|
285
|
+
cpus=resources.cpus,
|
286
|
+
region=resources.region,
|
287
|
+
zone=resources.zone,
|
288
|
+
clouds='nebius')
|
289
289
|
if instance_list is None:
|
290
290
|
return resources_utils.FeasibleResources([], fuzzy_candidate_list,
|
291
291
|
None)
|
@@ -368,12 +368,10 @@ class Nebius(clouds.Cloud):
|
|
368
368
|
return None
|
369
369
|
|
370
370
|
def instance_type_exists(self, instance_type: str) -> bool:
|
371
|
-
return
|
371
|
+
return catalog.instance_type_exists(instance_type, 'nebius')
|
372
372
|
|
373
373
|
def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
|
374
|
-
return
|
375
|
-
zone,
|
376
|
-
clouds='nebius')
|
374
|
+
return catalog.validate_region_zone(region, zone, clouds='nebius')
|
377
375
|
|
378
376
|
@classmethod
|
379
377
|
def get_user_identities(cls) -> Optional[List[List[str]]]:
|
sky/clouds/oci.py
CHANGED
@@ -25,10 +25,10 @@ import os
|
|
25
25
|
import typing
|
26
26
|
from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
|
27
27
|
|
28
|
+
from sky import catalog
|
28
29
|
from sky import clouds
|
29
30
|
from sky import exceptions
|
30
31
|
from sky.adaptors import oci as oci_adaptor
|
31
|
-
from sky.clouds import service_catalog
|
32
32
|
from sky.clouds.utils import oci_utils
|
33
33
|
from sky.provision.oci.query_utils import query_helper
|
34
34
|
from sky.utils import common_utils
|
@@ -97,7 +97,7 @@ class OCI(clouds.Cloud):
|
|
97
97
|
zone: Optional[str]) -> List[clouds.Region]:
|
98
98
|
del accelerators # unused
|
99
99
|
|
100
|
-
regions =
|
100
|
+
regions = catalog.get_region_zones_for_instance_type(
|
101
101
|
instance_type, use_spot, 'oci')
|
102
102
|
|
103
103
|
if region is not None:
|
@@ -114,8 +114,8 @@ class OCI(clouds.Cloud):
|
|
114
114
|
cls,
|
115
115
|
instance_type: str,
|
116
116
|
) -> Tuple[Optional[float], Optional[float]]:
|
117
|
-
return
|
118
|
-
|
117
|
+
return catalog.get_vcpus_mem_from_instance_type(instance_type,
|
118
|
+
clouds='oci')
|
119
119
|
|
120
120
|
@classmethod
|
121
121
|
def zones_provision_loop(
|
@@ -143,11 +143,11 @@ class OCI(clouds.Cloud):
|
|
143
143
|
use_spot: bool,
|
144
144
|
region: Optional[str] = None,
|
145
145
|
zone: Optional[str] = None) -> float:
|
146
|
-
return
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
146
|
+
return catalog.get_hourly_cost(instance_type,
|
147
|
+
use_spot=use_spot,
|
148
|
+
region=region,
|
149
|
+
zone=zone,
|
150
|
+
clouds='oci')
|
151
151
|
|
152
152
|
def accelerators_to_hourly_cost(self,
|
153
153
|
accelerators: Dict[str, int],
|
@@ -189,18 +189,18 @@ class OCI(clouds.Cloud):
|
|
189
189
|
memory: Optional[str] = None,
|
190
190
|
disk_tier: Optional[resources_utils.DiskTier] = None
|
191
191
|
) -> Optional[str]:
|
192
|
-
return
|
193
|
-
|
194
|
-
|
195
|
-
|
192
|
+
return catalog.get_default_instance_type(cpus=cpus,
|
193
|
+
memory=memory,
|
194
|
+
disk_tier=disk_tier,
|
195
|
+
clouds='oci')
|
196
196
|
|
197
197
|
@classmethod
|
198
198
|
def get_accelerators_from_instance_type(
|
199
199
|
cls,
|
200
200
|
instance_type: str,
|
201
201
|
) -> Optional[Dict[str, Union[int, float]]]:
|
202
|
-
return
|
203
|
-
|
202
|
+
return catalog.get_accelerators_from_instance_type(instance_type,
|
203
|
+
clouds='oci')
|
204
204
|
|
205
205
|
@classmethod
|
206
206
|
def get_zone_shell_cmd(cls) -> Optional[str]:
|
@@ -274,7 +274,7 @@ class OCI(clouds.Cloud):
|
|
274
274
|
if zone is None:
|
275
275
|
# If zone is not specified, try to get the first zone.
|
276
276
|
if zones is None:
|
277
|
-
regions =
|
277
|
+
regions = catalog.get_region_zones_for_instance_type(
|
278
278
|
instance_type=original_instance_type,
|
279
279
|
use_spot=resources.use_spot,
|
280
280
|
clouds='oci')
|
@@ -319,7 +319,7 @@ class OCI(clouds.Cloud):
|
|
319
319
|
region=region.name)
|
320
320
|
|
321
321
|
# pylint: disable=import-outside-toplevel
|
322
|
-
from sky.
|
322
|
+
from sky.catalog import oci_catalog
|
323
323
|
os_type = oci_catalog.get_image_os_from_tag(tag=image_str,
|
324
324
|
region=region.name)
|
325
325
|
logger.debug(f'OS type for the image {image_id} is {os_type}')
|
@@ -383,16 +383,16 @@ class OCI(clouds.Cloud):
|
|
383
383
|
assert len(accelerators) == 1, resources
|
384
384
|
|
385
385
|
acc, acc_count = list(accelerators.items())[0]
|
386
|
-
(instance_list,
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
386
|
+
(instance_list,
|
387
|
+
fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
|
388
|
+
acc,
|
389
|
+
acc_count,
|
390
|
+
use_spot=resources.use_spot,
|
391
|
+
cpus=resources.cpus,
|
392
|
+
memory=resources.memory,
|
393
|
+
region=resources.region,
|
394
|
+
zone=resources.zone,
|
395
|
+
clouds='oci')
|
396
396
|
if instance_list is None:
|
397
397
|
return resources_utils.FeasibleResources([], fuzzy_candidate_list,
|
398
398
|
None)
|
@@ -532,10 +532,10 @@ class OCI(clouds.Cloud):
|
|
532
532
|
return None
|
533
533
|
|
534
534
|
def instance_type_exists(self, instance_type: str) -> bool:
|
535
|
-
return
|
535
|
+
return catalog.instance_type_exists(instance_type, 'oci')
|
536
536
|
|
537
537
|
def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
|
538
|
-
return
|
538
|
+
return catalog.validate_region_zone(region, zone, clouds='oci')
|
539
539
|
|
540
540
|
@classmethod
|
541
541
|
def get_image_size(cls, image_id: str, region: Optional[str]) -> float:
|
@@ -556,9 +556,9 @@ class OCI(clouds.Cloud):
|
|
556
556
|
region=region_name)
|
557
557
|
|
558
558
|
if image_id_str.startswith('skypilot:'):
|
559
|
-
image_id_str =
|
560
|
-
|
561
|
-
|
559
|
+
image_id_str = catalog.get_image_id_from_tag(image_id_str,
|
560
|
+
region_name,
|
561
|
+
clouds='oci')
|
562
562
|
|
563
563
|
# Image_id should be impossible be None, except for the case when
|
564
564
|
# user specify an image tag which does not exist in the image.csv
|
sky/clouds/paperspace.py
CHANGED
@@ -3,9 +3,9 @@
|
|
3
3
|
import typing
|
4
4
|
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
5
5
|
|
6
|
+
from sky import catalog
|
6
7
|
from sky import clouds
|
7
8
|
from sky.adaptors import common as adaptors_common
|
8
|
-
from sky.clouds import service_catalog
|
9
9
|
from sky.provision.paperspace import utils
|
10
10
|
from sky.utils import registry
|
11
11
|
from sky.utils import resources_utils
|
@@ -88,7 +88,7 @@ class Paperspace(clouds.Cloud):
|
|
88
88
|
if use_spot:
|
89
89
|
return []
|
90
90
|
else:
|
91
|
-
regions =
|
91
|
+
regions = catalog.get_region_zones_for_instance_type(
|
92
92
|
instance_type, use_spot, 'paperspace')
|
93
93
|
|
94
94
|
if region is not None:
|
@@ -100,8 +100,8 @@ class Paperspace(clouds.Cloud):
|
|
100
100
|
cls,
|
101
101
|
instance_type: str,
|
102
102
|
) -> Tuple[Optional[float], Optional[float]]:
|
103
|
-
return
|
104
|
-
|
103
|
+
return catalog.get_vcpus_mem_from_instance_type(instance_type,
|
104
|
+
clouds='paperspace')
|
105
105
|
|
106
106
|
@classmethod
|
107
107
|
def zones_provision_loop(
|
@@ -130,7 +130,7 @@ class Paperspace(clouds.Cloud):
|
|
130
130
|
region: Optional[str] = None,
|
131
131
|
zone: Optional[str] = None,
|
132
132
|
) -> float:
|
133
|
-
return
|
133
|
+
return catalog.get_hourly_cost(
|
134
134
|
instance_type,
|
135
135
|
use_spot=use_spot,
|
136
136
|
region=region,
|
@@ -163,16 +163,16 @@ class Paperspace(clouds.Cloud):
|
|
163
163
|
disk_tier: Optional[resources_utils.DiskTier] = None,
|
164
164
|
) -> Optional[str]:
|
165
165
|
"""Returns the default instance type for Paperspace."""
|
166
|
-
return
|
167
|
-
|
168
|
-
|
169
|
-
|
166
|
+
return catalog.get_default_instance_type(cpus=cpus,
|
167
|
+
memory=memory,
|
168
|
+
disk_tier=disk_tier,
|
169
|
+
clouds='paperspace')
|
170
170
|
|
171
171
|
@classmethod
|
172
172
|
def get_accelerators_from_instance_type(
|
173
173
|
cls, instance_type: str) -> Optional[Dict[str, Union[int, float]]]:
|
174
|
-
return
|
175
|
-
|
174
|
+
return catalog.get_accelerators_from_instance_type(instance_type,
|
175
|
+
clouds='paperspace')
|
176
176
|
|
177
177
|
@classmethod
|
178
178
|
def get_zone_shell_cmd(cls) -> Optional[str]:
|
@@ -240,17 +240,17 @@ class Paperspace(clouds.Cloud):
|
|
240
240
|
|
241
241
|
assert len(accelerators) == 1, resources
|
242
242
|
acc, acc_count = list(accelerators.items())[0]
|
243
|
-
(instance_list,
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
243
|
+
(instance_list,
|
244
|
+
fuzzy_candidate_list) = (catalog.get_instance_type_for_accelerator(
|
245
|
+
acc,
|
246
|
+
acc_count,
|
247
|
+
use_spot=resources.use_spot,
|
248
|
+
cpus=resources.cpus,
|
249
|
+
memory=resources.memory,
|
250
|
+
region=resources.region,
|
251
|
+
zone=resources.zone,
|
252
|
+
clouds='paperspace',
|
253
|
+
))
|
254
254
|
if instance_list is None:
|
255
255
|
return resources_utils.FeasibleResources([], fuzzy_candidate_list,
|
256
256
|
None)
|
@@ -296,9 +296,7 @@ class Paperspace(clouds.Cloud):
|
|
296
296
|
return None
|
297
297
|
|
298
298
|
def instance_type_exists(self, instance_type: str) -> bool:
|
299
|
-
return
|
299
|
+
return catalog.instance_type_exists(instance_type, 'paperspace')
|
300
300
|
|
301
301
|
def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
|
302
|
-
return
|
303
|
-
zone,
|
304
|
-
clouds='paperspace')
|
302
|
+
return catalog.validate_region_zone(region, zone, clouds='paperspace')
|
sky/clouds/runpod.py
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
import typing
|
4
4
|
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
5
5
|
|
6
|
+
from sky import catalog
|
6
7
|
from sky import clouds
|
7
|
-
from sky.clouds import service_catalog
|
8
8
|
from sky.utils import registry
|
9
9
|
from sky.utils import resources_utils
|
10
10
|
|
@@ -72,7 +72,7 @@ class RunPod(clouds.Cloud):
|
|
72
72
|
use_spot: bool, region: Optional[str],
|
73
73
|
zone: Optional[str]) -> List[clouds.Region]:
|
74
74
|
del accelerators # unused
|
75
|
-
regions =
|
75
|
+
regions = catalog.get_region_zones_for_instance_type(
|
76
76
|
instance_type, use_spot, 'runpod')
|
77
77
|
|
78
78
|
if region is not None:
|
@@ -90,8 +90,8 @@ class RunPod(clouds.Cloud):
|
|
90
90
|
cls,
|
91
91
|
instance_type: str,
|
92
92
|
) -> Tuple[Optional[float], Optional[float]]:
|
93
|
-
return
|
94
|
-
|
93
|
+
return catalog.get_vcpus_mem_from_instance_type(instance_type,
|
94
|
+
clouds='runpod')
|
95
95
|
|
96
96
|
@classmethod
|
97
97
|
def zones_provision_loop(
|
@@ -118,11 +118,11 @@ class RunPod(clouds.Cloud):
|
|
118
118
|
use_spot: bool,
|
119
119
|
region: Optional[str] = None,
|
120
120
|
zone: Optional[str] = None) -> float:
|
121
|
-
return
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
121
|
+
return catalog.get_hourly_cost(instance_type,
|
122
|
+
use_spot=use_spot,
|
123
|
+
region=region,
|
124
|
+
zone=zone,
|
125
|
+
clouds='runpod')
|
126
126
|
|
127
127
|
def accelerators_to_hourly_cost(self,
|
128
128
|
accelerators: Dict[str, int],
|
@@ -144,16 +144,16 @@ class RunPod(clouds.Cloud):
|
|
144
144
|
disk_tier: Optional[resources_utils.DiskTier] = None
|
145
145
|
) -> Optional[str]:
|
146
146
|
"""Returns the default instance type for RunPod."""
|
147
|
-
return
|
148
|
-
|
149
|
-
|
150
|
-
|
147
|
+
return catalog.get_default_instance_type(cpus=cpus,
|
148
|
+
memory=memory,
|
149
|
+
disk_tier=disk_tier,
|
150
|
+
clouds='runpod')
|
151
151
|
|
152
152
|
@classmethod
|
153
153
|
def get_accelerators_from_instance_type(
|
154
154
|
cls, instance_type: str) -> Optional[Dict[str, Union[int, float]]]:
|
155
|
-
return
|
156
|
-
|
155
|
+
return catalog.get_accelerators_from_instance_type(instance_type,
|
156
|
+
clouds='runpod')
|
157
157
|
|
158
158
|
@classmethod
|
159
159
|
def get_zone_shell_cmd(cls) -> Optional[str]:
|
@@ -245,15 +245,15 @@ class RunPod(clouds.Cloud):
|
|
245
245
|
|
246
246
|
assert len(accelerators) == 1, resources
|
247
247
|
acc, acc_count = list(accelerators.items())[0]
|
248
|
-
(instance_list,
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
248
|
+
(instance_list,
|
249
|
+
fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
|
250
|
+
acc,
|
251
|
+
acc_count,
|
252
|
+
use_spot=resources.use_spot,
|
253
|
+
cpus=resources.cpus,
|
254
|
+
region=resources.region,
|
255
|
+
zone=resources.zone,
|
256
|
+
clouds='runpod')
|
257
257
|
if instance_list is None:
|
258
258
|
return resources_utils.FeasibleResources([], fuzzy_candidate_list,
|
259
259
|
None)
|
@@ -302,12 +302,10 @@ class RunPod(clouds.Cloud):
|
|
302
302
|
return None
|
303
303
|
|
304
304
|
def instance_type_exists(self, instance_type: str) -> bool:
|
305
|
-
return
|
305
|
+
return catalog.instance_type_exists(instance_type, 'runpod')
|
306
306
|
|
307
307
|
def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
|
308
|
-
return
|
309
|
-
zone,
|
310
|
-
clouds='runpod')
|
308
|
+
return catalog.validate_region_zone(region, zone, clouds='runpod')
|
311
309
|
|
312
310
|
@classmethod
|
313
311
|
def get_image_size(cls, image_id: str, region: Optional[str]) -> float:
|
sky/clouds/scp.py
CHANGED
@@ -7,10 +7,10 @@ to access the SCP catalog and check credentials for the SCP access.
|
|
7
7
|
import typing
|
8
8
|
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
9
9
|
|
10
|
+
from sky import catalog
|
10
11
|
from sky import clouds
|
11
12
|
from sky import exceptions
|
12
13
|
from sky import sky_logging
|
13
|
-
from sky.clouds import service_catalog
|
14
14
|
from sky.clouds.utils import scp_utils
|
15
15
|
from sky.utils import registry
|
16
16
|
from sky.utils import resources_utils
|
@@ -84,7 +84,7 @@ class SCP(clouds.Cloud):
|
|
84
84
|
|
85
85
|
@classmethod
|
86
86
|
def regions(cls) -> List['clouds.Region']:
|
87
|
-
return
|
87
|
+
return catalog.regions(clouds='scp')
|
88
88
|
|
89
89
|
@classmethod
|
90
90
|
def regions_with_offering(cls, instance_type: Optional[str],
|
@@ -99,7 +99,7 @@ class SCP(clouds.Cloud):
|
|
99
99
|
# Fall back to default regions
|
100
100
|
regions = cls.regions()
|
101
101
|
else:
|
102
|
-
regions =
|
102
|
+
regions = catalog.get_region_zones_for_instance_type(
|
103
103
|
instance_type, use_spot, 'scp')
|
104
104
|
|
105
105
|
if region is not None:
|
@@ -131,11 +131,11 @@ class SCP(clouds.Cloud):
|
|
131
131
|
use_spot: bool,
|
132
132
|
region: Optional[str] = None,
|
133
133
|
zone: Optional[str] = None) -> float:
|
134
|
-
return
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
134
|
+
return catalog.get_hourly_cost(instance_type,
|
135
|
+
use_spot=use_spot,
|
136
|
+
region=region,
|
137
|
+
zone=zone,
|
138
|
+
clouds='scp')
|
139
139
|
|
140
140
|
def accelerators_to_hourly_cost(self,
|
141
141
|
accelerators: Dict[str, int],
|
@@ -156,26 +156,26 @@ class SCP(clouds.Cloud):
|
|
156
156
|
memory: Optional[str] = None,
|
157
157
|
disk_tier: Optional['resources_utils.DiskTier'] = None
|
158
158
|
) -> Optional[str]:
|
159
|
-
return
|
160
|
-
|
161
|
-
|
162
|
-
|
159
|
+
return catalog.get_default_instance_type(cpus=cpus,
|
160
|
+
memory=memory,
|
161
|
+
disk_tier=disk_tier,
|
162
|
+
clouds='scp')
|
163
163
|
|
164
164
|
@classmethod
|
165
165
|
def get_accelerators_from_instance_type(
|
166
166
|
cls,
|
167
167
|
instance_type: str,
|
168
168
|
) -> Optional[Dict[str, Union[int, float]]]:
|
169
|
-
return
|
170
|
-
|
169
|
+
return catalog.get_accelerators_from_instance_type(instance_type,
|
170
|
+
clouds='scp')
|
171
171
|
|
172
172
|
@classmethod
|
173
173
|
def get_vcpus_mem_from_instance_type(
|
174
174
|
cls,
|
175
175
|
instance_type: str,
|
176
176
|
) -> Tuple[Optional[float], Optional[float]]:
|
177
|
-
return
|
178
|
-
|
177
|
+
return catalog.get_vcpus_mem_from_instance_type(instance_type,
|
178
|
+
clouds='scp')
|
179
179
|
|
180
180
|
@classmethod
|
181
181
|
def get_zone_shell_cmd(cls) -> Optional[str]:
|
@@ -223,9 +223,9 @@ class SCP(clouds.Cloud):
|
|
223
223
|
assert region_name in image_id, image_id
|
224
224
|
image_id_str = image_id[region_name]
|
225
225
|
if image_id_str.startswith('skypilot:'):
|
226
|
-
image_id_str =
|
227
|
-
|
228
|
-
|
226
|
+
image_id_str = catalog.get_image_id_from_tag(image_id_str,
|
227
|
+
region_name,
|
228
|
+
clouds='scp')
|
229
229
|
if image_id_str is None:
|
230
230
|
# Raise ResourcesUnavailableError to make sure the failover
|
231
231
|
# in CloudVMRayBackend will be correctly triggered.
|
@@ -238,13 +238,14 @@ class SCP(clouds.Cloud):
|
|
238
238
|
@classmethod
|
239
239
|
def _get_default_ami(cls, region_name: str, instance_type: str) -> str:
|
240
240
|
acc = cls.get_accelerators_from_instance_type(instance_type)
|
241
|
-
image_id =
|
242
|
-
|
243
|
-
|
241
|
+
image_id = catalog.get_image_id_from_tag('skypilot:ubuntu-2004',
|
242
|
+
region_name,
|
243
|
+
clouds='scp')
|
244
244
|
if acc is not None:
|
245
245
|
assert len(acc) == 1, acc
|
246
|
-
image_id =
|
247
|
-
|
246
|
+
image_id = catalog.get_image_id_from_tag('skypilot:gpu-ubuntu-1804',
|
247
|
+
region_name,
|
248
|
+
clouds='scp')
|
248
249
|
if image_id is not None:
|
249
250
|
return image_id
|
250
251
|
# Raise ResourcesUnavailableError to make sure the failover in
|
@@ -302,16 +303,16 @@ class SCP(clouds.Cloud):
|
|
302
303
|
|
303
304
|
assert len(accelerators) == 1, resources
|
304
305
|
acc, acc_count = list(accelerators.items())[0]
|
305
|
-
(instance_list,
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
306
|
+
(instance_list,
|
307
|
+
fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
|
308
|
+
acc,
|
309
|
+
acc_count,
|
310
|
+
use_spot=resources.use_spot,
|
311
|
+
cpus=resources.cpus,
|
312
|
+
memory=resources.memory,
|
313
|
+
region=resources.region,
|
314
|
+
zone=resources.zone,
|
315
|
+
clouds='scp')
|
315
316
|
if instance_list is None:
|
316
317
|
return resources_utils.FeasibleResources([], fuzzy_candidate_list,
|
317
318
|
None)
|
@@ -351,10 +352,10 @@ class SCP(clouds.Cloud):
|
|
351
352
|
return None
|
352
353
|
|
353
354
|
def instance_type_exists(self, instance_type: str) -> bool:
|
354
|
-
return
|
355
|
+
return catalog.instance_type_exists(instance_type, 'scp')
|
355
356
|
|
356
357
|
def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
|
357
|
-
return
|
358
|
+
return catalog.validate_region_zone(region, zone, clouds='scp')
|
358
359
|
|
359
360
|
@staticmethod
|
360
361
|
def _is_disk_size_allowed(resources):
|
sky/clouds/utils/gcp_utils.py
CHANGED
@@ -36,7 +36,8 @@ def is_tpu(resources: Optional['resources_lib.Resources']) -> bool:
|
|
36
36
|
def is_tpu_vm(resources: Optional['resources_lib.Resources']) -> bool:
|
37
37
|
if not is_tpu(resources):
|
38
38
|
return False
|
39
|
-
assert (resources is not None and
|
39
|
+
assert (resources is not None and resources.accelerators is not None and
|
40
|
+
len(resources.accelerators) == 1)
|
40
41
|
acc, _ = list(resources.accelerators.items())[0]
|
41
42
|
if kubernetes_utils.is_tpu_on_gke(acc):
|
42
43
|
return False
|
@@ -48,7 +49,7 @@ def is_tpu_vm(resources: Optional['resources_lib.Resources']) -> bool:
|
|
48
49
|
def is_tpu_vm_pod(resources: Optional['resources_lib.Resources']) -> bool:
|
49
50
|
if not is_tpu_vm(resources):
|
50
51
|
return False
|
51
|
-
assert resources is not None
|
52
|
+
assert resources is not None and resources.accelerators is not None
|
52
53
|
acc, _ = list(resources.accelerators.items())[0]
|
53
54
|
return not acc.endswith('-8')
|
54
55
|
|