skypilot-nightly 1.0.0.dev20250402__py3-none-any.whl → 1.0.0.dev20250404__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 CHANGED
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  import urllib.request
6
6
 
7
7
  # Replaced with the current commit when building the wheels.
8
- _SKYPILOT_COMMIT_SHA = '515e5df7c14cfd425f606de20d4b96d6a897ee7d'
8
+ _SKYPILOT_COMMIT_SHA = 'dfd12c30b89ae96f5596418fed58547c159ff40a'
9
9
 
10
10
 
11
11
  def _get_git_commit():
@@ -35,7 +35,7 @@ def _get_git_commit():
35
35
 
36
36
 
37
37
  __commit__ = _get_git_commit()
38
- __version__ = '1.0.0.dev20250402'
38
+ __version__ = '1.0.0.dev20250404'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
sky/check.py CHANGED
@@ -289,6 +289,12 @@ def _print_checked_cloud(
289
289
  cloud_tuple: The cloud to print the capabilities for.
290
290
  cloud_capabilities: The capabilities for the cloud.
291
291
  """
292
+
293
+ def _yellow_color(str_to_format: str) -> str:
294
+ return (f'{colorama.Fore.LIGHTYELLOW_EX}'
295
+ f'{str_to_format}'
296
+ f'{colorama.Style.RESET_ALL}')
297
+
292
298
  cloud_repr, cloud = cloud_tuple
293
299
  # Print the capabilities for the cloud.
294
300
  # consider cloud enabled if any capability is enabled.
@@ -319,7 +325,7 @@ def _print_checked_cloud(
319
325
  if activated_account is not None:
320
326
  echo(f' Activated account: {activated_account}')
321
327
  for reason, caps in hints_to_capabilities.items():
322
- echo(f' Hint [{", ".join(caps)}]: {reason}')
328
+ echo(f' Hint [{", ".join(caps)}]: {_yellow_color(reason)}')
323
329
  for reason, caps in reasons_to_capabilities.items():
324
330
  echo(f' Reason [{", ".join(caps)}]: {reason}')
325
331
 
sky/clouds/kubernetes.py CHANGED
@@ -679,7 +679,8 @@ class Kubernetes(clouds.Cloud):
679
679
  success = False
680
680
  for context in existing_allowed_contexts:
681
681
  try:
682
- check_result = kubernetes_utils.check_credentials(context)
682
+ check_result = kubernetes_utils.check_credentials(
683
+ context, run_optional_checks=True)
683
684
  if check_result[0]:
684
685
  success = True
685
686
  if check_result[1] is not None:
@@ -328,9 +328,9 @@ def get_common_gpus() -> List[str]:
328
328
  'A100',
329
329
  'A100-80GB',
330
330
  'H100',
331
+ 'H200',
331
332
  'L4',
332
333
  'L40S',
333
- 'P100',
334
334
  'T4',
335
335
  'V100',
336
336
  'V100-32GB',
sky/data/storage.py CHANGED
@@ -273,6 +273,8 @@ MOUNTABLE_STORAGE_MODES = [
273
273
  StorageMode.MOUNT_CACHED,
274
274
  ]
275
275
 
276
+ DEFAULT_STORAGE_MODE = StorageMode.MOUNT
277
+
276
278
 
277
279
  class AbstractStore:
278
280
  """AbstractStore abstracts away the different storage types exposed by
@@ -591,7 +593,7 @@ class Storage(object):
591
593
  source: Optional[SourceType] = None,
592
594
  stores: Optional[List[StoreType]] = None,
593
595
  persistent: Optional[bool] = True,
594
- mode: StorageMode = StorageMode.MOUNT,
596
+ mode: StorageMode = DEFAULT_STORAGE_MODE,
595
597
  sync_on_reconstruction: bool = True,
596
598
  # pylint: disable=invalid-name
597
599
  _is_sky_managed: Optional[bool] = None,
@@ -855,7 +857,7 @@ class Storage(object):
855
857
  is_local_source = False
856
858
  # Storage mounting does not support mounting specific files from
857
859
  # cloud store - ensure path points to only a directory
858
- if mode == StorageMode.MOUNT:
860
+ if mode in MOUNTABLE_STORAGE_MODES:
859
861
  if (split_path.scheme != 'https' and
860
862
  ((split_path.scheme != 'cos' and
861
863
  split_path.path.strip('/') != '') or
@@ -1284,8 +1286,7 @@ class Storage(object):
1284
1286
  # Make mode case insensitive, if specified
1285
1287
  mode = StorageMode(mode_str.upper())
1286
1288
  else:
1287
- # Make sure this keeps the same as the default mode in __init__
1288
- mode = StorageMode.MOUNT
1289
+ mode = DEFAULT_STORAGE_MODE
1289
1290
  persistent = config.pop('persistent', None)
1290
1291
  if persistent is None:
1291
1292
  persistent = True
sky/data/storage_utils.py CHANGED
@@ -223,7 +223,7 @@ def get_excluded_files_from_gitignore(src_dir_path: str) -> List[str]:
223
223
  def get_excluded_files(src_dir_path: str) -> List[str]:
224
224
  # TODO: this could return a huge list of files,
225
225
  # should think of ways to optimize.
226
- """ List files and directories to be excluded."""
226
+ """List files and directories to be excluded."""
227
227
  expand_src_dir_path = os.path.expanduser(src_dir_path)
228
228
  skyignore_path = os.path.join(expand_src_dir_path,
229
229
  constants.SKY_IGNORE_FILE)
@@ -273,12 +273,22 @@ def zip_files_and_folders(items: List[str],
273
273
  zipf.write(item)
274
274
  elif os.path.isdir(item):
275
275
  for root, dirs, files in os.walk(item, followlinks=False):
276
+ # Modify dirs in-place to control os.walk()'s traversal
277
+ # behavior. This filters out excluded directories BEFORE
278
+ # os.walk() visits the files and sub-directories under
279
+ # them, preventing traversal into any excluded directory
280
+ # and its contents.
281
+ # Note: dirs[:] = ... is required for in-place
282
+ # modification.
283
+ dirs[:] = [
284
+ d for d in dirs
285
+ if os.path.join(root, d) not in excluded_files
286
+ ]
287
+
276
288
  # Store directory entries (important for empty
277
289
  # directories)
278
290
  for dir_name in dirs:
279
291
  dir_path = os.path.join(root, dir_name)
280
- if dir_path in excluded_files:
281
- continue
282
292
  # If it's a symlink, store it as a symlink
283
293
  if os.path.islink(dir_path):
284
294
  _store_symlink(zipf, dir_path, is_dir=True)
sky/jobs/controller.py CHANGED
@@ -227,13 +227,13 @@ class JobsController:
227
227
  self._backend, cluster_name)
228
228
 
229
229
  if job_status == job_lib.JobStatus.SUCCEEDED:
230
- end_time = managed_job_utils.try_to_get_job_end_time(
230
+ success_end_time = managed_job_utils.try_to_get_job_end_time(
231
231
  self._backend, cluster_name)
232
232
  # The job is done. Set the job to SUCCEEDED first before start
233
233
  # downloading and streaming the logs to make it more responsive.
234
234
  managed_job_state.set_succeeded(self._job_id,
235
235
  task_id,
236
- end_time=end_time,
236
+ end_time=success_end_time,
237
237
  callback_func=callback_func)
238
238
  logger.info(
239
239
  f'Managed job {self._job_id} (task: {task_id}) SUCCEEDED. '
@@ -299,23 +299,40 @@ class JobsController:
299
299
  if job_status is not None and not job_status.is_terminal():
300
300
  # The multi-node job is still running, continue monitoring.
301
301
  continue
302
- elif job_status in job_lib.JobStatus.user_code_failure_states():
302
+ elif (job_status
303
+ in job_lib.JobStatus.user_code_failure_states() or
304
+ job_status == job_lib.JobStatus.FAILED_DRIVER):
303
305
  # The user code has probably crashed, fail immediately.
304
306
  end_time = managed_job_utils.try_to_get_job_end_time(
305
307
  self._backend, cluster_name)
306
308
  logger.info(
307
- 'The user job failed. Please check the logs below.\n'
309
+ f'The user job failed ({job_status}). Please check the '
310
+ 'logs below.\n'
308
311
  f'== Logs of the user job (ID: {self._job_id}) ==\n')
309
312
 
310
313
  self._download_log_and_stream(task_id, handle)
314
+
315
+ failure_reason = (
316
+ 'To see the details, run: '
317
+ f'sky jobs logs --controller {self._job_id}')
318
+
311
319
  managed_job_status = (
312
320
  managed_job_state.ManagedJobStatus.FAILED)
313
321
  if job_status == job_lib.JobStatus.FAILED_SETUP:
314
322
  managed_job_status = (
315
323
  managed_job_state.ManagedJobStatus.FAILED_SETUP)
316
- failure_reason = (
317
- 'To see the details, run: '
318
- f'sky jobs logs --controller {self._job_id}')
324
+ elif job_status == job_lib.JobStatus.FAILED_DRIVER:
325
+ # FAILED_DRIVER is kind of an internal error, so we mark
326
+ # this as FAILED_CONTROLLER, even though the failure is
327
+ # not strictly within the controller.
328
+ managed_job_status = (
329
+ managed_job_state.ManagedJobStatus.FAILED_CONTROLLER
330
+ )
331
+ failure_reason = (
332
+ 'The job driver on the remote cluster failed. This '
333
+ 'can be caused by the job taking too much memory '
334
+ 'or other resources. Try adding more memory, CPU, '
335
+ f'or disk in your job definition. {failure_reason}')
319
336
  should_restart_on_failure = (
320
337
  self._strategy_executor.should_restart_on_failure())
321
338
  if should_restart_on_failure:
@@ -337,6 +354,21 @@ class JobsController:
337
354
  end_time=end_time,
338
355
  callback_func=callback_func)
339
356
  return False
357
+ elif job_status is not None:
358
+ # Either the job is cancelled (should not happen) or in some
359
+ # unknown new state that we do not handle.
360
+ logger.error(f'Unknown job status: {job_status}')
361
+ failure_reason = (
362
+ f'Unknown job status {job_status}. To see the details, '
363
+ f'run: sky jobs logs --controller {self._job_id}')
364
+ managed_job_state.set_failed(
365
+ self._job_id,
366
+ task_id,
367
+ failure_type=managed_job_state.ManagedJobStatus.
368
+ FAILED_CONTROLLER,
369
+ failure_reason=failure_reason,
370
+ callback_func=callback_func)
371
+ return False
340
372
  else:
341
373
  # Although the cluster is healthy, we fail to access the
342
374
  # job status. Try to recover the job (will not restart the
sky/jobs/server/server.py CHANGED
@@ -160,7 +160,7 @@ async def dashboard(request: fastapi.Request,
160
160
  async with httpx.AsyncClient() as client:
161
161
  response = await client.request('GET',
162
162
  dashboard_url,
163
- timeout=1)
163
+ timeout=5)
164
164
  break # Connection successful, proceed with the request
165
165
  except Exception as e: # pylint: disable=broad-except
166
166
  # We catch all exceptions to gracefully handle unknown
@@ -272,7 +272,8 @@ def get_gke_accelerator_name(accelerator: str) -> str:
272
272
  if accelerator == 'H100':
273
273
  # H100 is named as H100-80GB in GKE.
274
274
  accelerator = 'H100-80GB'
275
- if accelerator in ('A100-80GB', 'L4', 'H100-80GB', 'H100-MEGA-80GB'):
275
+ if accelerator in ('A100-80GB', 'L4', 'H100-80GB', 'H100-MEGA-80GB',
276
+ 'B200'):
276
277
  # A100-80GB, L4, H100-80GB and H100-MEGA-80GB
277
278
  # have a different name pattern.
278
279
  return 'nvidia-{}'.format(accelerator.lower())
@@ -1096,7 +1097,9 @@ def get_accelerator_label_key_value(
1096
1097
  ResourcesUnavailableError: Can be raised from the following conditions:
1097
1098
  - The cluster does not have GPU/TPU resources
1098
1099
  (nvidia.com/gpu, google.com/tpu)
1099
- - The cluster does not have GPU/TPU labels setup correctly
1100
+ - The cluster has GPU/TPU resources, but no node in the cluster has
1101
+ an accelerator label.
1102
+ - The cluster has a node with an invalid accelerator label value.
1100
1103
  - The cluster doesn't have any nodes with acc_type GPU/TPU
1101
1104
  """
1102
1105
  # Check if the cluster has GPU resources
@@ -1291,7 +1294,8 @@ def get_external_ip(network_mode: Optional[
1291
1294
 
1292
1295
 
1293
1296
  def check_credentials(context: Optional[str],
1294
- timeout: int = kubernetes.API_TIMEOUT) -> \
1297
+ timeout: int = kubernetes.API_TIMEOUT,
1298
+ run_optional_checks: bool = False) -> \
1295
1299
  Tuple[bool, Optional[str]]:
1296
1300
  """Check if the credentials in kubeconfig file are valid
1297
1301
 
@@ -1333,6 +1337,9 @@ def check_credentials(context: Optional[str],
1333
1337
  f'{common_utils.format_exception(e, use_bracket=True)}')
1334
1338
 
1335
1339
  # If we reach here, the credentials are valid and Kubernetes cluster is up.
1340
+ if not run_optional_checks:
1341
+ return True, None
1342
+
1336
1343
  # We now do softer checks to check if exec based auth is used and to
1337
1344
  # see if the cluster is GPU-enabled.
1338
1345
 
@@ -1344,16 +1351,36 @@ def check_credentials(context: Optional[str],
1344
1351
  # `sky launch --gpus <gpu>` and the optimizer does not list Kubernetes as a
1345
1352
  # provider if their cluster GPUs are not setup correctly.
1346
1353
  gpu_msg = ''
1347
- try:
1348
- get_accelerator_label_key_value(context,
1349
- acc_type='',
1350
- acc_count=0,
1351
- check_mode=True)
1352
- except exceptions.ResourcesUnavailableError as e:
1353
- # If GPUs are not available, we return cluster as enabled (since it can
1354
- # be a CPU-only cluster) but we also return the exception message which
1355
- # serves as a hint for how to enable GPU access.
1356
- gpu_msg = str(e)
1354
+ unlabeled_nodes = get_unlabeled_accelerator_nodes(context)
1355
+ if unlabeled_nodes:
1356
+ gpu_msg = (f'Cluster has {len(unlabeled_nodes)} nodes with '
1357
+ f'accelerators that are not labeled. '
1358
+ f'To label the nodes, run '
1359
+ f'`python -m sky.utils.kubernetes.gpu_labeler '
1360
+ f'--context {context}`')
1361
+ else:
1362
+ try:
1363
+ # This function raises a ResourcesUnavailableError in three cases:
1364
+ # 1. If no node in cluster has GPU/TPU resource in its capacity.
1365
+ # (e.g. google.com/tpu, nvidia.com/gpu)
1366
+ # 2. If at least one node in cluster has GPU/TPU resource in its
1367
+ # capacity, but no node in the cluster has an accelerator label.
1368
+ # 3. If an accelerator label on a node is invalid.
1369
+ # Exception 2 is a special case of a cluster having at least one
1370
+ # unlabelled node, which is caught in
1371
+ # `get_unlabeled_accelerator_nodes`.
1372
+ # Therefore, if `get_unlabeled_accelerator_nodes` detects unlabelled
1373
+ # nodes, we skip this check.
1374
+ get_accelerator_label_key_value(context,
1375
+ acc_type='',
1376
+ acc_count=0,
1377
+ check_mode=True)
1378
+ except exceptions.ResourcesUnavailableError as e:
1379
+ # If GPUs are not available, we return cluster as enabled
1380
+ # (since it can be a CPU-only cluster) but we also return the
1381
+ # exception message which serves as a hint for how to enable
1382
+ # GPU access.
1383
+ gpu_msg = str(e)
1357
1384
  if exec_msg and gpu_msg:
1358
1385
  return True, f'{gpu_msg}\n Additionally, {exec_msg}'
1359
1386
  elif gpu_msg:
@@ -2457,6 +2484,43 @@ def dict_to_k8s_object(object_dict: Dict[str, Any], object_type: 'str') -> Any:
2457
2484
  return kubernetes.api_client().deserialize(fake_kube_response, object_type)
2458
2485
 
2459
2486
 
2487
+ def get_unlabeled_accelerator_nodes(context: Optional[str] = None) -> List[Any]:
2488
+ """Gets a list of unlabeled GPU nodes in the cluster.
2489
+
2490
+ This function returns a list of nodes that have GPU resources but no label
2491
+ that indicates the accelerator type.
2492
+
2493
+ Args:
2494
+ context: The context to check.
2495
+
2496
+ Returns:
2497
+ List[Any]: List of unlabeled nodes with accelerators.
2498
+ """
2499
+ nodes = get_kubernetes_nodes(context=context)
2500
+ nodes_with_accelerator = []
2501
+ for node in nodes:
2502
+ if get_gpu_resource_key() in node.status.capacity:
2503
+ nodes_with_accelerator.append(node)
2504
+
2505
+ label_formatter, _ = detect_gpu_label_formatter(context)
2506
+ if not label_formatter:
2507
+ return nodes_with_accelerator
2508
+ else:
2509
+ label_keys = label_formatter.get_label_keys()
2510
+
2511
+ unlabeled_nodes = []
2512
+ for node in nodes_with_accelerator:
2513
+ labeled = False
2514
+ for label_key in label_keys:
2515
+ if label_key in node.metadata.labels:
2516
+ labeled = True
2517
+ break
2518
+ if not labeled:
2519
+ unlabeled_nodes.append(node)
2520
+
2521
+ return unlabeled_nodes
2522
+
2523
+
2460
2524
  def get_kubernetes_node_info(
2461
2525
  context: Optional[str] = None) -> Dict[str, models.KubernetesNodeInfo]:
2462
2526
  """Gets the resource information for all the nodes in the cluster.
sky/task.py CHANGED
@@ -745,7 +745,7 @@ class Task:
745
745
 
746
746
  # Evaluate if the task requires FUSE and set the requires_fuse flag
747
747
  for _, storage_obj in self.storage_mounts.items():
748
- if storage_obj.mode == storage_lib.StorageMode.MOUNT:
748
+ if storage_obj.mode in storage_lib.MOUNTABLE_STORAGE_MODES:
749
749
  for r in self.resources:
750
750
  r.requires_fuse = True
751
751
  break
@@ -924,7 +924,7 @@ class Task:
924
924
  'Storage mount destination path cannot be cloud storage'
925
925
  )
926
926
 
927
- if storage_obj.mode == storage_lib.StorageMode.MOUNT:
927
+ if storage_obj.mode in storage_lib.MOUNTABLE_STORAGE_MODES:
928
928
  # If any storage is using MOUNT mode, we need to enable FUSE in
929
929
  # the resources.
930
930
  for r in self.resources:
@@ -916,7 +916,7 @@ def maybe_translate_local_file_mounts_and_sync_up(task: 'task_lib.Task',
916
916
  name=bucket_name,
917
917
  source=local_fm_path,
918
918
  persistent=False,
919
- mode=storage_lib.StorageMode.MOUNT,
919
+ mode=storage_lib.DEFAULT_STORAGE_MODE,
920
920
  stores=stores,
921
921
  _is_sky_managed=not bucket_wth_prefix,
922
922
  _bucket_sub_path=file_mounts_tmp_subpath)
@@ -51,6 +51,18 @@ def label(context: Optional[str] = None):
51
51
  print(reason)
52
52
  return
53
53
 
54
+ unlabeled_gpu_nodes = kubernetes_utils.get_unlabeled_accelerator_nodes()
55
+
56
+ if not unlabeled_gpu_nodes:
57
+ print('No unlabeled GPU nodes found in the cluster. If you have '
58
+ 'unlabeled GPU nodes, please ensure that they have the resource '
59
+ f'`{kubernetes_utils.get_gpu_resource_key()}: <number of GPUs>` '
60
+ 'in their capacity.')
61
+ return
62
+
63
+ print(f'Found {len(unlabeled_gpu_nodes)} '
64
+ 'unlabeled GPU nodes in the cluster')
65
+
54
66
  sky_dir = os.path.dirname(sky.__file__)
55
67
  manifest_dir = os.path.join(sky_dir, 'utils/kubernetes')
56
68
 
@@ -77,17 +89,6 @@ def label(context: Optional[str] = None):
77
89
  with open(job_manifest_path, 'r', encoding='utf-8') as file:
78
90
  job_manifest = yaml.safe_load(file)
79
91
 
80
- # Iterate over nodes
81
- nodes = kubernetes_utils.get_kubernetes_nodes(context=context)
82
-
83
- # Get the list of nodes with GPUs
84
- gpu_nodes = []
85
- for node in nodes:
86
- if kubernetes_utils.get_gpu_resource_key() in node.status.capacity:
87
- gpu_nodes.append(node)
88
-
89
- print(f'Found {len(gpu_nodes)} GPU node(s) in the cluster')
90
-
91
92
  # Check if the 'nvidia' RuntimeClass exists
92
93
  try:
93
94
  nvidia_exists = kubernetes_utils.check_nvidia_runtime_class(
@@ -108,7 +109,7 @@ def label(context: Optional[str] = None):
108
109
  else:
109
110
  print('Using default RuntimeClass for GPU labeling.')
110
111
 
111
- for node in gpu_nodes:
112
+ for node in unlabeled_gpu_nodes:
112
113
  node_name = node.metadata.name
113
114
 
114
115
  # Modify the job manifest for the current node
@@ -122,21 +123,16 @@ def label(context: Optional[str] = None):
122
123
  # Create the job for this node`
123
124
  batch_v1.create_namespaced_job(namespace, job_manifest)
124
125
  print(f'Created GPU labeler job for node {node_name}')
125
- if not gpu_nodes:
126
- print('No GPU nodes found in the cluster. If you have GPU nodes, '
127
- 'please ensure that they have the label '
128
- f'`{kubernetes_utils.get_gpu_resource_key()}: <number of GPUs>`')
129
- else:
130
- context_str = f' --context {context}' if context else ''
131
- print(
132
- f'GPU labeling started - this may take 10 min or more to complete.'
133
- '\nTo check the status of GPU labeling jobs, run '
134
- f'`kubectl get jobs -n kube-system '
135
- f'-l job=sky-gpu-labeler{context_str}`'
136
- '\nYou can check if nodes have been labeled by running '
137
- f'`kubectl describe nodes{context_str}` '
138
- 'and looking for labels of the format '
139
- '`skypilot.co/accelerator: <gpu_name>`. ')
126
+
127
+ context_str = f' --context {context}' if context else ''
128
+ print(f'GPU labeling started - this may take 10 min or more to complete.'
129
+ '\nTo check the status of GPU labeling jobs, run '
130
+ f'`kubectl get jobs -n kube-system '
131
+ f'-l job=sky-gpu-labeler{context_str}`'
132
+ '\nYou can check if nodes have been labeled by running '
133
+ f'`kubectl describe nodes{context_str}` '
134
+ 'and looking for labels of the format '
135
+ '`skypilot.co/accelerator: <gpu_name>`. ')
140
136
 
141
137
 
142
138
  def main():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250402
3
+ Version: 1.0.0.dev20250404
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -1,7 +1,7 @@
1
- sky/__init__.py,sha256=RCyN48gsf7Sx7Y7utA4xGJ1RIMT8wt5rMyEh62L6l-I,6428
1
+ sky/__init__.py,sha256=DAFp3ES0ncxRm0D0gyRcS1gr1FFsn4gkUD6kWcFNHlg,6428
2
2
  sky/admin_policy.py,sha256=hPo02f_A32gCqhUueF0QYy1fMSSKqRwYEg_9FxScN_s,3248
3
3
  sky/authentication.py,sha256=ND011K_-Ud1dVZF37A9KrwYir_ihJXcHc7iDWmuBc8Q,22872
4
- sky/check.py,sha256=oktScSPsHIyO7ZrVHy3QaybB6-s_D6eMEjmICAiUtDo,15902
4
+ sky/check.py,sha256=PPNQnaaZBA9_aogJpN4gnG4XWnTqkd74c-rBYDkDRDY,16101
5
5
  sky/cli.py,sha256=Zcio2ak6zX_5_N_lshDUqCvoV6NEOmGS6Tp6AgS9VAk,222446
6
6
  sky/cloud_stores.py,sha256=cmKdSoB4bmwrd-Z1NCZBFb6IIJt0jKVxkGPoX86280s,26606
7
7
  sky/core.py,sha256=G3n6z0dyvoU4FJVGnnTu3kFdu_EtQC1l57er5voRAX0,47926
@@ -14,7 +14,7 @@ sky/optimizer.py,sha256=uutziDwxyq-f5n31YXgCF9fmqx5vndIU8g_avvGWuGc,58532
14
14
  sky/resources.py,sha256=2qc5U09MFDaJjI1dHcThcRodpMGY7HyXzQn8eC4lvbE,72402
15
15
  sky/sky_logging.py,sha256=pID2RINjH62n7SZpv70DuN8BSFYdCfTJ2ScGQpVmugg,5725
16
16
  sky/skypilot_config.py,sha256=CdaIbPL_7ECG5laOARca4p9df_6NLhT-bO8WnalxZAY,8839
17
- sky/task.py,sha256=zKKdD918VNGVFI3hgN2NT3N2zNUfTp2SdluSN83Xlf4,55697
17
+ sky/task.py,sha256=kepCHV_evVg9EKnXaKW9Stg1bQAZlaF4UQocwlR3M3g,55709
18
18
  sky/adaptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  sky/adaptors/aws.py,sha256=iH55Cm6eXWwufAG0Dgk7LTQcADawNa3ELrBH1m6yuSY,7617
20
20
  sky/adaptors/azure.py,sha256=r8xkjRgZZQfsSExNdguFa6c5fCLcUhZrFV8zs62VExo,21986
@@ -55,7 +55,7 @@ sky/clouds/do.py,sha256=P38l4otp2AuDReUH9Ii621ht9s-NIyb7-R37jbtjHk8,11580
55
55
  sky/clouds/fluidstack.py,sha256=jIqW1MLe55MVME1PATZm8e6_FsiTnJawW7OdytPW0aM,12666
56
56
  sky/clouds/gcp.py,sha256=sUJ9LXUnMxYm6OYZ5P-z1dJHxgVILuC3OW3eFSTNCv8,56919
57
57
  sky/clouds/ibm.py,sha256=XtuPN8QgrwJdb1qb_b-7KwAE2tf_N9wh9eEfi2tcg-s,22013
58
- sky/clouds/kubernetes.py,sha256=ivk6GlAbhj3oDaFfcIzwz2x7qRBrzShglV4FfzikqS0,36169
58
+ sky/clouds/kubernetes.py,sha256=SNRilcl_JYvaMDoYw0jnMtfaSi7FKQycCiJVmX6-4f4,36216
59
59
  sky/clouds/lambda_cloud.py,sha256=rR2YrZ6flEbKKpQAm60eKNjiMDYvH2hqzaCo3Hx4Ffw,12916
60
60
  sky/clouds/nebius.py,sha256=4D7C2NQYI-BNhXWNOyAXNAZj7-5nN33VQW1sxfSGt9w,14662
61
61
  sky/clouds/oci.py,sha256=YO4kjSsHBmAVH4z1TuVP72zfmC0BXte4E0xIyZir9N4,27622
@@ -64,7 +64,7 @@ sky/clouds/runpod.py,sha256=P486CMN-Mt3R-7jMVd3XIGjLWYy0X5B74dK_IgAp2Cg,12149
64
64
  sky/clouds/scp.py,sha256=6OucFxDIOZFA1Z_QZwGqblW4zdBljhUjhamssvchu_0,15971
65
65
  sky/clouds/vast.py,sha256=1AZaM71dI837oeuMZEXN4muHsH3CKRLjBAPcPy1QqV4,11296
66
66
  sky/clouds/vsphere.py,sha256=yRLQESpuSOdfs4KaVTMSQJqf_3mr4VysGqSo1zs1ZtU,12453
67
- sky/clouds/service_catalog/__init__.py,sha256=Fbm8kKpVTCoIumnY-FWL0X4xMpKu_qwYAxyuVXu4IBQ,14997
67
+ sky/clouds/service_catalog/__init__.py,sha256=WCYMAhek36Ee1HjJL9LP287a70hv2NMA_8plcZDI4Z4,14997
68
68
  sky/clouds/service_catalog/aws_catalog.py,sha256=PbYD37rU_8m-Y_5xTglW21ppxI0GecM1sdO1yXuPwHE,13518
69
69
  sky/clouds/service_catalog/azure_catalog.py,sha256=5Q51x_WEKvQ2YSgJvZHRH3URlbwIstYuwpjaWW_wJlw,8149
70
70
  sky/clouds/service_catalog/common.py,sha256=6TCUE1kg2FvUZXpV2ktrnsRchUYNTGx8rq16m5Nztek,27766
@@ -105,11 +105,11 @@ sky/data/__init__.py,sha256=Nhaf1NURisXpZuwWANa2IuCyppIuc720FRwqSE2oEwY,184
105
105
  sky/data/data_transfer.py,sha256=-JcnVa_LT0kQejcSCnBwYtxhuuaNDPf_Q5oz62p186c,11973
106
106
  sky/data/data_utils.py,sha256=ryKUPgNBdeDmGIttqK-J7AKdfc70INTuYH5GOWm3C9g,33581
107
107
  sky/data/mounting_utils.py,sha256=ph2p8cYB28FODgxK5ibiD4B4iMD7T3or99zNQaD9HLs,20162
108
- sky/data/storage.py,sha256=ifNAvrzjS4jFkQHT6sWlATb_lVTQHkgvg9nFcWLq2k4,236674
109
- sky/data/storage_utils.py,sha256=0r0_I4pCnRYK2vf7syGtvIVyuSeI8w_gPnyxfYGEbcU,12698
108
+ sky/data/storage.py,sha256=85LcC64yxfd5bzTijGZVyMZV41NyzUhOn0xJZieK2Dc,236652
109
+ sky/data/storage_utils.py,sha256=fDEEErxu97XhOtwPdnNBqRukWcfRT4eTBUhrSGrAvsY,13255
110
110
  sky/jobs/__init__.py,sha256=qoI53-xXE0-SOkrLWigvhgFXjk7dWE0OTqGPYIk-kmM,1458
111
111
  sky/jobs/constants.py,sha256=1XiIqdR5dEgGgepLKWkZCRT3MYSsMBR-dO7N4RTsjwg,3088
112
- sky/jobs/controller.py,sha256=4G1CKI7M7D1BgJLbJMeqzg0iDDv7FR4ObB1BKZFFjhk,29585
112
+ sky/jobs/controller.py,sha256=d5qQYHadesfFgU7-dYtt2trZwyd5IzvlVJeNh5O8OiA,31386
113
113
  sky/jobs/recovery_strategy.py,sha256=RLrqq8B1likxTknPzt3_BqO26sFVpoatxzUuGfwc18A,26170
114
114
  sky/jobs/scheduler.py,sha256=luQgrCDaDP6bI7oIbaqzxg4qMJtUIVswypnOGUklGtw,13270
115
115
  sky/jobs/state.py,sha256=tDULLH6DVs4oKUIKhh0UAn3RzyVGuIUtEq5kW7K1Ojw,44585
@@ -122,7 +122,7 @@ sky/jobs/dashboard/templates/index.html,sha256=NrlTDiEHJDt7sViwWgXUSxVCyVl_IEukE
122
122
  sky/jobs/server/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
123
123
  sky/jobs/server/core.py,sha256=IHbGMEEbEdNS_ivIStv3rYVH6XodFgufrzZb3HGF9uo,25257
124
124
  sky/jobs/server/dashboard_utils.py,sha256=2Mbx40W1pQqPEPHsSDbHeaF0j5cgyKy-_A9Owdwp_AQ,2315
125
- sky/jobs/server/server.py,sha256=pLobr0ITZJmhWUX-QrUwpZMgm7qy4_PHFuAnp4Xikac,8386
125
+ sky/jobs/server/server.py,sha256=jk6IopWbn9DbzNzLxM4EcYzWCRnXPXthfNqMDFmtonc,8386
126
126
  sky/provision/__init__.py,sha256=LzOo5LjkRXwSf29dUqN14YbjzQu3liXLQcmweTeZ4dE,6457
127
127
  sky/provision/common.py,sha256=E8AlSUFcn0FYQq1erNmoVfMAdsF9tP2yxfyk-9PLvQU,10286
128
128
  sky/provision/constants.py,sha256=oc_XDUkcoLQ_lwDy5yMeMSWviKS0j0s1c0pjlvpNeWY,800
@@ -166,7 +166,7 @@ sky/provision/kubernetes/constants.py,sha256=dZCUV8FOO9Gct80sdqeubKnxeW3CGl-u5mx
166
166
  sky/provision/kubernetes/instance.py,sha256=oag17OtuiqU-1RjkgW9NvEpxSGUFIYdI7M61S-YmPu8,50503
167
167
  sky/provision/kubernetes/network.py,sha256=AtcOM8wPs_-UlQJhGEQGP6Lh4HIgdx63Y0iWEhP5jyc,12673
168
168
  sky/provision/kubernetes/network_utils.py,sha256=6uck1aBkgtm-gGBitU3_hEUp8j14ZuG_4Xo70ReZYXs,11654
169
- sky/provision/kubernetes/utils.py,sha256=37esnQgQgeXfxwWyMqAo6SXCz0EyVvKECy2DOWISDEo,124630
169
+ sky/provision/kubernetes/utils.py,sha256=D7xfk6RjqLAsERpJMxQ8ozu-D3pRTz_bRszKQeMsVno,127188
170
170
  sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml,sha256=AMzYzlY0JIlfBWj5eX054Rc1XDW2thUcLSOGMJVhIdA,229
171
171
  sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml,sha256=RtTq4F1QUmR2Uunb6zuuRaPhV7hpesz4saHjn3Ncsb4,2010
172
172
  sky/provision/lambda_cloud/__init__.py,sha256=6EEvSgtUeEiup9ivIFevHmgv0GqleroO2X0K7TRa2nE,612
@@ -318,7 +318,7 @@ sky/utils/common.py,sha256=P4oVXFATUYgkruHX92cN12SJBtfb8DiOOYZtbN1kvP0,1927
318
318
  sky/utils/common_utils.py,sha256=s5YIo9wtFCwWLfLRW7fCjlC9BzqQKPGatWQjrEyYqpc,31680
319
319
  sky/utils/config_utils.py,sha256=VQ2E3DQ2XysD-kul-diSrxn_pXWsDMfKAev91OiJQ1Q,9041
320
320
  sky/utils/control_master_utils.py,sha256=iD4M0onjYOdZ2RuxjwMBl4KhafHXJzuHjvqlBUnu-VE,1450
321
- sky/utils/controller_utils.py,sha256=QUG3CVYLnN5F_Q1Jdbir0Oh9FxImXkdbMI9WanluSLA,49802
321
+ sky/utils/controller_utils.py,sha256=mrmkerYyeu7gsCQ56cB3AjCz0r9WaN7teqXUItA47oQ,49805
322
322
  sky/utils/dag_utils.py,sha256=sAus0aL1wtuuFZSDnpO4LY-6WK4u5iJY952oWQzHo3Y,7532
323
323
  sky/utils/db_utils.py,sha256=K2-OHPg0FeHCarevMdWe0IWzm6wWumViEeYeJuGoFUE,3747
324
324
  sky/utils/env_options.py,sha256=aaD6GoYK0LaZIqjOEZ-R7eccQuiRriW3EuLWtOI5En8,1578
@@ -344,15 +344,15 @@ sky/utils/kubernetes/deploy_remote_cluster.sh,sha256=EQMBC0VUqe3UaiYvwkNq4P6U9bk
344
344
  sky/utils/kubernetes/exec_kubeconfig_converter.py,sha256=fE1SnteoxI05EaugnWeV82hXwZTVHmbXsh1aaZAgF3c,2548
345
345
  sky/utils/kubernetes/generate_kind_config.py,sha256=_TNLnifA_r7-CRq083IP1xjelYqiLjzQX9ohuqYpDH8,3187
346
346
  sky/utils/kubernetes/generate_kubeconfig.sh,sha256=MBvXJio0PeujZSCXiRKE_pa6HCTiU9qBzR1WrXccVSY,10477
347
- sky/utils/kubernetes/gpu_labeler.py,sha256=1Mblw9pIWgmI5Kob29k5EEuPmip_JXYLD9Hztq6X4v0,7069
347
+ sky/utils/kubernetes/gpu_labeler.py,sha256=MKsEiWitn-LOG3-OEdBZ-MXJd_L3ztdB9JrhD6D2T1w,6912
348
348
  sky/utils/kubernetes/k8s_gpu_labeler_job.yaml,sha256=k0TBoQ4zgf79-sVkixKSGYFHQ7ZWF5gdVIZPupCCo9A,1224
349
349
  sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml,sha256=VLKT2KKimZu1GDg_4AIlIt488oMQvhRZWwsj9vBbPUg,3812
350
350
  sky/utils/kubernetes/kubernetes_deploy_utils.py,sha256=HPVgNt-wbCVPd9dpDFiA7t2mzQLpjXHJ61eiwRbEr-c,10378
351
351
  sky/utils/kubernetes/rsync_helper.sh,sha256=h4YwrPFf9727CACnMJvF3EyK_0OeOYKKt4su_daKekw,1256
352
352
  sky/utils/kubernetes/ssh_jump_lifecycle_manager.py,sha256=Kq1MDygF2IxFmu9FXpCxqucXLmeUrvs6OtRij6XTQbo,6554
353
- skypilot_nightly-1.0.0.dev20250402.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
354
- skypilot_nightly-1.0.0.dev20250402.dist-info/METADATA,sha256=bXDuFvGHbo-NYrZxLyYxZ8OLwzvAttIz0x_fAQwsW_g,18552
355
- skypilot_nightly-1.0.0.dev20250402.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
356
- skypilot_nightly-1.0.0.dev20250402.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
357
- skypilot_nightly-1.0.0.dev20250402.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
358
- skypilot_nightly-1.0.0.dev20250402.dist-info/RECORD,,
353
+ skypilot_nightly-1.0.0.dev20250404.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
354
+ skypilot_nightly-1.0.0.dev20250404.dist-info/METADATA,sha256=HjDx6IDyOIoJ7lFpgxXPO2n8tIyTUh87PO4FAp-ZWcc,18552
355
+ skypilot_nightly-1.0.0.dev20250404.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
356
+ skypilot_nightly-1.0.0.dev20250404.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
357
+ skypilot_nightly-1.0.0.dev20250404.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
358
+ skypilot_nightly-1.0.0.dev20250404.dist-info/RECORD,,