skypilot-nightly 1.0.0.dev20241112__py3-none-any.whl → 1.0.0.dev20241113__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/resources.py CHANGED
@@ -14,6 +14,7 @@ from sky import sky_logging
14
14
  from sky import skypilot_config
15
15
  from sky.clouds import service_catalog
16
16
  from sky.provision import docker_utils
17
+ from sky.provision.kubernetes import utils as kubernetes_utils
17
18
  from sky.skylet import constants
18
19
  from sky.utils import accelerator_registry
19
20
  from sky.utils import common_utils
@@ -582,36 +583,46 @@ class Resources:
582
583
  acc, _ = list(accelerators.items())[0]
583
584
  if 'tpu' in acc.lower():
584
585
  if self.cloud is None:
585
- self._cloud = clouds.GCP()
586
- assert self.cloud.is_same_cloud(
587
- clouds.GCP()), 'Cloud must be GCP.'
586
+ if kubernetes_utils.is_tpu_on_gke(acc):
587
+ self._cloud = clouds.Kubernetes()
588
+ else:
589
+ self._cloud = clouds.GCP()
590
+ assert (self.cloud.is_same_cloud(clouds.GCP()) or
591
+ self.cloud.is_same_cloud(clouds.Kubernetes())), (
592
+ 'Cloud must be GCP or Kubernetes for TPU '
593
+ 'accelerators.')
594
+
588
595
  if accelerator_args is None:
589
596
  accelerator_args = {}
597
+
590
598
  use_tpu_vm = accelerator_args.get('tpu_vm', True)
591
- if self.instance_type is not None and use_tpu_vm:
592
- if self.instance_type != 'TPU-VM':
593
- with ux_utils.print_exception_no_traceback():
594
- raise ValueError(
595
- 'Cannot specify instance type'
596
- f' (got "{self.instance_type}") for TPU VM.')
597
- if 'runtime_version' not in accelerator_args:
598
-
599
- def _get_default_runtime_version() -> str:
600
- if not use_tpu_vm:
601
- return '2.12.0'
602
- # TPU V5 requires a newer runtime version.
603
- if acc.startswith('tpu-v5'):
604
- return 'v2-alpha-tpuv5'
605
- # TPU V6e requires a newer runtime version.
606
- if acc.startswith('tpu-v6e'):
607
- return 'v2-alpha-tpuv6e'
608
- return 'tpu-vm-base'
609
-
610
- accelerator_args['runtime_version'] = (
611
- _get_default_runtime_version())
612
- logger.info(
613
- 'Missing runtime_version in accelerator_args, using'
614
- f' default ({accelerator_args["runtime_version"]})')
599
+ if (self.cloud.is_same_cloud(clouds.GCP()) and
600
+ not kubernetes_utils.is_tpu_on_gke(acc)):
601
+ if 'runtime_version' not in accelerator_args:
602
+
603
+ def _get_default_runtime_version() -> str:
604
+ if not use_tpu_vm:
605
+ return '2.12.0'
606
+ # TPU V5 requires a newer runtime version.
607
+ if acc.startswith('tpu-v5'):
608
+ return 'v2-alpha-tpuv5'
609
+ # TPU V6e requires a newer runtime version.
610
+ elif acc.startswith('tpu-v6e'):
611
+ return 'v2-alpha-tpuv6e'
612
+ return 'tpu-vm-base'
613
+
614
+ accelerator_args['runtime_version'] = (
615
+ _get_default_runtime_version())
616
+ logger.info(
617
+ 'Missing runtime_version in accelerator_args, using'
618
+ f' default ({accelerator_args["runtime_version"]})')
619
+
620
+ if self.instance_type is not None and use_tpu_vm:
621
+ if self.instance_type != 'TPU-VM':
622
+ with ux_utils.print_exception_no_traceback():
623
+ raise ValueError(
624
+ 'Cannot specify instance type (got '
625
+ f'{self.instance_type!r}) for TPU VM.')
615
626
 
616
627
  self._accelerators = accelerators
617
628
  self._accelerator_args = accelerator_args
sky/serve/serve_utils.py CHANGED
@@ -592,15 +592,26 @@ def get_latest_version_with_min_replicas(
592
592
 
593
593
 
594
594
  def _follow_replica_logs(
595
- file: TextIO,
596
- cluster_name: str,
597
- *,
598
- finish_stream: Callable[[], bool],
599
- exit_if_stream_end: bool = False,
600
- no_new_content_timeout: Optional[int] = None) -> Iterator[str]:
601
- line = ''
602
- log_file = None
603
- no_new_content_cnt = 0
595
+ file: TextIO,
596
+ cluster_name: str,
597
+ *,
598
+ should_stop: Callable[[], bool],
599
+ stop_on_eof: bool = False,
600
+ idle_timeout_seconds: Optional[int] = None,
601
+ ) -> Iterator[str]:
602
+ """Follows logs for a replica, handling nested log files.
603
+
604
+ Args:
605
+ file: Log file to read from.
606
+ cluster_name: Name of the cluster being launched.
607
+ should_stop: Callback that returns True when streaming should stop.
608
+ stop_on_eof: If True, stop when reaching end of file.
609
+ idle_timeout_seconds: If set, stop after these many seconds without
610
+ new content.
611
+
612
+ Yields:
613
+ Log lines from the main file and any nested log files.
614
+ """
604
615
 
605
616
  def cluster_is_up() -> bool:
606
617
  cluster_record = global_user_state.get_cluster_from_name(cluster_name)
