skypilot-nightly 1.0.0.dev20250216__py3-none-any.whl → 1.0.0.dev20250218__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 +48 -22
- sky/adaptors/aws.py +2 -1
- sky/adaptors/azure.py +4 -4
- sky/adaptors/cloudflare.py +4 -4
- sky/adaptors/kubernetes.py +8 -8
- sky/authentication.py +42 -45
- sky/backends/backend.py +2 -2
- sky/backends/backend_utils.py +108 -221
- sky/backends/cloud_vm_ray_backend.py +283 -282
- sky/benchmark/benchmark_utils.py +6 -2
- sky/check.py +40 -28
- sky/cli.py +1213 -1116
- sky/client/__init__.py +1 -0
- sky/client/cli.py +5644 -0
- sky/client/common.py +345 -0
- sky/client/sdk.py +1757 -0
- sky/cloud_stores.py +12 -6
- sky/clouds/__init__.py +0 -2
- sky/clouds/aws.py +20 -13
- sky/clouds/azure.py +5 -3
- sky/clouds/cloud.py +1 -1
- sky/clouds/cudo.py +2 -1
- sky/clouds/do.py +7 -3
- sky/clouds/fluidstack.py +3 -2
- sky/clouds/gcp.py +10 -8
- sky/clouds/ibm.py +8 -7
- sky/clouds/kubernetes.py +7 -6
- sky/clouds/lambda_cloud.py +8 -7
- sky/clouds/oci.py +4 -3
- sky/clouds/paperspace.py +2 -1
- sky/clouds/runpod.py +2 -1
- sky/clouds/scp.py +8 -7
- sky/clouds/service_catalog/__init__.py +3 -3
- sky/clouds/service_catalog/aws_catalog.py +7 -1
- sky/clouds/service_catalog/common.py +4 -2
- sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +2 -2
- sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +1 -0
- sky/clouds/utils/oci_utils.py +1 -1
- sky/clouds/vast.py +2 -1
- sky/clouds/vsphere.py +2 -1
- sky/core.py +263 -99
- sky/dag.py +4 -0
- sky/data/mounting_utils.py +2 -1
- sky/data/storage.py +97 -35
- sky/data/storage_utils.py +69 -9
- sky/exceptions.py +138 -5
- sky/execution.py +47 -50
- sky/global_user_state.py +105 -22
- sky/jobs/__init__.py +12 -14
- sky/jobs/client/__init__.py +0 -0
- sky/jobs/client/sdk.py +296 -0
- sky/jobs/constants.py +30 -1
- sky/jobs/controller.py +12 -6
- sky/jobs/dashboard/dashboard.py +2 -6
- sky/jobs/recovery_strategy.py +22 -29
- sky/jobs/server/__init__.py +1 -0
- sky/jobs/{core.py → server/core.py} +101 -34
- sky/jobs/server/dashboard_utils.py +64 -0
- sky/jobs/server/server.py +182 -0
- sky/jobs/utils.py +32 -23
- sky/models.py +27 -0
- sky/optimizer.py +22 -22
- sky/provision/__init__.py +6 -3
- sky/provision/aws/config.py +2 -2
- sky/provision/aws/instance.py +1 -1
- sky/provision/azure/instance.py +1 -1
- sky/provision/cudo/instance.py +1 -1
- sky/provision/do/instance.py +1 -1
- sky/provision/do/utils.py +0 -5
- sky/provision/fluidstack/fluidstack_utils.py +4 -3
- sky/provision/fluidstack/instance.py +4 -2
- sky/provision/gcp/instance.py +1 -1
- sky/provision/instance_setup.py +2 -2
- sky/provision/kubernetes/constants.py +8 -0
- sky/provision/kubernetes/instance.py +1 -1
- sky/provision/kubernetes/utils.py +67 -76
- sky/provision/lambda_cloud/instance.py +3 -15
- sky/provision/logging.py +1 -1
- sky/provision/oci/instance.py +7 -4
- sky/provision/paperspace/instance.py +1 -1
- sky/provision/provisioner.py +3 -2
- sky/provision/runpod/instance.py +1 -1
- sky/provision/vast/instance.py +1 -1
- sky/provision/vsphere/instance.py +2 -11
- sky/resources.py +63 -47
- sky/serve/__init__.py +6 -10
- sky/serve/client/__init__.py +0 -0
- sky/serve/client/sdk.py +366 -0
- sky/serve/constants.py +3 -0
- sky/serve/replica_managers.py +10 -10
- sky/serve/serve_utils.py +56 -36
- sky/serve/server/__init__.py +0 -0
- sky/serve/{core.py → server/core.py} +37 -17
- sky/serve/server/server.py +117 -0
- sky/serve/service.py +8 -1
- sky/server/__init__.py +1 -0
- sky/server/common.py +442 -0
- sky/server/constants.py +21 -0
- sky/server/html/log.html +174 -0
- sky/server/requests/__init__.py +0 -0
- sky/server/requests/executor.py +462 -0
- sky/server/requests/payloads.py +481 -0
- sky/server/requests/queues/__init__.py +0 -0
- sky/server/requests/queues/mp_queue.py +76 -0
- sky/server/requests/requests.py +567 -0
- sky/server/requests/serializers/__init__.py +0 -0
- sky/server/requests/serializers/decoders.py +192 -0
- sky/server/requests/serializers/encoders.py +166 -0
- sky/server/server.py +1095 -0
- sky/server/stream_utils.py +144 -0
- sky/setup_files/MANIFEST.in +1 -0
- sky/setup_files/dependencies.py +12 -4
- sky/setup_files/setup.py +1 -1
- sky/sky_logging.py +9 -13
- sky/skylet/autostop_lib.py +2 -2
- sky/skylet/constants.py +46 -12
- sky/skylet/events.py +5 -6
- sky/skylet/job_lib.py +78 -66
- sky/skylet/log_lib.py +17 -11
- sky/skypilot_config.py +79 -94
- sky/task.py +119 -73
- sky/templates/aws-ray.yml.j2 +4 -4
- sky/templates/azure-ray.yml.j2 +3 -2
- sky/templates/cudo-ray.yml.j2 +3 -2
- sky/templates/fluidstack-ray.yml.j2 +3 -2
- sky/templates/gcp-ray.yml.j2 +3 -2
- sky/templates/ibm-ray.yml.j2 +3 -2
- sky/templates/jobs-controller.yaml.j2 +1 -12
- sky/templates/kubernetes-ray.yml.j2 +3 -2
- sky/templates/lambda-ray.yml.j2 +3 -2
- sky/templates/oci-ray.yml.j2 +3 -2
- sky/templates/paperspace-ray.yml.j2 +3 -2
- sky/templates/runpod-ray.yml.j2 +3 -2
- sky/templates/scp-ray.yml.j2 +3 -2
- sky/templates/skypilot-server-kubernetes-proxy.sh +36 -0
- sky/templates/vsphere-ray.yml.j2 +4 -2
- sky/templates/websocket_proxy.py +64 -0
- sky/usage/constants.py +8 -0
- sky/usage/usage_lib.py +45 -11
- sky/utils/accelerator_registry.py +33 -53
- sky/utils/admin_policy_utils.py +2 -1
- sky/utils/annotations.py +51 -0
- sky/utils/cli_utils/status_utils.py +33 -3
- sky/utils/cluster_utils.py +356 -0
- sky/utils/command_runner.py +69 -14
- sky/utils/common.py +74 -0
- sky/utils/common_utils.py +133 -93
- sky/utils/config_utils.py +204 -0
- sky/utils/control_master_utils.py +2 -3
- sky/utils/controller_utils.py +133 -147
- sky/utils/dag_utils.py +72 -24
- sky/utils/kubernetes/deploy_remote_cluster.sh +2 -2
- sky/utils/kubernetes/exec_kubeconfig_converter.py +73 -0
- sky/utils/kubernetes/kubernetes_deploy_utils.py +228 -0
- sky/utils/log_utils.py +83 -23
- sky/utils/message_utils.py +81 -0
- sky/utils/registry.py +127 -0
- sky/utils/resources_utils.py +2 -2
- sky/utils/rich_utils.py +213 -34
- sky/utils/schemas.py +19 -2
- sky/{status_lib.py → utils/status_lib.py} +12 -7
- sky/utils/subprocess_utils.py +51 -35
- sky/utils/timeline.py +7 -2
- sky/utils/ux_utils.py +95 -25
- {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/METADATA +8 -3
- {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/RECORD +170 -132
- sky/clouds/cloud_registry.py +0 -76
- sky/utils/cluster_yaml_utils.py +0 -24
- {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/top_level.txt +0 -0
sky/benchmark/benchmark_utils.py
CHANGED
@@ -23,8 +23,8 @@ from sky import backends
|
|
23
23
|
from sky import clouds
|
24
24
|
from sky import data
|
25
25
|
from sky import global_user_state
|
26
|
+
from sky import optimizer
|
26
27
|
from sky import sky_logging
|
27
|
-
from sky import status_lib
|
28
28
|
from sky.backends import backend_utils
|
29
29
|
from sky.benchmark import benchmark_state
|
30
30
|
from sky.data import storage as storage_lib
|
@@ -34,6 +34,7 @@ from sky.skylet import log_lib
|
|
34
34
|
from sky.utils import common_utils
|
35
35
|
from sky.utils import log_utils
|
36
36
|
from sky.utils import rich_utils
|
37
|
+
from sky.utils import status_lib
|
37
38
|
from sky.utils import subprocess_utils
|
38
39
|
from sky.utils import ux_utils
|
39
40
|
|
@@ -100,7 +101,9 @@ def _get_optimized_resources(
|
|
100
101
|
task = sky.Task()
|
101
102
|
task.set_resources(resources)
|
102
103
|
|
103
|
-
|
104
|
+
# Do not use `sky.optimize` here, as this should be called on the API
|
105
|
+
# server side.
|
106
|
+
dag = optimizer.Optimizer.optimize(dag, quiet=True)
|
104
107
|
task = dag.tasks[0]
|
105
108
|
optimized_resources.append(task.best_resources)
|
106
109
|
return optimized_resources
|
@@ -183,6 +186,7 @@ def _create_benchmark_bucket() -> Tuple[str, str]:
|
|
183
186
|
# Create a benchmark bucket.
|
184
187
|
logger.info(f'Creating a bucket {bucket_name} to save the benchmark logs.')
|
185
188
|
storage = data.Storage(bucket_name, source=None, persistent=True)
|
189
|
+
storage.construct()
|
186
190
|
storage.add_store(bucket_type)
|
187
191
|
|
188
192
|
# Save the bucket name and type to the config.
|
sky/check.py
CHANGED
@@ -6,22 +6,28 @@ from typing import Dict, Iterable, List, Optional, Tuple, Union
|
|
6
6
|
|
7
7
|
import click
|
8
8
|
import colorama
|
9
|
-
import rich
|
10
9
|
|
11
10
|
from sky import clouds as sky_clouds
|
12
11
|
from sky import exceptions
|
13
12
|
from sky import global_user_state
|
14
13
|
from sky import skypilot_config
|
15
14
|
from sky.adaptors import cloudflare
|
15
|
+
from sky.utils import registry
|
16
|
+
from sky.utils import rich_utils
|
16
17
|
from sky.utils import ux_utils
|
17
18
|
|
19
|
+
CHECK_MARK_EMOJI = '\U00002714' # Heavy check mark unicode
|
20
|
+
PARTY_POPPER_EMOJI = '\U0001F389' # Party popper unicode
|
21
|
+
|
18
22
|
|
19
23
|
def check(
|
20
24
|
quiet: bool = False,
|
21
25
|
verbose: bool = False,
|
22
26
|
clouds: Optional[Iterable[str]] = None,
|
23
|
-
) ->
|
24
|
-
echo = (lambda *_args, **_kwargs: None
|
27
|
+
) -> List[str]:
|
28
|
+
echo = (lambda *_args, **_kwargs: None
|
29
|
+
) if quiet else lambda *args, **kwargs: click.echo(
|
30
|
+
*args, **kwargs, color=True)
|
25
31
|
echo('Checking credentials to enable clouds for SkyPilot.')
|
26
32
|
enabled_clouds = []
|
27
33
|
disabled_clouds = []
|
@@ -30,14 +36,13 @@ def check(
|
|
30
36
|
cloud_tuple: Tuple[str, Union[sky_clouds.Cloud,
|
31
37
|
ModuleType]]) -> None:
|
32
38
|
cloud_repr, cloud = cloud_tuple
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
echo('\r', nl=False)
|
39
|
+
with rich_utils.safe_status(f'Checking {cloud_repr}...'):
|
40
|
+
try:
|
41
|
+
ok, reason = cloud.check_credentials()
|
42
|
+
except Exception: # pylint: disable=broad-except
|
43
|
+
# Catch all exceptions to prevent a single cloud from blocking
|
44
|
+
# the check for other clouds.
|
45
|
+
ok, reason = False, traceback.format_exc()
|
41
46
|
status_msg = 'enabled' if ok else 'disabled'
|
42
47
|
styles = {'fg': 'green', 'bold': False} if ok else {'dim': True}
|
43
48
|
echo(' ' + click.style(f'{cloud_repr}: {status_msg}', **styles) +
|
@@ -61,12 +66,12 @@ def check(
|
|
61
66
|
if cloud_name.lower().startswith('cloudflare'):
|
62
67
|
return cloudflare.SKY_CHECK_NAME, cloudflare
|
63
68
|
else:
|
64
|
-
cloud_obj =
|
69
|
+
cloud_obj = registry.CLOUD_REGISTRY.from_str(cloud_name)
|
65
70
|
assert cloud_obj is not None, f'Cloud {cloud_name!r} not found'
|
66
71
|
return repr(cloud_obj), cloud_obj
|
67
72
|
|
68
73
|
def get_all_clouds():
|
69
|
-
return tuple([repr(c) for c in
|
74
|
+
return tuple([repr(c) for c in registry.CLOUD_REGISTRY.values()] +
|
70
75
|
[cloudflare.SKY_CHECK_NAME])
|
71
76
|
|
72
77
|
if clouds is not None:
|
@@ -94,7 +99,7 @@ def check(
|
|
94
99
|
for cloud_tuple in sorted(clouds_to_check):
|
95
100
|
check_one_cloud(cloud_tuple)
|
96
101
|
|
97
|
-
# Cloudflare is not a real cloud in
|
102
|
+
# Cloudflare is not a real cloud in registry.CLOUD_REGISTRY, and should
|
98
103
|
# not be inserted into the DB (otherwise `sky launch` and other code would
|
99
104
|
# error out when it's trying to look it up in the registry).
|
100
105
|
enabled_clouds_set = {
|
@@ -154,11 +159,14 @@ def check(
|
|
154
159
|
|
155
160
|
# Pretty print for UX.
|
156
161
|
if not quiet:
|
157
|
-
enabled_clouds_str = '\n
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
+
enabled_clouds_str = '\n ' + '\n '.join([
|
163
|
+
_format_enabled_cloud(cloud)
|
164
|
+
for cloud in sorted(all_enabled_clouds)
|
165
|
+
])
|
166
|
+
echo(f'\n{colorama.Fore.GREEN}{PARTY_POPPER_EMOJI} '
|
167
|
+
f'Enabled clouds {PARTY_POPPER_EMOJI}'
|
168
|
+
f'{colorama.Style.RESET_ALL}{enabled_clouds_str}')
|
169
|
+
return enabled_clouds
|
162
170
|
|
163
171
|
|
164
172
|
def get_cached_enabled_clouds_or_refresh(
|
@@ -205,7 +213,7 @@ def get_cloud_credential_file_mounts(
|
|
205
213
|
# enabled clouds because users may have partial credentials for some
|
206
214
|
# clouds to access their specific resources (e.g. cloud storage) but
|
207
215
|
# not have the complete credentials to pass sky check.
|
208
|
-
clouds =
|
216
|
+
clouds = registry.CLOUD_REGISTRY.values()
|
209
217
|
file_mounts = {}
|
210
218
|
for cloud in clouds:
|
211
219
|
if (excluded_clouds is not None and
|
@@ -226,11 +234,15 @@ def get_cloud_credential_file_mounts(
|
|
226
234
|
|
227
235
|
|
228
236
|
def _format_enabled_cloud(cloud_name: str) -> str:
|
237
|
+
|
238
|
+
def _green_color(cloud_name: str) -> str:
|
239
|
+
return f'{colorama.Fore.GREEN}{cloud_name}{colorama.Style.RESET_ALL}'
|
240
|
+
|
229
241
|
if cloud_name == repr(sky_clouds.Kubernetes()):
|
230
242
|
# Get enabled contexts for Kubernetes
|
231
243
|
existing_contexts = sky_clouds.Kubernetes.existing_allowed_contexts()
|
232
244
|
if not existing_contexts:
|
233
|
-
return cloud_name
|
245
|
+
return _green_color(cloud_name)
|
234
246
|
|
235
247
|
# Check if allowed_contexts is explicitly set in config
|
236
248
|
allowed_contexts = skypilot_config.get_nested(
|
@@ -240,15 +252,15 @@ def _format_enabled_cloud(cloud_name: str) -> str:
|
|
240
252
|
if allowed_contexts is not None:
|
241
253
|
contexts_formatted = []
|
242
254
|
for i, context in enumerate(existing_contexts):
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
# use colorama as we do in the rest of the codebase.
|
247
|
-
symbol = ('└── ' if i == len(existing_contexts) - 1 else '├── ')
|
255
|
+
symbol = (ux_utils.INDENT_LAST_SYMBOL
|
256
|
+
if i == len(existing_contexts) -
|
257
|
+
1 else ux_utils.INDENT_SYMBOL)
|
248
258
|
contexts_formatted.append(f'\n {symbol}{context}')
|
249
259
|
context_info = f'Allowed contexts:{"".join(contexts_formatted)}'
|
250
260
|
else:
|
251
261
|
context_info = f'Active context: {existing_contexts[0]}'
|
252
262
|
|
253
|
-
return f'{cloud_name}
|
254
|
-
|
263
|
+
return (f'{_green_color(cloud_name)}\n'
|
264
|
+
f' {colorama.Style.DIM}{context_info}'
|
265
|
+
f'{colorama.Style.RESET_ALL}')
|
266
|
+
return _green_color(cloud_name)
|