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.
- sky/__init__.py +2 -2
- sky/adaptors/cloudflare.py +16 -5
- sky/adaptors/kubernetes.py +2 -1
- sky/adaptors/nebius.py +128 -6
- sky/backends/cloud_vm_ray_backend.py +3 -1
- sky/benchmark/benchmark_utils.py +3 -2
- sky/check.py +114 -114
- sky/cloud_stores.py +66 -0
- sky/clouds/aws.py +14 -7
- sky/clouds/azure.py +13 -6
- sky/clouds/cloud.py +34 -10
- sky/clouds/cudo.py +3 -2
- sky/clouds/do.py +3 -2
- sky/clouds/fluidstack.py +3 -2
- sky/clouds/gcp.py +8 -9
- sky/clouds/ibm.py +15 -6
- sky/clouds/kubernetes.py +3 -1
- sky/clouds/lambda_cloud.py +3 -1
- sky/clouds/nebius.py +59 -11
- sky/clouds/oci.py +15 -6
- sky/clouds/paperspace.py +3 -2
- sky/clouds/runpod.py +7 -1
- sky/clouds/scp.py +3 -1
- sky/clouds/service_catalog/kubernetes_catalog.py +3 -1
- sky/clouds/vast.py +3 -2
- sky/clouds/vsphere.py +3 -2
- sky/core.py +6 -4
- sky/data/data_transfer.py +75 -0
- sky/data/data_utils.py +34 -0
- sky/data/mounting_utils.py +18 -0
- sky/data/storage.py +540 -10
- sky/data/storage_utils.py +102 -84
- sky/exceptions.py +2 -0
- sky/global_user_state.py +12 -33
- sky/jobs/server/core.py +1 -1
- sky/jobs/utils.py +5 -0
- sky/optimizer.py +10 -5
- sky/resources.py +6 -1
- sky/setup_files/dependencies.py +3 -1
- sky/task.py +16 -5
- sky/utils/command_runner.py +2 -0
- sky/utils/controller_utils.py +8 -5
- sky/utils/kubernetes/gpu_labeler.py +4 -4
- sky/utils/kubernetes/kubernetes_deploy_utils.py +4 -3
- {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/METADATA +16 -7
- {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/RECORD +50 -50
- {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/WHEEL +1 -1
- {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250320.dist-info → skypilot_nightly-1.0.0.dev20250322.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
sky/data/mounting_utils.py
CHANGED
@@ -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) && '
|