skypilot-nightly 1.0.0.dev20250320__py3-none-any.whl → 1.0.0.dev20250322__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.
Files changed (50) hide show
  1. sky/__init__.py +2 -2
  2. sky/adaptors/cloudflare.py +16 -5
  3. sky/adaptors/kubernetes.py +2 -1
  4. sky/adaptors/nebius.py +128 -6
  5. sky/backends/cloud_vm_ray_backend.py +3 -1
  6. sky/benchmark/benchmark_utils.py +3 -2
  7. sky/check.py +114 -114
  8. sky/cloud_stores.py +66 -0
  9. sky/clouds/aws.py +14 -7
  10. sky/clouds/azure.py +13 -6
  11. sky/clouds/cloud.py +34 -10
  12. sky/clouds/cudo.py +3 -2
  13. sky/clouds/do.py +3 -2
  14. sky/clouds/fluidstack.py +3 -2
  15. sky/clouds/gcp.py +8 -9
  16. sky/clouds/ibm.py +15 -6
  17. sky/clouds/kubernetes.py +3 -1
  18. sky/clouds/lambda_cloud.py +3 -1
  19. sky/clouds/nebius.py +59 -11
  20. sky/clouds/oci.py +15 -6
  21. sky/clouds/paperspace.py +3 -2
  22. sky/clouds/runpod.py +7 -1
  23. sky/clouds/scp.py +3 -1
  24. sky/clouds/service_catalog/kubernetes_catalog.py +3 -1
  25. sky/clouds/vast.py +3 -2
  26. sky/clouds/vsphere.py +3 -2
  27. sky/core.py +6 -4
  28. sky/data/data_transfer.py +75 -0
  29. sky/data/data_utils.py +34 -0
  30. sky/data/mounting_utils.py +18 -0
  31. sky/data/storage.py +540 -10
  32. sky/data/storage_utils.py +102 -84
  33. sky/exceptions.py +2 -0
  34. sky/global_user_state.py +12 -33
  35. sky/jobs/server/core.py +1 -1
  36. sky/jobs/utils.py +5 -0
  37. sky/optimizer.py +10 -5
  38. sky/resources.py +6 -1
  39. sky/setup_files/dependencies.py +3 -1
  40. sky/task.py +16 -5
  41. sky/utils/command_runner.py +2 -0
  42. sky/utils/controller_utils.py +8 -5
  43. sky/utils/kubernetes/gpu_labeler.py +4 -4
  44. sky/utils/kubernetes/kubernetes_deploy_utils.py +4 -3
  45. {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/METADATA +16 -7
  46. {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/RECORD +50 -50
  47. {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/WHEEL +1 -1
  48. {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/entry_points.txt +0 -0
  49. {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/licenses/LICENSE +0 -0
  50. {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/top_level.txt +0 -0
sky/data/data_transfer.py CHANGED
@@ -14,6 +14,7 @@ Currently implemented:
14
14
  TODO:
15
15
  - All combinations of Azure Transfer
16
16
  - All combinations of R2 Transfer
17
+ - All combinations of Nebius Transfer
17
18
  - GCS -> S3
18
19
  """
19
20
  import json
@@ -135,6 +136,35 @@ def s3_to_r2(s3_bucket_name: str, r2_bucket_name: str) -> None:
135
136
  'a local source for the storage object.')
136
137
 
137
138
 
139
+ def s3_to_nebius(s3_bucket_name: str, nebius_bucket_name: str) -> None:
140
+ """Creates a one-time transfer from Amazon S3 to Nebius Object Storage.
141
+
142
+ it will block until the transfer is complete.
143
+
144
+ Args:
145
+ s3_bucket_name: str; Name of the Amazon S3 Bucket
146
+ nebius_bucket_name: str; Name of the Cloudflare R2 Bucket
147
+ """
148
+ raise NotImplementedError('Moving data directly from clouds to Nebius is '
149
+ 'currently not supported. Please specify '
150
+ 'a local source for the storage object.')
151
+
152
+
153
+ def r2_to_nebius(r2_bucket_name: str, nebius_bucket_name: str) -> None:
154
+ """Creates a one-time transfer from Cloudflare R2 Bucket to
155
+ Nebius Object Storage.
156
+
157
+ it will block until the transfer is complete.
158
+
159
+ Args:
160
+ r2_bucket_name: str; Name of the Amazon S3 Bucket
161
+ nebius_bucket_name: str; Name of the Cloudflare R2 Bucket
162
+ """
163
+ raise NotImplementedError('Moving data directly from clouds to Nebius is '
164
+ 'currently not supported. Please specify '
165
+ 'a local source for the storage object.')
166
+
167
+
138
168
  def gcs_to_s3(gs_bucket_name: str, s3_bucket_name: str) -> None:
139
169
  """Creates a one-time transfer from Google Cloud Storage to Amazon S3.
140
170
 
@@ -160,6 +190,19 @@ def gcs_to_r2(gs_bucket_name: str, r2_bucket_name: str) -> None:
160
190
  'a local source for the storage object.')
161
191
 
162
192
 
193
+ def gcs_to_nebius(gs_bucket_name: str, nebius_bucket_name: str) -> None:
194
+ """Creates a one-time transfer from Google Cloud Storage to
195
+ Nebius Object Storage.
196
+
197
+ Args:
198
+ gs_bucket_name: str; Name of the Google Cloud Storage Bucket
199
+ nebius_bucket_name: str; Name of the Nebius Bucket
200
+ """
201
+ raise NotImplementedError('Moving data directly from clouds to Nebius is '
202
+ 'currently not supported. Please specify '
203
+ 'a local source for the storage object.')
204
+
205
+
163
206
  def r2_to_gcs(r2_bucket_name: str, gs_bucket_name: str) -> None:
164
207
  """Creates a one-time transfer from Cloudflare R2 to Google Cloud Storage.
165
208
 
@@ -175,6 +218,22 @@ def r2_to_gcs(r2_bucket_name: str, gs_bucket_name: str) -> None:
175
218
  'a local source for the storage object.')
176
219
 
177
220
 
221
+ def nebius_to_gcs(nebius_bucket_name: str, gs_bucket_name: str) -> None:
222
+ """Creates a one-time transfer from Nebius Object Storage
223
+ to Google Cloud Storage.
224
+
225
+ Can be viewed from: https://console.cloud.google.com/transfer/cloud
226
+ it will block until the transfer is complete.
227
+
228
+ Args:
229
+ nebius_bucket_name: str; Name of the Nebius Object Storage
230
+ gs_bucket_name: str; Name of the Google Cloud Storage Bucket
231
+ """
232
+ raise NotImplementedError('Moving data directly from Nebius to clouds is '
233
+ 'currently not supported. Please specify '
234
+ 'a local source for the storage object.')
235
+
236
+
178
237
  def r2_to_s3(r2_bucket_name: str, s3_bucket_name: str) -> None:
179
238
  """Creates a one-time transfer from Amazon S3 to Google Cloud Storage.
180
239
 
@@ -190,6 +249,22 @@ def r2_to_s3(r2_bucket_name: str, s3_bucket_name: str) -> None:
190
249
  'a local source for the storage object.')
191
250
 
192
251
 
252
+ def nebius_to_s3(nebius_bucket_name: str, s3_bucket_name: str) -> None:
253
+ """Creates a one-time transfer from Nebius Object Storage
254
+ to Amazon S3 Bucket.
255
+
256
+ Can be viewed from: https://console.cloud.google.com/transfer/cloud
257
+ it will block until the transfer is complete.
258
+
259
+ Args:
260
+ nebius_bucket_name: str; Name of the Nebius Object Storage\
261
+ s3_bucket_name: str; Name of the Amazon S3 Bucket
262
+ """
263
+ raise NotImplementedError('Moving data directly from R2 to clouds is '
264
+ 'currently not supported. Please specify '
265
+ 'a local source for the storage object.')
266
+
267
+
193
268
  def _add_bucket_iam_member(bucket_name: str, role: str, member: str) -> None:
194
269
  storage_client = gcp.storage_client()
195
270
  bucket = storage_client.bucket(bucket_name)
sky/data/data_utils.py CHANGED
@@ -20,6 +20,7 @@ from sky.adaptors import azure
20
20
  from sky.adaptors import cloudflare
21
21
  from sky.adaptors import gcp
22
22
  from sky.adaptors import ibm
23
+ from sky.adaptors import nebius
23
24
  from sky.skylet import log_lib
24
25
  from sky.utils import common_utils
25
26
  from sky.utils import ux_utils
@@ -94,6 +95,18 @@ def split_r2_path(r2_path: str) -> Tuple[str, str]:
94
95
  return bucket, key
95
96
 
96
97
 
98
+ def split_nebius_path(nebius_path: str) -> Tuple[str, str]:
99
+ """Splits Nebius Path into Bucket name and Relative Path to Bucket
100
+
101
+ Args:
102
+ nebius_path: str; Nebius Path, e.g. nebius://imagenet/train/
103
+ """
104
+ path_parts = nebius_path.replace('nebius://', '').split('/')
105
+ bucket = path_parts.pop(0)
106
+ key = '/'.join(path_parts)
107
+ return bucket, key
108
+
109
+
97
110
  def split_cos_path(s3_path: str) -> Tuple[str, str, str]:
98
111
  """returns extracted region, bucket name and bucket path to data
99
112
  from the specified cos bucket's url.
@@ -307,6 +320,16 @@ def create_r2_client(region: str = 'auto') -> Client:
307
320
  return cloudflare.client('s3', region)
308
321
 
309
322
 
323
+ def create_nebius_client(region: Optional[str]) -> Client:
324
+ """Helper method that connects to Boto3 client for Nebius Object Storage
325
+
326
+ Args:
327
+ region: str; Region for Nebius Object Storage
328
+ """
329
+ region = region if region is not None else nebius.DEFAULT_REGION
330
+ return nebius.client('s3', region)
331
+
332
+
310
333
  def verify_r2_bucket(name: str) -> bool:
311
334
  """Helper method that checks if the R2 bucket exists
312
335
 
@@ -318,6 +341,17 @@ def verify_r2_bucket(name: str) -> bool:
318
341
  return bucket in r2.buckets.all()
319
342
 
320
343
 
344
+ def verify_nebius_bucket(name: str) -> bool:
345
+ """Helper method that checks if the Nebius bucket exists
346
+
347
+ Args:
348
+ name: str; Name of Nebius Object Storage (without nebius:// prefix)
349
+ """
350
+ nebius_s = nebius.resource('s3')
351
+ bucket = nebius_s.Bucket(name)
352
+ return bucket in nebius_s.buckets.all()
353
+
354
+
321
355
  def verify_ibm_cos_bucket(name: str) -> bool:
322
356
  """Helper method that checks if the cos bucket exists
323
357
 
@@ -54,6 +54,24 @@ def get_s3_mount_cmd(bucket_name: str,
54
54
  return mount_cmd
55
55
 
56
56
 
57
+ def get_nebius_mount_cmd(nebius_profile_name: str,
58
+ endpoint_url: str,
59
+ bucket_name: str,
60
+ mount_path: str,
61
+ _bucket_sub_path: Optional[str] = None) -> str:
62
+ """Returns a command to install Nebius mount utility goofys."""
63
+ if _bucket_sub_path is None:
64
+ _bucket_sub_path = ''
65
+ else:
66
+ _bucket_sub_path = f':{_bucket_sub_path}'
67
+ mount_cmd = (f'AWS_PROFILE={nebius_profile_name} goofys -o allow_other '
68
+ f'--stat-cache-ttl {_STAT_CACHE_TTL} '
69
+ f'--type-cache-ttl {_TYPE_CACHE_TTL} '
70
+ f'--endpoint {endpoint_url} '
71
+ f'{bucket_name}{_bucket_sub_path} {mount_path}')
72
+ return mount_cmd
73
+
74
+
57
75
  def get_gcs_mount_install_cmd() -> str:
58
76
  """Returns a command to install GCS mount utility gcsfuse."""
59
77
  install_cmd = ('ARCH=$(uname -m) && '