skypilot-nightly 1.0.0.dev20250916__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.

Files changed (67) hide show
  1. sky/__init__.py +4 -2
  2. sky/adaptors/primeintellect.py +1 -0
  3. sky/adaptors/seeweb.py +68 -4
  4. sky/authentication.py +25 -0
  5. sky/backends/__init__.py +3 -2
  6. sky/backends/backend_utils.py +16 -12
  7. sky/backends/cloud_vm_ray_backend.py +57 -0
  8. sky/catalog/primeintellect_catalog.py +95 -0
  9. sky/clouds/__init__.py +2 -0
  10. sky/clouds/primeintellect.py +314 -0
  11. sky/core.py +10 -3
  12. sky/dashboard/out/404.html +1 -1
  13. sky/dashboard/out/_next/static/chunks/3015-ba5be550eb80fd8c.js +1 -0
  14. sky/dashboard/out/_next/static/chunks/{6856-e0754534b3015377.js → 6856-9a2538f38c004652.js} +1 -1
  15. sky/dashboard/out/_next/static/chunks/8969-a3e3f0683e19d340.js +1 -0
  16. sky/dashboard/out/_next/static/chunks/9037-472ee1222cb1e158.js +6 -0
  17. sky/dashboard/out/_next/static/chunks/{webpack-05f82d90d6fd7f82.js → webpack-487697b47d8c5e50.js} +1 -1
  18. sky/dashboard/out/_next/static/{y8s7LlyyfhMzpzCkxuD2r → k1mo5xWZrV9djgjd0moOT}/_buildManifest.js +1 -1
  19. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  20. sky/dashboard/out/clusters/[cluster].html +1 -1
  21. sky/dashboard/out/clusters.html +1 -1
  22. sky/dashboard/out/config.html +1 -1
  23. sky/dashboard/out/index.html +1 -1
  24. sky/dashboard/out/infra/[context].html +1 -1
  25. sky/dashboard/out/infra.html +1 -1
  26. sky/dashboard/out/jobs/[job].html +1 -1
  27. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  28. sky/dashboard/out/jobs.html +1 -1
  29. sky/dashboard/out/users.html +1 -1
  30. sky/dashboard/out/volumes.html +1 -1
  31. sky/dashboard/out/workspace/new.html +1 -1
  32. sky/dashboard/out/workspaces/[name].html +1 -1
  33. sky/dashboard/out/workspaces.html +1 -1
  34. sky/global_user_state.py +42 -34
  35. sky/jobs/server/server.py +14 -1
  36. sky/jobs/state.py +26 -1
  37. sky/provision/__init__.py +1 -0
  38. sky/provision/docker_utils.py +6 -2
  39. sky/provision/primeintellect/__init__.py +10 -0
  40. sky/provision/primeintellect/config.py +11 -0
  41. sky/provision/primeintellect/instance.py +454 -0
  42. sky/provision/primeintellect/utils.py +398 -0
  43. sky/resources.py +9 -1
  44. sky/schemas/generated/servev1_pb2.py +58 -0
  45. sky/schemas/generated/servev1_pb2.pyi +115 -0
  46. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  47. sky/serve/serve_rpc_utils.py +179 -0
  48. sky/serve/serve_utils.py +29 -12
  49. sky/serve/server/core.py +37 -19
  50. sky/serve/server/impl.py +221 -129
  51. sky/server/requests/executor.py +3 -0
  52. sky/setup_files/dependencies.py +1 -0
  53. sky/skylet/constants.py +5 -3
  54. sky/skylet/services.py +98 -0
  55. sky/skylet/skylet.py +3 -1
  56. sky/templates/kubernetes-ray.yml.j2 +22 -12
  57. sky/templates/primeintellect-ray.yml.j2 +71 -0
  58. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/METADATA +37 -36
  59. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/RECORD +64 -52
  60. sky/dashboard/out/_next/static/chunks/3015-2ea98b57e318bd6e.js +0 -1
  61. sky/dashboard/out/_next/static/chunks/8969-0487dfbf149d9e53.js +0 -1
  62. sky/dashboard/out/_next/static/chunks/9037-f9800e64eb05dd1c.js +0 -6
  63. /sky/dashboard/out/_next/static/{y8s7LlyyfhMzpzCkxuD2r → k1mo5xWZrV9djgjd0moOT}/_ssgManifest.js +0 -0
  64. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/WHEEL +0 -0
  65. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/entry_points.txt +0 -0
  66. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250918.dist-info}/licenses/LICENSE +0 -0
  67. {skypilot_nightly-1.0.0.dev20250916.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 get_service_status_encoded(service_names: Optional[List[str]],
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
- service_statuses = sorted(service_statuses, key=lambda x: x['name'])
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
- service_statuses: List[Dict[str, Any]] = []
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
- backend = backend_utils.get_backend_from_handle(handle)
109
- assert isinstance(backend, backends.CloudVmRayBackend)
110
-
111
- code = serve_utils.ServeCodeGen.terminate_replica(service_name, replica_id,
112
- purge)
113
- returncode, stdout, stderr = backend.run_on_head(handle,
114
- code,
115
- require_outputs=True,
116
- stream_logs=False,
117
- separate_stderr=True)
118
-
119
- try:
120
- subprocess_utils.handle_returncode(returncode,
121
- code,
122
- 'Failed to terminate the replica',
123
- stderr,
124
- stream_logs=True)
125
- except exceptions.CommandError as e:
126
- raise RuntimeError(e.error_msg) from e
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