@@ -608,51 +619,52 @@ def _follow_replica_logs(
608
619
  return False
609
620
  return cluster_record['status'] == status_lib.ClusterStatus.UP
610
621
 
611
- while True:
612
- tmp = file.readline()
613
- if tmp is not None and tmp != '':
614
- no_new_content_cnt = 0
615
- line += tmp
616
- if '\n' in line or '\r' in line:
617
- # Tailing detailed progress for user. All logs in skypilot is
618
- # of format `To view detailed progress: tail -n100 -f *.log`.
619
- x = re.match(_SKYPILOT_PROVISION_LOG_PATTERN, line)
620
- if x is not None:
621
- log_file = os.path.expanduser(x.group(1))
622
- elif re.match(_SKYPILOT_LOG_PATTERN, line) is None:
623
- # Not print other logs (file sync logs) since we lack
624
- # utility to determine when these log files are finished
625
- # writing.
626
- # TODO(tian): Not skip these logs since there are small
627
- # chance that error will happen in file sync. Need to find
628
- # a better way to do this.
629
- yield line
630
- # Output next line first since it indicates the process is
631
- # starting. For our launching logs, it's always:
632
- # Launching on <cloud> <region> (<zone>)
633
- if log_file is not None:
634
- with open(log_file, 'r', newline='',
635
- encoding='utf-8') as f:
636
- # We still exit if more than 10 seconds without new
637
- # content to avoid any internal bug that causes
638
- # the launch failed and cluster status remains INIT.
639
- for l in _follow_replica_logs(
640
- f,
641
- cluster_name,
642
- finish_stream=cluster_is_up,
643
- exit_if_stream_end=exit_if_stream_end,
644
- no_new_content_timeout=10):
645
- yield l
646
- log_file = None
647
- line = ''
648
- else:
649
- if exit_if_stream_end or finish_stream():
650
- break
651
- if no_new_content_timeout is not None:
652
- if no_new_content_cnt >= no_new_content_timeout:
653
- break
654
- no_new_content_cnt += 1
655
- time.sleep(1)
622
+ def process_line(line: str) -> Iterator[str]:
623
+ # Tailing detailed progress for user. All logs in skypilot is
624
+ # of format `To view detailed progress: tail -n100 -f *.log`.
625
+ # Check if the line is directing users to view logs
626
+ provision_log_prompt = re.match(_SKYPILOT_PROVISION_LOG_PATTERN, line)
627
+ other_log_prompt = re.match(_SKYPILOT_LOG_PATTERN, line)
628
+
629
+ if provision_log_prompt is not None:
630
+ nested_log_path = os.path.expanduser(provision_log_prompt.group(1))
631
+ with open(nested_log_path, 'r', newline='', encoding='utf-8') as f:
632
+ # We still exit if more than 10 seconds without new content
633
+ # to avoid any internal bug that causes the launch to fail
634
+ # while cluster status remains INIT.
635
+ # Originally, we output the next line first before printing
636
+ # the launching logs. Since the next line is always
637
+ # `Launching on <cloud> <region> (<zone>)`, we output it first
638
+ # to indicate the process is starting.
639
+ # TODO(andyl): After refactor #4323, the above logic is broken,
640
+ # but coincidentally with the new UX 3.0, the `Cluster launched`
641
+ # message is printed first, making the output appear correct.
642
+ # Explaining this since it's technically a breaking change
643
+ # for this refactor PR #4323. Will remove soon in a fix PR
644
+ # for adapting the serve.follow_logs to the new UX.
645
+ yield from _follow_replica_logs(f,
646
+ cluster_name,
647
+ should_stop=cluster_is_up,
648
+ stop_on_eof=stop_on_eof,
649
+ idle_timeout_seconds=10)
650
+ return
651
+
652
+ if other_log_prompt is not None:
653
+ # Now we skip other logs (file sync logs) since we lack
654
+ # utility to determine when these log files are finished
655
+ # writing.
656
+ # TODO(tian): We should not skip these logs since there are
657
+ # small chance that error will happen in file sync. Need to
658
+ # find a better way to do this.
659
+ return
660
+
661
+ yield line
662
+
663
+ return log_utils.follow_logs(file,
664
+ should_stop=should_stop,
665
+ stop_on_eof=stop_on_eof,
666
+ process_line=process_line,
667
+ idle_timeout_seconds=idle_timeout_seconds)
656
668
 
657
669
 
658
670
  def stream_replica_logs(service_name: str, replica_id: int,
@@ -687,14 +699,17 @@ def stream_replica_logs(service_name: str, replica_id: int,
687
699
  raise ValueError(
688
700
  _FAILED_TO_FIND_REPLICA_MSG.format(replica_id=replica_id))
689
701
 
690
- finish_stream = (
702
+ replica_provisioned = (
691
703
  lambda: _get_replica_status() != serve_state.ReplicaStatus.PROVISIONING)
692
704
  with open(launch_log_file_name, 'r', newline='', encoding='utf-8') as f:
693
- for line in _follow_replica_logs(f,
694
- replica_cluster_name,
695
- finish_stream=finish_stream,
696
- exit_if_stream_end=not follow):
705
+ for line in _follow_replica_logs(
706
+ f,
707
+ replica_cluster_name,
708
+ should_stop=replica_provisioned,
709
+ stop_on_eof=not follow,
710
+ ):
697
711
  print(line, end='', flush=True)
712
+
698
713
  if (not follow and
699
714
  _get_replica_status() == serve_state.ReplicaStatus.PROVISIONING):
700
715
  # Early exit if not following the logs.
@@ -719,22 +734,6 @@ def stream_replica_logs(service_name: str, replica_id: int,
719
734
  return ''
720
735
 
721
736
 
722
- def _follow_logs(file: TextIO, *, finish_stream: Callable[[], bool],
723
- exit_if_stream_end: bool) -> Iterator[str]:
724
- line = ''
725
- while True:
726
- tmp = file.readline()
727
- if tmp is not None and tmp != '':
728
- line += tmp
729
- if '\n' in line or '\r' in line:
730
- yield line
731
- line = ''
732
- else:
733
- if exit_if_stream_end or finish_stream():
734
- break
735
- time.sleep(1)
736
-
737
-
738
737
  def stream_serve_process_logs(service_name: str, stream_controller: bool,
739
738
  follow: bool) -> str:
740
739
  msg = check_service_status_healthy(service_name)
@@ -753,9 +752,11 @@ def stream_serve_process_logs(service_name: str, stream_controller: bool,
753
752
 
754
753
  with open(os.path.expanduser(log_file), 'r', newline='',
755
754
  encoding='utf-8') as f:
756
- for line in _follow_logs(f,
757
- finish_stream=_service_is_terminal,
758
- exit_if_stream_end=not follow):
755
+ for line in log_utils.follow_logs(
756
+ f,
757
+ should_stop=_service_is_terminal,
758
+ stop_on_eof=not follow,
759
+ ):
759
760
  print(line, end='', flush=True)
760
761
  return ''
761
762
 
sky/skylet/log_lib.py CHANGED
@@ -320,11 +320,8 @@ def run_bash_command_with_log(bash_command: str,
320
320
  # Need this `-i` option to make sure `source ~/.bashrc` work.
321
321
  inner_command = f'/bin/bash -i {script_path}'
322
322
 
323
- subprocess_cmd: Union[str, List[str]]
324
- subprocess_cmd = inner_command
325
-
326
323
  return run_with_log(
327
- subprocess_cmd,
324
+ inner_command,
328
325
  log_path,
329
326
  stream_logs=stream_logs,
330
327
  with_ray=with_ray,
@@ -283,12 +283,15 @@ available_node_types:
283
283
 
284
284
  restartPolicy: Never
285
285
 
286
- # Add node selector if GPUs are requested:
286
+ # Add node selector if GPU/TPUs are requested:
287
287
  {% if (k8s_acc_label_key is not none and k8s_acc_label_value is not none) or (k8s_spot_label_key is not none) %}
288
288
  nodeSelector:
289
289
  {% if k8s_acc_label_key is not none and k8s_acc_label_value is not none %}
290
290
  {{k8s_acc_label_key}}: {{k8s_acc_label_value}}
291
291
  {% endif %}
292
+ {% if k8s_topology_label_key is not none and k8s_topology_label_value is not none %}
293
+ {{k8s_topology_label_key}}: {{k8s_topology_label_value}}
294
+ {% endif %}
292
295
  {% if k8s_spot_label_key is not none %}
293
296
  {{k8s_spot_label_key}}: {{k8s_spot_label_value|tojson}}
294
297
  {% endif %}
@@ -409,14 +412,24 @@ available_node_types:
409
412
  requests:
410
413
  cpu: {{cpus}}
411
414
  memory: {{memory}}G
412
- nvidia.com/gpu: {{accelerator_count}}
415
+ {% if k8s_resource_key is not none %}
416
+ # Number of requested google.com/tpu must be equal to the total
417
+ # number of available TPU chips on the TPU slice node either it
418
+ # being a node from multi-host TPU slice or single-host TPU
419
+ # slice. Example reference:
420
+ # https://cloud.google.com/kubernetes-engine/docs/concepts/tpus#how_tpus_work
421
+ {{k8s_resource_key}}: {{accelerator_count}}
422
+ {% endif %}
413
423
  {% if k8s_fuse_device_required %}
414
424
  # Kubernetes resource exposed by the fuse device manager
415
425
  # https://gitlab.com/arm-research/smarter/smarter-device-manager
416
426
  smarter-devices/fuse: "1"
417
427
  {% endif %}
418
428
  limits:
419
- nvidia.com/gpu: {{accelerator_count}} # Limits need to be defined for GPU requests
429
+ # Limits need to be defined for GPU/TPU requests
430
+ {% if k8s_resource_key is not none %}
431
+ {{k8s_resource_key}}: {{accelerator_count}}
432
+ {% endif %}
420
433
  {% if k8s_fuse_device_required %}
421
434
  smarter-devices/fuse: "1"
422
435
  {% endif %}
@@ -451,6 +464,19 @@ setup_commands:
451
464
  sudo grep -e '^DefaultTasksMax' /etc/systemd/system.conf || (sudo bash -c 'echo "DefaultTasksMax=infinity" >> /etc/systemd/system.conf'); sudo systemctl set-property user-$(id -u $(whoami)).slice TasksMax=infinity; sudo systemctl daemon-reload;
452
465
  mkdir -p ~/.ssh; (grep -Pzo -q "Host \*\n StrictHostKeyChecking no" ~/.ssh/config) || printf "Host *\n StrictHostKeyChecking no\n" >> ~/.ssh/config;
453
466
  [ -f /etc/fuse.conf ] && sudo sed -i 's/#user_allow_other/user_allow_other/g' /etc/fuse.conf || (sudo sh -c 'echo "user_allow_other" > /etc/fuse.conf'); # This is needed for `-o allow_other` option for `goofys`;
467
+ {% if tpu_requested %}
468
+ # The /tmp/tpu_logs directory is where TPU-related logs, such as logs from
469
+ # the TPU runtime, are written. These capture runtime information about the
470
+ # TPU execution, including any warnings, errors, or general activity of
471
+ # the TPU driver. By default, the /tmp/tpu_logs directory is created with
472
+ # 755 permissions, and the user of the provisioned pod is not necessarily
473
+ # a root. Hence, we need to update the write permission so the logs can be
474
+ # properly written.
475
+ # TODO(Doyoung): Investigate to see why TPU workload fails to run without
476
+ # execution permission, such as granting 766 to log file. Check if it's a
477
+ # must and see if there's a workaround to grant minimum permission.
478
+ - sudo chmod 777 /tmp/tpu_logs;
479
+ {% endif %}
454
480
 
455
481
  # Format: `REMOTE_PATH : LOCAL_PATH`
456
482
  file_mounts: {
@@ -101,7 +101,7 @@ def label():
101
101
  # Get the list of nodes with GPUs
102
102
  gpu_nodes = []
103
103
  for node in nodes:
104
- if 'nvidia.com/gpu' in node.status.capacity:
104
+ if kubernetes_utils.GPU_RESOURCE_KEY in node.status.capacity:
105
105
  gpu_nodes.append(node)
106
106
 
107
107
  print(f'Found {len(gpu_nodes)} GPU nodes in the cluster')
@@ -142,7 +142,7 @@ def label():
142
142
  if len(gpu_nodes) == 0:
143
143
  print('No GPU nodes found in the cluster. If you have GPU nodes, '
144
144
  'please ensure that they have the label '
145
- '`nvidia.com/gpu: <number of GPUs>`')
145
+ f'`{kubernetes_utils.GPU_RESOURCE_KEY}: <number of GPUs>`')
146
146
  else:
147
147
  print('GPU labeling started - this may take 10 min or more to complete.'
148
148
  '\nTo check the status of GPU labeling jobs, run '
sky/utils/log_utils.py CHANGED
@@ -1,7 +1,8 @@
1
1
  """Logging utils."""
2
2
  import enum
3
+ import time
3
4
  import types
4
- from typing import List, Optional, Type
5
+ from typing import Callable, Iterator, List, Optional, TextIO, Type
5
6
 
6
7
  import colorama
7
8
  import pendulum
@@ -284,3 +285,53 @@ def readable_time_duration(start: Optional[float],
284
285
  diff = diff.replace('hour', 'hr')
285
286
 
286
287
  return diff
288
+
289
+
290
+ def follow_logs(
291
+ file: TextIO,
292
+ *,
293
+ should_stop: Callable[[], bool],
294
+ stop_on_eof: bool = False,
295
+ process_line: Optional[Callable[[str], Iterator[str]]] = None,
296
+ idle_timeout_seconds: Optional[int] = None,
297
+ ) -> Iterator[str]:
298
+ """Streams and processes logs line by line from a file.
299
+
300
+ Args:
301
+ file: File object to read logs from.
302
+ should_stop: Callback that returns True when streaming should stop.
303
+ stop_on_eof: If True, stop when reaching end of file.
304
+ process_line: Optional callback to transform/filter each line.
305
+ idle_timeout_seconds: If set, stop after these many seconds without
306
+ new content.
307
+
308
+ Yields:
309
+ Log lines, possibly transformed by process_line if provided.
310
+ """
311
+ current_line: str = ''
312
+ seconds_without_content: int = 0
313
+
314
+ while True:
315
+ content = file.readline()
316
+
317
+ if not content:
318
+ if stop_on_eof or should_stop():
319
+ break
320
+
321
+ if idle_timeout_seconds is not None:
322
+ if seconds_without_content >= idle_timeout_seconds:
323
+ break
324
+ seconds_without_content += 1
325
+
326
+ time.sleep(1)
327
+ continue
328
+
329
+ seconds_without_content = 0
330
+ current_line += content
331
+
332
+ if '\n' in current_line or '\r' in current_line:
333
+ if process_line is not None:
334
+ yield from process_line(current_line)
335
+ else:
336
+ yield current_line
337
+ current_line = ''
sky/utils/timeline.py CHANGED
@@ -9,6 +9,7 @@ import json
9
9
  import os
10
10
  import threading
11
11
  import time
12
+ import traceback
12
13
  from typing import Callable, Optional, Union
13
14
 
14
15
  import filelock
@@ -48,8 +49,9 @@ class Event:
48
49
  'ph': 'B',
49
50
  'ts': f'{time.time() * 10 ** 6: .3f}',
50
51
  })
52
+ event_begin['args'] = {'stack': '\n'.join(traceback.format_stack())}
51
53
  if self._message is not None:
52
- event_begin['args'] = {'message': self._message}
54
+ event_begin['args']['message'] = self._message
53
55
  _events.append(event_begin)
54
56
 
55
57
  def end(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20241112
3
+ Version: 1.0.0.dev20241113
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -1,16 +1,16 @@
1
- sky/__init__.py,sha256=8VuuTyDTVZB1BaeWD7OwBFZwpwweQkb0DNyPpsitRQs,5882
1
+ sky/__init__.py,sha256=IquLJLfu65jmWJdveTrz1ZfMnTqlLTEAAFhTJXJavR0,5882
2
2
  sky/admin_policy.py,sha256=hPo02f_A32gCqhUueF0QYy1fMSSKqRwYEg_9FxScN_s,3248
3
3
  sky/authentication.py,sha256=pAdCT60OxxiXI9KXDyP2lQ9u9vMc6aMtq5Xi2h_hbdw,20984
4
4
  sky/check.py,sha256=D3Y3saIFAYVvPxuBHnVgJEO0fUVDxgjwuMBaO-D778k,9472
5
- sky/cli.py,sha256=oGBQrCYVWqRTcWR-yCKZY7dmUOUnP5Xuvz_zcFXzqlw,212342
5
+ sky/cli.py,sha256=xigcV79-9ceMHiix9m5fvTwpJUkPBfpLWWNwY7_auY0,213013
6
6
  sky/cloud_stores.py,sha256=RjFgmRhUh1Kk__f6g3KxzLp9s7dA0pFK4W1AukEuUaw,21153
7
7
  sky/core.py,sha256=0-4W_DKJZgbwXuzNZKQ2R_qJxqxbqqNfyi0U0PQBKvQ,38230
8
8
  sky/dag.py,sha256=f3sJlkH4bE6Uuz3ozNtsMhcBpRx7KmC9Sa4seDKt4hU,3104
9
9
  sky/exceptions.py,sha256=E3C2Ejcc8RUDAUQn7ar_Jr97C_AxD2rKKMmJOfLJ9d0,8965
10
10
  sky/execution.py,sha256=TwcorzFxR_0m8uazPdeKltU3g3ikgUSqqzcSBrHp7K4,26070
11
11
  sky/global_user_state.py,sha256=PywEmUutF97XBgRMClR6IS5_KM8JJC0oA1LsPUZebp0,28681
12
- sky/optimizer.py,sha256=tXGrFpc6xNtKH34qjBAMd4jTuWcDZTPnGFwEtuCQFmk,59702
13
- sky/resources.py,sha256=Zt8mCCmdvZ5ZCqY-l3KXlx_lkUesAopRtaEcEsrRFZo,68465
12
+ sky/optimizer.py,sha256=GjvKQIBtY3NlULzau_9tfa7V2KYVJRrmNrjKVIWCPIQ,59753
13
+ sky/resources.py,sha256=usmB8p7HyzyWHcevQ8HV6eIlukYJ9BC0trFOaE2kNuw,69049
14
14
  sky/sky_logging.py,sha256=oLmTmwkuucIto3LHXLJfMcyRpYSkmZAZa5XzQPA5IHk,4434
15
15
  sky/skypilot_config.py,sha256=E3g65cX3P3dT9b5N0GgFBG6yB0FXwIGpisKoozmJmWU,9094
16
16
  sky/status_lib.py,sha256=J7Jb4_Dz0v2T64ttOdyUgpokvl4S0sBJrMfH7Fvo51A,1457
@@ -30,7 +30,7 @@ sky/adaptors/runpod.py,sha256=4Nt_BfZhJAKQNA3wO8cxvvNI8x4NsDGHu_4EhRDlGYQ,225
30
30
  sky/adaptors/vsphere.py,sha256=zJP9SeObEoLrpgHW2VHvZE48EhgVf8GfAEIwBeaDMfM,2129
31
31
  sky/backends/__init__.py,sha256=UDjwbUgpTRApbPJnNfR786GadUuwgRk3vsWoVu5RB_c,536
32
32
  sky/backends/backend.py,sha256=wwfbrxPhjMPs6PSyy3tAHI8WJhl-xhgzWBsAZjmJJ6g,6249
33
- sky/backends/backend_utils.py,sha256=2myfryj1zG9xxPaX6XYYJruxAOGNGbpsy2ckT4A77sE,121813
33
+ sky/backends/backend_utils.py,sha256=WK_vplM9ycTX8CH6rSSeggK2aPq2KsoN_08UlfdDp2s,121829
34
34
  sky/backends/cloud_vm_ray_backend.py,sha256=cL-IDyk9AOmHTAiQbXVwEr4dX6KPx4M-GiVEXxUYPWQ,232147
35
35
  sky/backends/docker_utils.py,sha256=Hyw1YY20EyghhEbYx6O2FIMDcGkNzBzV9TM7LFynei8,8358
36
36
  sky/backends/local_docker_backend.py,sha256=0JL5m0YUgOmOL4aWEUe4tmt89dsxjk4_WXkPwgEKEis,16801
@@ -42,13 +42,13 @@ sky/benchmark/benchmark_utils.py,sha256=eb-i6zYoo-Zkod-T9qtCu1FcYLw--Yyos1SyibUP
42
42
  sky/clouds/__init__.py,sha256=WuNIJEnZmBO72tU5awgaaL3rdvFRSkgaYNNeuY68dXo,1356
43
43
  sky/clouds/aws.py,sha256=2STW4eaCEtxre96yVagUcewNHiYGmxHKITNEQvgBmww,49539
44
44
  sky/clouds/azure.py,sha256=38eUcB1_lt5FvDWo-G_pKIIsT1c_bCU2AifEYo7KX9Y,30756
45
- sky/clouds/cloud.py,sha256=A5F4a71ciPyljWEs6vT-4RmdGT-AE9NkhS8gJ4Vgi_I,35165
45
+ sky/clouds/cloud.py,sha256=Y_9Hi2DhAbrqMLvb_NFPt--N5V6ua8BgbwV4xIc19KU,35216
46
46
  sky/clouds/cloud_registry.py,sha256=oLoYFjm_SDTgdHokY7b6A5Utq80HXRQNxV0fLjDdVsQ,2361
47
47
  sky/clouds/cudo.py,sha256=UiY273Sln7VOYDYx93yWiWH_RLlOKZ2cm7mA31ld4A8,13094
48
48
  sky/clouds/fluidstack.py,sha256=ufve4wXo_VmaEkxqTw2Jnt-DORBDRnqUPU1kB_mD89s,12383
49
49
  sky/clouds/gcp.py,sha256=BjCehW3s0IYkRDdEEDm0vYWXQDpOV8KU98OMVRPnQNg,54676
50
50
  sky/clouds/ibm.py,sha256=w8bo1EIY_YWYNu0fy-OpAyr6DZviU0tpIXUsiV01rVE,21423
51
- sky/clouds/kubernetes.py,sha256=tYjQFatOQmgtRzMt3J54CxM0w2ZPQwAo5SyyYkBcW9Y,28657
51
+ sky/clouds/kubernetes.py,sha256=WoSCJXNRTp167Y2UFWTMTTmPih4rwZ8njQaUkl9QDww,29436
52
52
  sky/clouds/lambda_cloud.py,sha256=ExL_uixdFrF9qSL5JYXpaOXCZ9_eOA2q444kcmBHBXQ,12644
53
53
  sky/clouds/oci.py,sha256=NOH-yYi1fbMkjqoz39zVXUEexE9MjE1c7YTvGtUgKzQ,26663
54
54
  sky/clouds/paperspace.py,sha256=4cjNua6jpuxmfidvLY4tSRX1oj_QaaHDinPMunGplyU,10868
@@ -65,7 +65,7 @@ sky/clouds/service_catalog/cudo_catalog.py,sha256=V_takvL6dWTGQaTLCEvjKIotCDPnMu
65
65
  sky/clouds/service_catalog/fluidstack_catalog.py,sha256=21-cvrYEYTIi7n3ZNF2e7_0QX-PF4BkhlVJUWQOvKrY,5059
66
66
  sky/clouds/service_catalog/gcp_catalog.py,sha256=v_5fsB3dB9oD8U7lBKnCe5ii6AUWEOiQjNarMnU_qLA,24379
67
67
  sky/clouds/service_catalog/ibm_catalog.py,sha256=1iK0KvbI82U7sySb7chr-qm_16x3tTnZ6nIo7o76ouc,4493
68
- sky/clouds/service_catalog/kubernetes_catalog.py,sha256=c6Oot8RC1ujcFmfJbkeJKUWsw3aX0iNvKL1fJg-FoOc,10020
68
+ sky/clouds/service_catalog/kubernetes_catalog.py,sha256=2M4GyNi2XJq7LOgyr7Da1ncEoMRkezEzHJx4e9veKo0,11086
69
69
  sky/clouds/service_catalog/lambda_catalog.py,sha256=2R-ccu63BbdvO6X80MtxiniA-jLewXb6I0Ye1rYD9fY,5302
70
70
  sky/clouds/service_catalog/oci_catalog.py,sha256=cyA6ZqwHGOKuPxUl_dKmFGdeWdQGMrvl_-o2MtyF998,8580
71
71
  sky/clouds/service_catalog/paperspace_catalog.py,sha256=MOlfoGRChjEwMzu4nRAho8DrIwwUJ3QlRzrMA1RLqvE,3789
@@ -84,7 +84,7 @@ sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py,sha256=SF_gTU74qg6L-DS
84
84
  sky/clouds/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
85
  sky/clouds/utils/aws_utils.py,sha256=W5BRC-2F_VY4BymRA1kS6-MufsI3V8cfY_hv--4gJBU,1986
86
86
  sky/clouds/utils/azure_utils.py,sha256=NToRBnhEyuUvb-nBnsKTxjhOBRkMcrelL8LK4w6s4t8,3555
87
- sky/clouds/utils/gcp_utils.py,sha256=QejfgXOIVRv5-fv3Soi96VeVNVyquwVwy3M58N3YfNs,6633
87
+ sky/clouds/utils/gcp_utils.py,sha256=h_ezG7uq2FogLJCPSu8GIEYLOEHmUtC_Xzt4fLOw19s,6853
88
88
  sky/clouds/utils/oci_utils.py,sha256=LILpS38_exeMjmJdNpzwDR8hfGSpWjaRKl1CWKA-zHs,5579
89
89
  sky/clouds/utils/scp_utils.py,sha256=RUp7NwyhKygOoVOwvdAOGdoQNSJjryOG6WSExCf-yas,15812
90
90
  sky/data/__init__.py,sha256=Nhaf1NURisXpZuwWANa2IuCyppIuc720FRwqSE2oEwY,184
@@ -96,14 +96,14 @@ sky/data/storage_utils.py,sha256=cM3kxlffYE7PnJySDu8huyUsMX_JYsf9uer8r5OYsjo,955
96
96
  sky/jobs/__init__.py,sha256=yucibSB_ZimtJMvOhMxn6ZqwBIYNfcwmc6pSXtCqmNQ,1483
97
97
  sky/jobs/constants.py,sha256=YLgcCg_RHSYr_rfsI_4UIdXk78KKKOK29Oem88t5j8I,1350
98
98
  sky/jobs/controller.py,sha256=sirpi730_GfKfPZeZ2PvCXnJWger0r6AyLSOx2sLd6A,27368
99
- sky/jobs/core.py,sha256=Lk_zKizc9a7O-8WHhh4-VXBS5kT0jRpwmNNA7S4ueIo,17347
99
+ sky/jobs/core.py,sha256=KnWkErHyj9lxI3xo0AG77dM50Ls0XHPn2G0A034-qRA,17394
100
100
  sky/jobs/recovery_strategy.py,sha256=O_DouAfWx8FNdQxXsr2msMwlKCIodS99cW6V4Lf1vMo,27219
101
101
  sky/jobs/state.py,sha256=DE02bCZc9bPbbuayb3Zml553mb4pEV7Z8t1pt8IGbYM,25252
102
102
  sky/jobs/utils.py,sha256=Ff3TttIEdVeM1_kOVkviqIDjeVfBPIXVE8i-yP1VDM8,37976
103
103
  sky/jobs/dashboard/dashboard.py,sha256=KMSarpVcfnc-ELPFvy1M9_I1k4kSeXubTk3ibQC67Tg,3219
104
104
  sky/jobs/dashboard/static/favicon.ico,sha256=uYlvgxSM7gjBmXpZ8wydvZUPAbJiiix-rc2Xe5mma9s,15086
105
105
  sky/jobs/dashboard/templates/index.html,sha256=su1tqgcsXNl1lGl9hfIR6ig1f531OO57x1Tc2mNDK7U,11139
106
- sky/provision/__init__.py,sha256=llAtnAAzx0TKT17B0JL_2ZiKea9RRQRxSzkWHQYqWTo,6292
106
+ sky/provision/__init__.py,sha256=rnuwL9x3qQGhX3EYW6KyZWfw_yBqGSiFBDz86T5xus4,6339
107
107
  sky/provision/common.py,sha256=E8AlSUFcn0FYQq1erNmoVfMAdsF9tP2yxfyk-9PLvQU,10286
108
108
  sky/provision/constants.py,sha256=oc_XDUkcoLQ_lwDy5yMeMSWviKS0j0s1c0pjlvpNeWY,800
109
109
  sky/provision/docker_utils.py,sha256=l4AMzwXGZd8RyNq8AwOaKV9bFSofLYfSyj2NBhkXYsY,19200
@@ -137,10 +137,10 @@ sky/provision/gcp/instance_utils.py,sha256=veRBr6Oziv0KaUdC4acuWeaOremNV0gMYCCHa
137
137
  sky/provision/gcp/mig_utils.py,sha256=oFpcFZoapHMILSE4iIm8V5bxP1RhbMHRF7cciqq8qAk,7883
138
138
  sky/provision/kubernetes/__init__.py,sha256=y6yVfii81WYG3ROxv4hiIj-ydinS5-xGxLvXnARVQoI,719
139
139
  sky/provision/kubernetes/config.py,sha256=WEKcFXXhe89bLGAvoMiBvTDxdxkpTIA6ezrj2vmzldc,29072
140
- sky/provision/kubernetes/instance.py,sha256=MFtTh-dNIuTZcHD20PQG_QuULFRFaPxwlUczR6sRnsk,43601
140
+ sky/provision/kubernetes/instance.py,sha256=lHD1cVVEMZFLNnd7_UCVr079SY9D3dH1X3abMBRRtdI,47103
141
141
  sky/provision/kubernetes/network.py,sha256=EpNjRQ131CXepqbdkoRKFu4szVrm0oKEpv1l8EgOkjU,12364
142
142
  sky/provision/kubernetes/network_utils.py,sha256=t1FS3K400fetH7cBuRgQJZl5_jEeMshsvsYmnMUcq8k,11399
143
- sky/provision/kubernetes/utils.py,sha256=PEDyZnf-dSmQ4dXyS_0x9OYHt9SbY7A6urd436f-WyQ,89923
143
+ sky/provision/kubernetes/utils.py,sha256=0W5p5HtvVZrGSim_H4n2x_AwKRPGMZToQwoN0qI3qbA,101175
144
144
  sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml,sha256=AMzYzlY0JIlfBWj5eX054Rc1XDW2thUcLSOGMJVhIdA,229
145
145
  sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml,sha256=RtTq4F1QUmR2Uunb6zuuRaPhV7hpesz4saHjn3Ncsb4,2010
146
146
  sky/provision/lambda_cloud/__init__.py,sha256=6EEvSgtUeEiup9ivIFevHmgv0GqleroO2X0K7TRa2nE,612
@@ -184,7 +184,7 @@ sky/serve/load_balancer.py,sha256=I4W66eh1t1kA_C_VaMPI76WeDTCl3Z6rFxF6rQIWd6E,12
184
184
  sky/serve/load_balancing_policies.py,sha256=_k4tkwIvhulR02Ln9ixYB_b97KOypr2xfSjMx8_zky0,3143
185
185
  sky/serve/replica_managers.py,sha256=1xYDK9Te5wFEF5hUK0gyNIUib0MY-HScLHUBDlTSl-k,57774
186
186
  sky/serve/serve_state.py,sha256=Q7De4GoBEPxlN_t1Lpn-Y1fd94SeHZ3E-94f1OTuhpc,19086
187
- sky/serve/serve_utils.py,sha256=wqBxChpJylZ_qHWyFmMBJqrG8_7xTIOr9nlOeyHs9P8,39431
187
+ sky/serve/serve_utils.py,sha256=NHSit1KlwN_rCCJ_E4c8dRn-foyZVEL3IHxCt5R17EA,39557
188
188
  sky/serve/service.py,sha256=gVem2vX8XuR_1wTqwrzbszQAbjzjDP2ddd787aynT9g,12017
189
189
  sky/serve/service_spec.py,sha256=34dMQ37INHltBzWaxHl3y_o9X3wLOCWA5jUhmhH1II4,14740
190
190
  sky/setup_files/MANIFEST.in,sha256=WF0T89NLichHxZDDSQzvSpiONtAEFyur2MPmGczgTIo,555
@@ -197,7 +197,7 @@ sky/skylet/configs.py,sha256=UtnpmEL0F9hH6PSjhsps7xgjGZ6qzPOfW1p2yj9tSng,1887
197
197
  sky/skylet/constants.py,sha256=w05Enrg9RhGp99P1WDYMKK_ki0M-e0bS8Wr-VZR0Vn8,14468
198
198
  sky/skylet/events.py,sha256=A09E7LmmwzcGrSG0n8K7d3EZ1ZJr1mmmzoGyhnArYJA,12303
199
199
  sky/skylet/job_lib.py,sha256=aY2qqZGA59hVTp6FtP3N_Wkrl8wzO8XFOOjhODpQGZg,37737
200
- sky/skylet/log_lib.py,sha256=BmhAgcLvlin3szhj33IH0kbdCALacVisF2x61BQpZdY,21888
200
+ sky/skylet/log_lib.py,sha256=DV3bi4dZmAcleyii3fS0KMWUSfaaMjBS6ylZOvwrNxc,21801
201
201
  sky/skylet/log_lib.pyi,sha256=AHMkW2DGK2erFovb3ToZWxRiYaATlzkxKb5J9pkgF2Y,4295
202
202
  sky/skylet/skylet.py,sha256=U9plr5hmhD9-Nyy0LMCymlE8DWtRXTFXQvfbFsS746Y,1153
203
203
  sky/skylet/subprocess_daemon.py,sha256=IJwGAzOdERrhWJS7VYKAUByNsLyIkKkB0w5nk06okG8,2818
@@ -228,7 +228,7 @@ sky/templates/jobs-controller.yaml.j2,sha256=Gu3ogFxFYr09VEXP-6zEbrCUOFo1aYxWEjA
228
228
  sky/templates/kubernetes-ingress.yml.j2,sha256=73iDklVDWBMbItg0IexCa6_ClXPJOxw7PWz3leku4nE,1340
229
229
  sky/templates/kubernetes-loadbalancer.yml.j2,sha256=IxrNYM366N01bbkJEbZ_UPYxUP8wyVEbRNFHRsBuLsw,626
230
230
  sky/templates/kubernetes-port-forward-proxy-command.sh,sha256=HlG7CPBBedCVBlL9qv0erW_eKm6Irj0LFyaAWuJW_lc,3148
231
- sky/templates/kubernetes-ray.yml.j2,sha256=Ek6nePe_IP1b0mqMLnbyjp7wpo1-kwranD_AFRXJ9tU,19152
231
+ sky/templates/kubernetes-ray.yml.j2,sha256=w7KNEBjj3zbd8RqWJuKwZSpQwMCdUAfUb7I7jNBn0XY,20672
232
232
  sky/templates/kubernetes-ssh-jump.yml.j2,sha256=k5W5sOIMppU7dDkJMwPlqsUcb92y7L5_TVG3hkgMy8M,2747
233
233
  sky/templates/lambda-ray.yml.j2,sha256=HyvO_tX2vxwSsc4IFVSqGuIbjLMk0bevP9bcxb8ZQII,4498
234
234
  sky/templates/local-ray.yml.j2,sha256=FNHeyHF6nW9nU9QLIZceUWfvrFTTcO51KqhTnYCEFaA,1185
@@ -254,12 +254,12 @@ sky/utils/dag_utils.py,sha256=pVX3lGDDcYTcGoH_1jEWzl9767Y4mwlIEYIzoyHO6gM,6105
254
254
  sky/utils/db_utils.py,sha256=AOvMmBEN9cF4I7CoXihPCtus4mU2VDGjBQSVMMgzKlA,2786
255
255
  sky/utils/env_options.py,sha256=3oAaUPxowL6vI2XmxXrH56V7Myj9IJWsL-MXFmRFVdI,1294
256
256
  sky/utils/kubernetes_enums.py,sha256=imGqHSa8O07zD_6xH1SDMM7dBU5lF5fzFFlQuQy00QM,1384
257
- sky/utils/log_utils.py,sha256=ptv2sbsiJSgk4NvdccrMsUR-MvOKnbu4BQiRSishgk0,12472
257
+ sky/utils/log_utils.py,sha256=oZYF45uC7GFjAqO-Je-aiX6zhtq91TP-KKaIbQNF-jY,14024
258
258
  sky/utils/resources_utils.py,sha256=Xqi7gxPYw2y5wl5okUI5zx5LEij0hJF_V3Zi8q7TXYg,7890
259
259
  sky/utils/rich_utils.py,sha256=hmnI1X5dKvRIQzB7EyNb34FT97qFNve-0QHqM5r0mVk,3066
260
260
  sky/utils/schemas.py,sha256=67LK87wBywblIyF-QgG5hgL1BvBuHsxeQLQBO0M5OH4,29447
261
261
  sky/utils/subprocess_utils.py,sha256=mMFCTfxbyav5LJ1epJJXkgfFYmd828naTOMVfYjuEWY,6905
262
- sky/utils/timeline.py,sha256=ao_nm0y52ZQILfL7Y92c3pSEFRyPm_ElORC3DrI5BwQ,3936
262
+ sky/utils/timeline.py,sha256=q6jNZ0NO-mVNC3nUplfWOrb6Y68i5OB65xnkMblAcT4,4028
263
263
  sky/utils/ux_utils.py,sha256=CqyIFGDuSE8fQasPkna_loZMwtboC9KedR09WEQ7qz0,6502
264
264
  sky/utils/validator.py,sha256=cAFERCoC7jH0DFKepcU4x9SYmdrYL1iVmW9tXA18hvo,701
265
265
  sky/utils/cli_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -270,14 +270,14 @@ sky/utils/kubernetes/delete_cluster.sh,sha256=BSccHF43GyepDNf-FZcenzHzpXXATkVD92
270
270
  sky/utils/kubernetes/deploy_remote_cluster.sh,sha256=vGj0mD0tejHDRy8ulwKOvOF2mfLyT5J8fp7GVqEe_EY,8478
271
271
  sky/utils/kubernetes/generate_kind_config.py,sha256=_TNLnifA_r7-CRq083IP1xjelYqiLjzQX9ohuqYpDH8,3187
272
272
  sky/utils/kubernetes/generate_kubeconfig.sh,sha256=livvxDKV-_xx8-dYWNyo4wlg3sOldeHefI37JXKLXu0,9398
273
- sky/utils/kubernetes/gpu_labeler.py,sha256=MEUv0U4ACDcNwtFVltlv017XJMjxx1Bndf6fL0i6eqg,6960
273
+ sky/utils/kubernetes/gpu_labeler.py,sha256=j9tdIG98nwJ6WJXNhpLUUFcg-6RYe1pNiE_bLvLIB5Q,6999
274
274
  sky/utils/kubernetes/k8s_gpu_labeler_job.yaml,sha256=k0TBoQ4zgf79-sVkixKSGYFHQ7ZWF5gdVIZPupCCo9A,1224
275
275
  sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml,sha256=VLKT2KKimZu1GDg_4AIlIt488oMQvhRZWwsj9vBbPUg,3812
276
276
  sky/utils/kubernetes/rsync_helper.sh,sha256=hyYDaYSNxYaNvzUQBzC8AidB7nDeojizjkzc_CTxycY,1077
277
277
  sky/utils/kubernetes/ssh_jump_lifecycle_manager.py,sha256=RFLJ3k7MR5UN4SKHykQ0lV9SgXumoULpKYIAt1vh-HU,6560
278
- skypilot_nightly-1.0.0.dev20241112.dist-info/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
279
- skypilot_nightly-1.0.0.dev20241112.dist-info/METADATA,sha256=Ui6L9CmuvZsIg2D0paU-NiqfVLtywzq5GLpCrJes-eY,19699
280
- skypilot_nightly-1.0.0.dev20241112.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91
281
- skypilot_nightly-1.0.0.dev20241112.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
282
- skypilot_nightly-1.0.0.dev20241112.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
283
- skypilot_nightly-1.0.0.dev20241112.dist-info/RECORD,,
278
+ skypilot_nightly-1.0.0.dev20241113.dist-info/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
279
+ skypilot_nightly-1.0.0.dev20241113.dist-info/METADATA,sha256=psS5Zx9UaBaT4ifNVk35T4Ks42puqoGYkG5uE_-RBrQ,19699
280
+ skypilot_nightly-1.0.0.dev20241113.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91
281
+ skypilot_nightly-1.0.0.dev20241113.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
282
+ skypilot_nightly-1.0.0.dev20241113.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
283
+ skypilot_nightly-1.0.0.dev20241113.dist-info/RECORD,,