skypilot-nightly 1.0.0.dev20250915__py3-none-any.whl → 1.0.0.dev20250918__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.
Potentially problematic release.
This version of skypilot-nightly might be problematic. Click here for more details.
- sky/__init__.py +4 -2
- sky/adaptors/primeintellect.py +1 -0
- sky/adaptors/seeweb.py +68 -4
- sky/authentication.py +25 -0
- sky/backends/__init__.py +3 -2
- sky/backends/backend_utils.py +16 -12
- sky/backends/cloud_vm_ray_backend.py +61 -4
- sky/catalog/primeintellect_catalog.py +95 -0
- sky/client/sdk.py +6 -0
- sky/clouds/__init__.py +2 -0
- sky/clouds/primeintellect.py +314 -0
- sky/core.py +10 -3
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/chunks/3015-ba5be550eb80fd8c.js +1 -0
- sky/dashboard/out/_next/static/chunks/5339.4a881570243431a5.js +51 -0
- sky/dashboard/out/_next/static/chunks/{6856-e0754534b3015377.js → 6856-9a2538f38c004652.js} +1 -1
- sky/dashboard/out/_next/static/chunks/{6990-11c8e9b982e8ffec.js → 6990-f6818c84ed8f1c86.js} +1 -1
- sky/dashboard/out/_next/static/chunks/8969-a3e3f0683e19d340.js +1 -0
- sky/dashboard/out/_next/static/chunks/9037-472ee1222cb1e158.js +6 -0
- sky/dashboard/out/_next/static/chunks/{webpack-d1e29b3aa66bf4cf.js → webpack-487697b47d8c5e50.js} +1 -1
- sky/dashboard/out/_next/static/{dG6B0i0HO4jIoKb4ZFYJ_ → k1mo5xWZrV9djgjd0moOT}/_buildManifest.js +1 -1
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -1
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -1
- sky/dashboard/out/infra.html +1 -1
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs/pools/[pool].html +1 -1
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -1
- sky/dashboard/out/volumes.html +1 -1
- sky/dashboard/out/workspace/new.html +1 -1
- sky/dashboard/out/workspaces/[name].html +1 -1
- sky/dashboard/out/workspaces.html +1 -1
- sky/global_user_state.py +42 -34
- sky/jobs/server/server.py +14 -1
- sky/jobs/state.py +26 -1
- sky/provision/__init__.py +1 -0
- sky/provision/docker_utils.py +50 -3
- sky/provision/instance_setup.py +15 -1
- sky/provision/lambda_cloud/instance.py +12 -11
- sky/provision/primeintellect/__init__.py +10 -0
- sky/provision/primeintellect/config.py +11 -0
- sky/provision/primeintellect/instance.py +454 -0
- sky/provision/primeintellect/utils.py +398 -0
- sky/resources.py +9 -1
- sky/schemas/generated/servev1_pb2.py +58 -0
- sky/schemas/generated/servev1_pb2.pyi +115 -0
- sky/schemas/generated/servev1_pb2_grpc.py +322 -0
- sky/serve/serve_rpc_utils.py +179 -0
- sky/serve/serve_utils.py +29 -12
- sky/serve/server/core.py +37 -19
- sky/serve/server/impl.py +221 -129
- sky/server/common.py +13 -0
- sky/server/constants.py +3 -0
- sky/server/requests/executor.py +23 -6
- sky/server/server.py +10 -5
- sky/setup_files/dependencies.py +1 -0
- sky/skylet/constants.py +5 -3
- sky/skylet/services.py +98 -0
- sky/skylet/skylet.py +3 -1
- sky/skypilot_config.py +10 -3
- sky/templates/kubernetes-ray.yml.j2 +22 -12
- sky/templates/primeintellect-ray.yml.j2 +71 -0
- {skypilot_nightly-1.0.0.dev20250915.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/METADATA +39 -38
- {skypilot_nightly-1.0.0.dev20250915.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/RECORD +74 -62
- sky/dashboard/out/_next/static/chunks/3015-2ea98b57e318bd6e.js +0 -1
- sky/dashboard/out/_next/static/chunks/5339.c033b29835da0f35.js +0 -51
- sky/dashboard/out/_next/static/chunks/8969-0487dfbf149d9e53.js +0 -1
- sky/dashboard/out/_next/static/chunks/9037-f9800e64eb05dd1c.js +0 -6
- /sky/dashboard/out/_next/static/chunks/pages/{workspaces-7598c33a746cdc91.js → workspaces-7528cc0ef8c522c5.js} +0 -0
- /sky/dashboard/out/_next/static/{dG6B0i0HO4jIoKb4ZFYJ_ → k1mo5xWZrV9djgjd0moOT}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250915.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250915.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250915.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250915.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
|
|
2
|
+
"""Client and server classes corresponding to protobuf-defined services."""
|
|
3
|
+
import grpc
|
|
4
|
+
import warnings
|
|
5
|
+
|
|
6
|
+
from sky.schemas.generated import servev1_pb2 as sky_dot_schemas_dot_generated_dot_servev1__pb2
|
|
7
|
+
|
|
8
|
+
GRPC_GENERATED_VERSION = '1.63.0'
|
|
9
|
+
GRPC_VERSION = grpc.__version__
|
|
10
|
+
EXPECTED_ERROR_RELEASE = '1.65.0'
|
|
11
|
+
SCHEDULED_RELEASE_DATE = 'June 25, 2024'
|
|
12
|
+
_version_not_supported = False
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from grpc._utilities import first_version_is_lower
|
|
16
|
+
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
|
|
17
|
+
except ImportError:
|
|
18
|
+
_version_not_supported = True
|
|
19
|
+
|
|
20
|
+
if _version_not_supported:
|
|
21
|
+
warnings.warn(
|
|
22
|
+
f'The grpc package installed is at version {GRPC_VERSION},'
|
|
23
|
+
+ f' but the generated code in sky/schemas/generated/servev1_pb2_grpc.py depends on'
|
|
24
|
+
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
|
|
25
|
+
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
|
|
26
|
+
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
|
|
27
|
+
+ f' This warning will become an error in {EXPECTED_ERROR_RELEASE},'
|
|
28
|
+
+ f' scheduled for release on {SCHEDULED_RELEASE_DATE}.',
|
|
29
|
+
RuntimeWarning
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ServeServiceStub(object):
|
|
34
|
+
"""Missing associated documentation comment in .proto file."""
|
|
35
|
+
|
|
36
|
+
def __init__(self, channel):
|
|
37
|
+
"""Constructor.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
channel: A grpc.Channel.
|
|
41
|
+
"""
|
|
42
|
+
self.GetServiceStatus = channel.unary_unary(
|
|
43
|
+
'/serve.v1.ServeService/GetServiceStatus',
|
|
44
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusRequest.SerializeToString,
|
|
45
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusResponse.FromString,
|
|
46
|
+
_registered_method=True)
|
|
47
|
+
self.AddVersion = channel.unary_unary(
|
|
48
|
+
'/serve.v1.ServeService/AddVersion',
|
|
49
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionRequest.SerializeToString,
|
|
50
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionResponse.FromString,
|
|
51
|
+
_registered_method=True)
|
|
52
|
+
self.TerminateServices = channel.unary_unary(
|
|
53
|
+
'/serve.v1.ServeService/TerminateServices',
|
|
54
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesRequest.SerializeToString,
|
|
55
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesResponse.FromString,
|
|
56
|
+
_registered_method=True)
|
|
57
|
+
self.TerminateReplica = channel.unary_unary(
|
|
58
|
+
'/serve.v1.ServeService/TerminateReplica',
|
|
59
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaRequest.SerializeToString,
|
|
60
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaResponse.FromString,
|
|
61
|
+
_registered_method=True)
|
|
62
|
+
self.WaitServiceRegistration = channel.unary_unary(
|
|
63
|
+
'/serve.v1.ServeService/WaitServiceRegistration',
|
|
64
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationRequest.SerializeToString,
|
|
65
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationResponse.FromString,
|
|
66
|
+
_registered_method=True)
|
|
67
|
+
self.UpdateService = channel.unary_unary(
|
|
68
|
+
'/serve.v1.ServeService/UpdateService',
|
|
69
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceRequest.SerializeToString,
|
|
70
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceResponse.FromString,
|
|
71
|
+
_registered_method=True)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class ServeServiceServicer(object):
|
|
75
|
+
"""Missing associated documentation comment in .proto file."""
|
|
76
|
+
|
|
77
|
+
def GetServiceStatus(self, request, context):
|
|
78
|
+
"""Get status of service.
|
|
79
|
+
"""
|
|
80
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
81
|
+
context.set_details('Method not implemented!')
|
|
82
|
+
raise NotImplementedError('Method not implemented!')
|
|
83
|
+
|
|
84
|
+
def AddVersion(self, request, context):
|
|
85
|
+
"""Add version to service.
|
|
86
|
+
"""
|
|
87
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
88
|
+
context.set_details('Method not implemented!')
|
|
89
|
+
raise NotImplementedError('Method not implemented!')
|
|
90
|
+
|
|
91
|
+
def TerminateServices(self, request, context):
|
|
92
|
+
"""Terminate services.
|
|
93
|
+
"""
|
|
94
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
95
|
+
context.set_details('Method not implemented!')
|
|
96
|
+
raise NotImplementedError('Method not implemented!')
|
|
97
|
+
|
|
98
|
+
def TerminateReplica(self, request, context):
|
|
99
|
+
"""Terminate replica.
|
|
100
|
+
"""
|
|
101
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
102
|
+
context.set_details('Method not implemented!')
|
|
103
|
+
raise NotImplementedError('Method not implemented!')
|
|
104
|
+
|
|
105
|
+
def WaitServiceRegistration(self, request, context):
|
|
106
|
+
"""Wait for service registration.
|
|
107
|
+
"""
|
|
108
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
109
|
+
context.set_details('Method not implemented!')
|
|
110
|
+
raise NotImplementedError('Method not implemented!')
|
|
111
|
+
|
|
112
|
+
def UpdateService(self, request, context):
|
|
113
|
+
"""Update service.
|
|
114
|
+
"""
|
|
115
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
116
|
+
context.set_details('Method not implemented!')
|
|
117
|
+
raise NotImplementedError('Method not implemented!')
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def add_ServeServiceServicer_to_server(servicer, server):
|
|
121
|
+
rpc_method_handlers = {
|
|
122
|
+
'GetServiceStatus': grpc.unary_unary_rpc_method_handler(
|
|
123
|
+
servicer.GetServiceStatus,
|
|
124
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusRequest.FromString,
|
|
125
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusResponse.SerializeToString,
|
|
126
|
+
),
|
|
127
|
+
'AddVersion': grpc.unary_unary_rpc_method_handler(
|
|
128
|
+
servicer.AddVersion,
|
|
129
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionRequest.FromString,
|
|
130
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionResponse.SerializeToString,
|
|
131
|
+
),
|
|
132
|
+
'TerminateServices': grpc.unary_unary_rpc_method_handler(
|
|
133
|
+
servicer.TerminateServices,
|
|
134
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesRequest.FromString,
|
|
135
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesResponse.SerializeToString,
|
|
136
|
+
),
|
|
137
|
+
'TerminateReplica': grpc.unary_unary_rpc_method_handler(
|
|
138
|
+
servicer.TerminateReplica,
|
|
139
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaRequest.FromString,
|
|
140
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaResponse.SerializeToString,
|
|
141
|
+
),
|
|
142
|
+
'WaitServiceRegistration': grpc.unary_unary_rpc_method_handler(
|
|
143
|
+
servicer.WaitServiceRegistration,
|
|
144
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationRequest.FromString,
|
|
145
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationResponse.SerializeToString,
|
|
146
|
+
),
|
|
147
|
+
'UpdateService': grpc.unary_unary_rpc_method_handler(
|
|
148
|
+
servicer.UpdateService,
|
|
149
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceRequest.FromString,
|
|
150
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceResponse.SerializeToString,
|
|
151
|
+
),
|
|
152
|
+
}
|
|
153
|
+
generic_handler = grpc.method_handlers_generic_handler(
|
|
154
|
+
'serve.v1.ServeService', rpc_method_handlers)
|
|
155
|
+
server.add_generic_rpc_handlers((generic_handler,))
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
# This class is part of an EXPERIMENTAL API.
|
|
159
|
+
class ServeService(object):
|
|
160
|
+
"""Missing associated documentation comment in .proto file."""
|
|
161
|
+
|
|
162
|
+
@staticmethod
|
|
163
|
+
def GetServiceStatus(request,
|
|
164
|
+
target,
|
|
165
|
+
options=(),
|
|
166
|
+
channel_credentials=None,
|
|
167
|
+
call_credentials=None,
|
|
168
|
+
insecure=False,
|
|
169
|
+
compression=None,
|
|
170
|
+
wait_for_ready=None,
|
|
171
|
+
timeout=None,
|
|
172
|
+
metadata=None):
|
|
173
|
+
return grpc.experimental.unary_unary(
|
|
174
|
+
request,
|
|
175
|
+
target,
|
|
176
|
+
'/serve.v1.ServeService/GetServiceStatus',
|
|
177
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusRequest.SerializeToString,
|
|
178
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusResponse.FromString,
|
|
179
|
+
options,
|
|
180
|
+
channel_credentials,
|
|
181
|
+
insecure,
|
|
182
|
+
call_credentials,
|
|
183
|
+
compression,
|
|
184
|
+
wait_for_ready,
|
|
185
|
+
timeout,
|
|
186
|
+
metadata,
|
|
187
|
+
_registered_method=True)
|
|
188
|
+
|
|
189
|
+
@staticmethod
|
|
190
|
+
def AddVersion(request,
|
|
191
|
+
target,
|
|
192
|
+
options=(),
|
|
193
|
+
channel_credentials=None,
|
|
194
|
+
call_credentials=None,
|
|
195
|
+
insecure=False,
|
|
196
|
+
compression=None,
|
|
197
|
+
wait_for_ready=None,
|
|
198
|
+
timeout=None,
|
|
199
|
+
metadata=None):
|
|
200
|
+
return grpc.experimental.unary_unary(
|
|
201
|
+
request,
|
|
202
|
+
target,
|
|
203
|
+
'/serve.v1.ServeService/AddVersion',
|
|
204
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionRequest.SerializeToString,
|
|
205
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionResponse.FromString,
|
|
206
|
+
options,
|
|
207
|
+
channel_credentials,
|
|
208
|
+
insecure,
|
|
209
|
+
call_credentials,
|
|
210
|
+
compression,
|
|
211
|
+
wait_for_ready,
|
|
212
|
+
timeout,
|
|
213
|
+
metadata,
|
|
214
|
+
_registered_method=True)
|
|
215
|
+
|
|
216
|
+
@staticmethod
|
|
217
|
+
def TerminateServices(request,
|
|
218
|
+
target,
|
|
219
|
+
options=(),
|
|
220
|
+
channel_credentials=None,
|
|
221
|
+
call_credentials=None,
|
|
222
|
+
insecure=False,
|
|
223
|
+
compression=None,
|
|
224
|
+
wait_for_ready=None,
|
|
225
|
+
timeout=None,
|
|
226
|
+
metadata=None):
|
|
227
|
+
return grpc.experimental.unary_unary(
|
|
228
|
+
request,
|
|
229
|
+
target,
|
|
230
|
+
'/serve.v1.ServeService/TerminateServices',
|
|
231
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesRequest.SerializeToString,
|
|
232
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesResponse.FromString,
|
|
233
|
+
options,
|
|
234
|
+
channel_credentials,
|
|
235
|
+
insecure,
|
|
236
|
+
call_credentials,
|
|
237
|
+
compression,
|
|
238
|
+
wait_for_ready,
|
|
239
|
+
timeout,
|
|
240
|
+
metadata,
|
|
241
|
+
_registered_method=True)
|
|
242
|
+
|
|
243
|
+
@staticmethod
|
|
244
|
+
def TerminateReplica(request,
|
|
245
|
+
target,
|
|
246
|
+
options=(),
|
|
247
|
+
channel_credentials=None,
|
|
248
|
+
call_credentials=None,
|
|
249
|
+
insecure=False,
|
|
250
|
+
compression=None,
|
|
251
|
+
wait_for_ready=None,
|
|
252
|
+
timeout=None,
|
|
253
|
+
metadata=None):
|
|
254
|
+
return grpc.experimental.unary_unary(
|
|
255
|
+
request,
|
|
256
|
+
target,
|
|
257
|
+
'/serve.v1.ServeService/TerminateReplica',
|
|
258
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaRequest.SerializeToString,
|
|
259
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaResponse.FromString,
|
|
260
|
+
options,
|
|
261
|
+
channel_credentials,
|
|
262
|
+
insecure,
|
|
263
|
+
call_credentials,
|
|
264
|
+
compression,
|
|
265
|
+
wait_for_ready,
|
|
266
|
+
timeout,
|
|
267
|
+
metadata,
|
|
268
|
+
_registered_method=True)
|
|
269
|
+
|
|
270
|
+
@staticmethod
|
|
271
|
+
def WaitServiceRegistration(request,
|
|
272
|
+
target,
|
|
273
|
+
options=(),
|
|
274
|
+
channel_credentials=None,
|
|
275
|
+
call_credentials=None,
|
|
276
|
+
insecure=False,
|
|
277
|
+
compression=None,
|
|
278
|
+
wait_for_ready=None,
|
|
279
|
+
timeout=None,
|
|
280
|
+
metadata=None):
|
|
281
|
+
return grpc.experimental.unary_unary(
|
|
282
|
+
request,
|
|
283
|
+
target,
|
|
284
|
+
'/serve.v1.ServeService/WaitServiceRegistration',
|
|
285
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationRequest.SerializeToString,
|
|
286
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationResponse.FromString,
|
|
287
|
+
options,
|
|
288
|
+
channel_credentials,
|
|
289
|
+
insecure,
|
|
290
|
+
call_credentials,
|
|
291
|
+
compression,
|
|
292
|
+
wait_for_ready,
|
|
293
|
+
timeout,
|
|
294
|
+
metadata,
|
|
295
|
+
_registered_method=True)
|
|
296
|
+
|
|
297
|
+
@staticmethod
|
|
298
|
+
def UpdateService(request,
|
|
299
|
+
target,
|
|
300
|
+
options=(),
|
|
301
|
+
channel_credentials=None,
|
|
302
|
+
call_credentials=None,
|
|
303
|
+
insecure=False,
|
|
304
|
+
compression=None,
|
|
305
|
+
wait_for_ready=None,
|
|
306
|
+
timeout=None,
|
|
307
|
+
metadata=None):
|
|
308
|
+
return grpc.experimental.unary_unary(
|
|
309
|
+
request,
|
|
310
|
+
target,
|
|
311
|
+
'/serve.v1.ServeService/UpdateService',
|
|
312
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceRequest.SerializeToString,
|
|
313
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceResponse.FromString,
|
|
314
|
+
options,
|
|
315
|
+
channel_credentials,
|
|
316
|
+
insecure,
|
|
317
|
+
call_credentials,
|
|
318
|
+
compression,
|
|
319
|
+
wait_for_ready,
|
|
320
|
+
timeout,
|
|
321
|
+
metadata,
|
|
322
|
+
_registered_method=True)
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"""Rpc Utilities for SkyServe"""
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
5
|
+
|
|
6
|
+
from sky import backends
|
|
7
|
+
from sky.adaptors import common as adaptors_common
|
|
8
|
+
from sky.backends import backend_utils
|
|
9
|
+
from sky.serve import serve_utils
|
|
10
|
+
|
|
11
|
+
if typing.TYPE_CHECKING:
|
|
12
|
+
from sky.schemas.generated import servev1_pb2
|
|
13
|
+
else:
|
|
14
|
+
servev1_pb2 = adaptors_common.LazyImport(
|
|
15
|
+
'sky.schemas.generated.servev1_pb2')
|
|
16
|
+
|
|
17
|
+
# ======================= gRPC Converters for Sky Serve =======================
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GetServiceStatusRequestConverter:
|
|
21
|
+
"""Converter for GetServiceStatusRequest"""
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def to_proto(cls, service_names: Optional[List[str]],
|
|
25
|
+
pool: bool) -> 'servev1_pb2.GetServiceStatusRequest':
|
|
26
|
+
request = servev1_pb2.GetServiceStatusRequest()
|
|
27
|
+
request.pool = pool
|
|
28
|
+
if service_names is not None:
|
|
29
|
+
request.service_names.names.extend(service_names)
|
|
30
|
+
return request
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def from_proto(
|
|
34
|
+
cls, proto: 'servev1_pb2.GetServiceStatusRequest'
|
|
35
|
+
) -> Tuple[Optional[List[str]], bool]:
|
|
36
|
+
pool = proto.pool
|
|
37
|
+
if proto.HasField('service_names'):
|
|
38
|
+
service_names = list(proto.service_names.names)
|
|
39
|
+
else:
|
|
40
|
+
service_names = None
|
|
41
|
+
return service_names, pool
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class GetServiceStatusResponseConverter:
|
|
45
|
+
"""Converter for GetServiceStatusResponse"""
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def to_proto(
|
|
49
|
+
cls,
|
|
50
|
+
statuses: List[Dict[str,
|
|
51
|
+
str]]) -> 'servev1_pb2.GetServiceStatusResponse':
|
|
52
|
+
response = servev1_pb2.GetServiceStatusResponse()
|
|
53
|
+
for status in statuses:
|
|
54
|
+
added = response.statuses.add()
|
|
55
|
+
added.status.update(status)
|
|
56
|
+
return response
|
|
57
|
+
|
|
58
|
+
@classmethod
|
|
59
|
+
def from_proto(
|
|
60
|
+
cls, proto: 'servev1_pb2.GetServiceStatusResponse'
|
|
61
|
+
) -> List[Dict[str, str]]:
|
|
62
|
+
pickled = [dict(status.status) for status in proto.statuses]
|
|
63
|
+
return pickled
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class TerminateServicesRequestConverter:
|
|
67
|
+
"""Converter for TerminateServicesRequest"""
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def to_proto(cls, service_names: Optional[List[str]], purge: bool,
|
|
71
|
+
pool: bool) -> 'servev1_pb2.TerminateServicesRequest':
|
|
72
|
+
request = servev1_pb2.TerminateServicesRequest()
|
|
73
|
+
request.purge = purge
|
|
74
|
+
request.pool = pool
|
|
75
|
+
if service_names is not None:
|
|
76
|
+
request.service_names.names.extend(service_names)
|
|
77
|
+
return request
|
|
78
|
+
|
|
79
|
+
@classmethod
|
|
80
|
+
def from_proto(
|
|
81
|
+
cls, proto: 'servev1_pb2.TerminateServicesRequest'
|
|
82
|
+
) -> Tuple[Optional[List[str]], bool, bool]:
|
|
83
|
+
purge = proto.purge
|
|
84
|
+
pool = proto.pool
|
|
85
|
+
if proto.HasField('service_names'):
|
|
86
|
+
service_names = list(proto.service_names.names)
|
|
87
|
+
else:
|
|
88
|
+
service_names = None
|
|
89
|
+
return service_names, purge, pool
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# ========================= gRPC Runner for Sky Serve =========================
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class RpcRunner:
|
|
96
|
+
"""gRPC Runner for Sky Serve
|
|
97
|
+
|
|
98
|
+
The RPC runner does not catch errors, and assumes that backend handle has
|
|
99
|
+
grpc enabled.
|
|
100
|
+
|
|
101
|
+
Common exceptions raised:
|
|
102
|
+
exceptions.FetchClusterInfoError
|
|
103
|
+
exceptions.SkyletInternalError
|
|
104
|
+
grpc.RpcError
|
|
105
|
+
grpc.FutureTimeoutError
|
|
106
|
+
AssertionError
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
@classmethod
|
|
110
|
+
def get_service_status(cls, handle: backends.CloudVmRayResourceHandle,
|
|
111
|
+
service_names: Optional[List[str]],
|
|
112
|
+
pool: bool) -> List[Dict[str, Any]]:
|
|
113
|
+
assert handle.is_grpc_enabled_with_flag
|
|
114
|
+
request = GetServiceStatusRequestConverter.to_proto(service_names, pool)
|
|
115
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
116
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
117
|
+
).get_service_status(request))
|
|
118
|
+
pickled = GetServiceStatusResponseConverter.from_proto(response)
|
|
119
|
+
return serve_utils.unpickle_service_status(pickled)
|
|
120
|
+
|
|
121
|
+
@classmethod
|
|
122
|
+
def add_version(cls, handle: backends.CloudVmRayResourceHandle,
|
|
123
|
+
service_name: str) -> int:
|
|
124
|
+
assert handle.is_grpc_enabled_with_flag
|
|
125
|
+
request = servev1_pb2.AddVersionRequest(service_name=service_name)
|
|
126
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
127
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
128
|
+
).add_serve_version(request))
|
|
129
|
+
return response.version
|
|
130
|
+
|
|
131
|
+
@classmethod
|
|
132
|
+
def terminate_services(cls, handle: backends.CloudVmRayResourceHandle,
|
|
133
|
+
service_names: Optional[List[str]], purge: bool,
|
|
134
|
+
pool: bool) -> str:
|
|
135
|
+
assert handle.is_grpc_enabled_with_flag
|
|
136
|
+
request = TerminateServicesRequestConverter.to_proto(
|
|
137
|
+
service_names, purge, pool)
|
|
138
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
139
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
140
|
+
).terminate_services(request))
|
|
141
|
+
return response.message
|
|
142
|
+
|
|
143
|
+
@classmethod
|
|
144
|
+
def terminate_replica(cls, handle: backends.CloudVmRayResourceHandle,
|
|
145
|
+
service_name: str, replica_id: int,
|
|
146
|
+
purge: bool) -> str:
|
|
147
|
+
assert handle.is_grpc_enabled_with_flag
|
|
148
|
+
request = servev1_pb2.TerminateReplicaRequest(service_name=service_name,
|
|
149
|
+
replica_id=replica_id,
|
|
150
|
+
purge=purge)
|
|
151
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
152
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
153
|
+
).terminate_replica(request))
|
|
154
|
+
return response.message
|
|
155
|
+
|
|
156
|
+
@classmethod
|
|
157
|
+
def wait_service_registration(cls,
|
|
158
|
+
handle: backends.CloudVmRayResourceHandle,
|
|
159
|
+
service_name: str, job_id: int,
|
|
160
|
+
pool: bool) -> int:
|
|
161
|
+
assert handle.is_grpc_enabled_with_flag
|
|
162
|
+
request = servev1_pb2.WaitServiceRegistrationRequest(
|
|
163
|
+
service_name=service_name, job_id=job_id, pool=pool)
|
|
164
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
165
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
166
|
+
).wait_service_registration(request))
|
|
167
|
+
return response.lb_port
|
|
168
|
+
|
|
169
|
+
@classmethod
|
|
170
|
+
def update_service(cls, handle: backends.CloudVmRayResourceHandle,
|
|
171
|
+
service_name: str, version: int,
|
|
172
|
+
mode: serve_utils.UpdateMode, pool: bool) -> None:
|
|
173
|
+
assert handle.is_grpc_enabled_with_flag
|
|
174
|
+
request = servev1_pb2.UpdateServiceRequest(service_name=service_name,
|
|
175
|
+
version=version,
|
|
176
|
+
mode=mode.value,
|
|
177
|
+
pool=pool)
|
|
178
|
+
backend_utils.invoke_skylet_with_retries(lambda: backends.SkyletClient(
|
|
179
|
+
handle.get_grpc_channel()).update_service(request))
|
sky/serve/serve_utils.py
CHANGED
|
@@ -745,8 +745,8 @@ def _get_service_status(
|
|
|
745
745
|
return record
|
|
746
746
|
|
|
747
747
|
|
|
748
|
-
def
|
|
749
|
-
pool: bool) -> str:
|
|
748
|
+
def get_service_status_pickled(service_names: Optional[List[str]],
|
|
749
|
+
pool: bool) -> List[Dict[str, str]]:
|
|
750
750
|
service_statuses: List[Dict[str, str]] = []
|
|
751
751
|
if service_names is None:
|
|
752
752
|
# Get all service names
|
|
@@ -759,14 +759,34 @@ def get_service_status_encoded(service_names: Optional[List[str]],
|
|
|
759
759
|
k: base64.b64encode(pickle.dumps(v)).decode('utf-8')
|
|
760
760
|
for k, v in service_status.items()
|
|
761
761
|
})
|
|
762
|
-
|
|
762
|
+
return sorted(service_statuses, key=lambda x: x['name'])
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
# TODO (kyuds): remove when serve codegen is removed
|
|
766
|
+
def get_service_status_encoded(service_names: Optional[List[str]],
|
|
767
|
+
pool: bool) -> str:
|
|
763
768
|
# We have to use payload_type here to avoid the issue of
|
|
764
769
|
# message_utils.decode_payload() not being able to correctly decode the
|
|
765
770
|
# message with <sky-payload> tags.
|
|
771
|
+
service_statuses = get_service_status_pickled(service_names, pool)
|
|
766
772
|
return message_utils.encode_payload(service_statuses,
|
|
767
773
|
payload_type='service_status')
|
|
768
774
|
|
|
769
775
|
|
|
776
|
+
def unpickle_service_status(
|
|
777
|
+
payload: List[Dict[str, str]]) -> List[Dict[str, Any]]:
|
|
778
|
+
service_statuses: List[Dict[str, Any]] = []
|
|
779
|
+
for service_status in payload:
|
|
780
|
+
if not isinstance(service_status, dict):
|
|
781
|
+
raise ValueError(f'Invalid service status: {service_status}')
|
|
782
|
+
service_statuses.append({
|
|
783
|
+
k: pickle.loads(base64.b64decode(v))
|
|
784
|
+
for k, v in service_status.items()
|
|
785
|
+
})
|
|
786
|
+
return service_statuses
|
|
787
|
+
|
|
788
|
+
|
|
789
|
+
# TODO (kyuds): remove when serve codegen is removed
|
|
770
790
|
def load_service_status(payload: str) -> List[Dict[str, Any]]:
|
|
771
791
|
try:
|
|
772
792
|
service_statuses_encoded = message_utils.decode_payload(
|
|
@@ -778,22 +798,16 @@ def load_service_status(payload: str) -> List[Dict[str, Any]]:
|
|
|
778
798
|
service_statuses_encoded = message_utils.decode_payload(payload)
|
|
779
799
|
else:
|
|
780
800
|
raise
|
|
781
|
-
|
|
782
|
-
for service_status in service_statuses_encoded:
|
|
783
|
-
if not isinstance(service_status, dict):
|
|
784
|
-
raise ValueError(f'Invalid service status: {service_status}')
|
|
785
|
-
service_statuses.append({
|
|
786
|
-
k: pickle.loads(base64.b64decode(v))
|
|
787
|
-
for k, v in service_status.items()
|
|
788
|
-
})
|
|
789
|
-
return service_statuses
|
|
801
|
+
return unpickle_service_status(service_statuses_encoded)
|
|
790
802
|
|
|
791
803
|
|
|
804
|
+
# TODO (kyuds): remove when serve codegen is removed
|
|
792
805
|
def add_version_encoded(service_name: str) -> str:
|
|
793
806
|
new_version = serve_state.add_version(service_name)
|
|
794
807
|
return message_utils.encode_payload(new_version)
|
|
795
808
|
|
|
796
809
|
|
|
810
|
+
# TODO (kyuds): remove when serve codegen is removed
|
|
797
811
|
def load_version_string(payload: str) -> str:
|
|
798
812
|
return message_utils.decode_payload(payload)
|
|
799
813
|
|
|
@@ -999,6 +1013,8 @@ def wait_service_registration(service_name: str, job_id: int,
|
|
|
999
1013
|
Returns:
|
|
1000
1014
|
Encoded load balancer port assigned to the service.
|
|
1001
1015
|
"""
|
|
1016
|
+
# TODO (kyuds): when codegen is fully deprecated, return the lb port
|
|
1017
|
+
# as an int directly instead of encoding it.
|
|
1002
1018
|
start_time = time.time()
|
|
1003
1019
|
setup_completed = False
|
|
1004
1020
|
noun = 'pool' if pool else 'service'
|
|
@@ -1546,6 +1562,7 @@ def _format_replica_table(replica_records: List[Dict[str, Any]], show_all: bool,
|
|
|
1546
1562
|
|
|
1547
1563
|
|
|
1548
1564
|
# =========================== CodeGen for Sky Serve ===========================
|
|
1565
|
+
# TODO (kyuds): deprecate and remove serve codegen entirely.
|
|
1549
1566
|
|
|
1550
1567
|
|
|
1551
1568
|
# TODO(tian): Use REST API instead of SSH in the future. This codegen pattern
|
sky/serve/server/core.py
CHANGED
|
@@ -5,7 +5,9 @@ from typing import Any, Dict, List, Optional, Tuple, Union
|
|
|
5
5
|
from sky import backends
|
|
6
6
|
from sky import exceptions
|
|
7
7
|
from sky import sky_logging
|
|
8
|
+
from sky.adaptors import common as adaptors_common
|
|
8
9
|
from sky.backends import backend_utils
|
|
10
|
+
from sky.serve import serve_rpc_utils
|
|
9
11
|
from sky.serve import serve_utils
|
|
10
12
|
from sky.serve.server import impl
|
|
11
13
|
from sky.usage import usage_lib
|
|
@@ -13,7 +15,11 @@ from sky.utils import controller_utils
|
|
|
13
15
|
from sky.utils import subprocess_utils
|
|
14
16
|
|
|
15
17
|
if typing.TYPE_CHECKING:
|
|
18
|
+
import grpc
|
|
19
|
+
|
|
16
20
|
import sky
|
|
21
|
+
else:
|
|
22
|
+
grpc = adaptors_common.LazyImport('grpc')
|
|
17
23
|
|
|
18
24
|
logger = sky_logging.init_logger(__name__)
|
|
19
25
|
|
|
@@ -105,25 +111,37 @@ def terminate_replica(service_name: str, replica_id: int, purge: bool) -> None:
|
|
|
105
111
|
'Please spin up a service first.',
|
|
106
112
|
)
|
|
107
113
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
114
|
+
assert isinstance(handle, backends.CloudVmRayResourceHandle)
|
|
115
|
+
use_legacy = not handle.is_grpc_enabled_with_flag
|
|
116
|
+
|
|
117
|
+
if handle.is_grpc_enabled_with_flag:
|
|
118
|
+
try:
|
|
119
|
+
stdout = serve_rpc_utils.RpcRunner.terminate_replica(
|
|
120
|
+
handle, service_name, replica_id, purge)
|
|
121
|
+
except exceptions.SkyletMethodNotImplementedError:
|
|
122
|
+
use_legacy = True
|
|
123
|
+
|
|
124
|
+
if use_legacy:
|
|
125
|
+
backend = backend_utils.get_backend_from_handle(handle)
|
|
126
|
+
assert isinstance(backend, backends.CloudVmRayBackend)
|
|
127
|
+
|
|
128
|
+
code = serve_utils.ServeCodeGen.terminate_replica(
|
|
129
|
+
service_name, replica_id, purge)
|
|
130
|
+
returncode, stdout, stderr = backend.run_on_head(handle,
|
|
131
|
+
code,
|
|
132
|
+
require_outputs=True,
|
|
133
|
+
stream_logs=False,
|
|
134
|
+
separate_stderr=True)
|
|
135
|
+
|
|
136
|
+
try:
|
|
137
|
+
subprocess_utils.handle_returncode(
|
|
138
|
+
returncode,
|
|
139
|
+
code,
|
|
140
|
+
'Failed to terminate the replica',
|
|
141
|
+
stderr,
|
|
142
|
+
stream_logs=True)
|
|
143
|
+
except exceptions.CommandError as e:
|
|
144
|
+
raise RuntimeError(e.error_msg) from e
|
|
127
145
|
|
|
128
146
|
sky_logging.print(stdout)
|
|
129
147
|
|