Skip to content

Commit 2f37c56

Browse files
committed
format
1 parent 7f58300 commit 2f37c56

3 files changed

Lines changed: 171 additions & 61 deletions

File tree

‎centml/cli/cluster.py‎

Lines changed: 90 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,34 @@
33
from typing import Dict
44
import click
55
from tabulate import tabulate
6-
from centml.sdk import DeploymentType, DeploymentStatus, ServiceStatus, ApiException, HardwareInstanceResponse
6+
from centml.sdk import (
7+
DeploymentType,
8+
DeploymentStatus,
9+
ServiceStatus,
10+
ApiException,
11+
HardwareInstanceResponse,
12+
)
713
from centml.sdk.api import get_centml_client
814

915

1016
depl_type_to_name_map = {
11-
DeploymentType.INFERENCE: 'inference',
12-
DeploymentType.COMPUTE: 'compute',
13-
DeploymentType.COMPILATION: 'compilation',
14-
DeploymentType.INFERENCE_V2: 'inference',
15-
DeploymentType.COMPUTE_V2: 'compute',
16-
DeploymentType.CSERVE: 'cserve',
17-
DeploymentType.CSERVE_V2: 'cserve-v2',
18-
DeploymentType.CSERVE_V3: 'cserve',
19-
DeploymentType.RAG: 'rag',
17+
DeploymentType.INFERENCE: "inference",
18+
DeploymentType.COMPUTE: "compute",
19+
DeploymentType.COMPILATION: "compilation",
20+
DeploymentType.INFERENCE_V2: "inference",
21+
DeploymentType.COMPUTE_V2: "compute",
22+
DeploymentType.CSERVE: "cserve",
23+
DeploymentType.CSERVE_V2: "cserve-v2",
24+
DeploymentType.CSERVE_V3: "cserve",
25+
DeploymentType.RAG: "rag",
2026
}
2127
depl_name_to_type_map = {
22-
'inference': DeploymentType.INFERENCE_V2,
23-
'cserve': DeploymentType.CSERVE_V3,
24-
'cserve-v2': DeploymentType.CSERVE_V2,
25-
'cserve-v3': DeploymentType.CSERVE_V3,
26-
'compute': DeploymentType.COMPUTE_V2,
27-
'rag': DeploymentType.RAG,
28+
"inference": DeploymentType.INFERENCE_V2,
29+
"cserve": DeploymentType.CSERVE_V3,
30+
"cserve-v2": DeploymentType.CSERVE_V2,
31+
"cserve-v3": DeploymentType.CSERVE_V3,
32+
"compute": DeploymentType.COMPUTE_V2,
33+
"rag": DeploymentType.RAG,
2834
}
2935

3036

@@ -63,8 +69,12 @@ def _get_replica_info(deployment, depl_type):
6369
"""Extract replica information handling V2/V3 field differences"""
6470
if depl_type == DeploymentType.CSERVE_V3:
6571
return {
66-
"min": getattr(deployment, 'min_replicas', getattr(deployment, 'min_scale', None)),
67-
"max": getattr(deployment, 'max_replicas', getattr(deployment, 'max_scale', None)),
72+
"min": getattr(
73+
deployment, "min_replicas", getattr(deployment, "min_scale", None)
74+
),
75+
"max": getattr(
76+
deployment, "max_replicas", getattr(deployment, "max_scale", None)
77+
),
6878
}
6979
else: # V2
7080
return {"min": deployment.min_scale, "max": deployment.max_scale}
@@ -73,36 +83,67 @@ def _get_replica_info(deployment, depl_type):
7383
def _get_ready_status(cclient, deployment):
7484
api_status = deployment.status
7585
service_status = (
76-
cclient.get_status(deployment.id).service_status if deployment.status == DeploymentStatus.ACTIVE else None
86+
cclient.get_status(deployment.id).service_status
87+
if deployment.status == DeploymentStatus.ACTIVE
88+
else None
7789
)
7890

7991
status_styles = {
8092
(DeploymentStatus.PAUSED, None): ("paused", "yellow", "black"),
8193
(DeploymentStatus.DELETED, None): ("deleted", "white", "black"),
8294
(DeploymentStatus.ACTIVE, ServiceStatus.HEALTHY): ("ready", "green", "black"),
83-
(DeploymentStatus.ACTIVE, ServiceStatus.INITIALIZING): ("starting", "black", "white"),
84-
(DeploymentStatus.ACTIVE, ServiceStatus.MISSING): ("starting", "black", "white"),
95+
(DeploymentStatus.ACTIVE, ServiceStatus.INITIALIZING): (
96+
"starting",
97+
"black",
98+
"white",
99+
),
100+
(DeploymentStatus.ACTIVE, ServiceStatus.MISSING): (
101+
"starting",
102+
"black",
103+
"white",
104+
),
85105
(DeploymentStatus.ACTIVE, ServiceStatus.ERROR): ("error", "red", "black"),
86106
(DeploymentStatus.ACTIVE, ServiceStatus.CREATECONTAINERCONFIGERROR): (
87107
"createContainerConfigError",
88108
"red",
89109
"black",
90110
),
91-
(DeploymentStatus.ACTIVE, ServiceStatus.CRASHLOOPBACKOFF): ("crashLoopBackOff", "red", "black"),
92-
(DeploymentStatus.ACTIVE, ServiceStatus.IMAGEPULLBACKOFF): ("imagePullBackOff", "red", "black"),
93-
(DeploymentStatus.ACTIVE, ServiceStatus.PROGRESSDEADLINEEXCEEDED): ("progressDeadlineExceeded", "red", "black"),
111+
(DeploymentStatus.ACTIVE, ServiceStatus.CRASHLOOPBACKOFF): (
112+
"crashLoopBackOff",
113+
"red",
114+
"black",
115+
),
116+
(DeploymentStatus.ACTIVE, ServiceStatus.IMAGEPULLBACKOFF): (
117+
"imagePullBackOff",
118+
"red",
119+
"black",
120+
),
121+
(DeploymentStatus.ACTIVE, ServiceStatus.PROGRESSDEADLINEEXCEEDED): (
122+
"progressDeadlineExceeded",
123+
"red",
124+
"black",
125+
),
94126
}
95127

96-
style = status_styles.get((api_status, service_status), ("unknown", "black", "white"))
128+
style = status_styles.get(
129+
(api_status, service_status), ("unknown", "black", "white")
130+
)
97131
# Handle foreground and background colors
98132
return click.style(style[0], fg=style[1], bg=style[2])
99133

100134

101135
@click.command(help="List all deployments")
102-
@click.argument("type", type=click.Choice(list(depl_name_to_type_map.keys())), required=False, default=None)
136+
@click.argument(
137+
"type",
138+
type=click.Choice(list(depl_name_to_type_map.keys())),
139+
required=False,
140+
default=None,
141+
)
103142
def ls(type):
104143
with get_centml_client() as cclient:
105-
depl_type = depl_name_to_type_map[type] if type in depl_name_to_type_map else None
144+
depl_type = (
145+
depl_name_to_type_map[type] if type in depl_name_to_type_map else None
146+
)
106147
deployments = cclient.get(depl_type)
107148
rows = []
108149
for d in deployments:
@@ -184,7 +225,10 @@ def get(type, id):
184225
elif depl_type == DeploymentType.COMPUTE_V2:
185226
click.echo(
186227
tabulate(
187-
[("Username", "centml"), ("SSH key", _format_ssh_key(deployment.ssh_public_key))],
228+
[
229+
("Username", "centml"),
230+
("SSH key", _format_ssh_key(deployment.ssh_public_key)),
231+
],
188232
tablefmt="rounded_outline",
189233
disable_numparse=True,
190234
)
@@ -196,24 +240,34 @@ def get(type, id):
196240
(
197241
"Parallelism",
198242
{
199-
"tensor": deployment.recipe.additional_properties.get('tensor_parallel_size', 'N/A'),
200-
"pipeline": deployment.recipe.additional_properties.get('pipeline_parallel_size', 'N/A'),
243+
"tensor": deployment.recipe.additional_properties.get(
244+
"tensor_parallel_size", "N/A"
245+
),
246+
"pipeline": deployment.recipe.additional_properties.get(
247+
"pipeline_parallel_size", "N/A"
248+
),
201249
},
202250
),
203251
("Replicas", replica_info),
204252
("Max concurrency", deployment.concurrency or "None"),
205253
]
206-
254+
207255
# Add V3-specific rollout information
208256
if depl_type == DeploymentType.CSERVE_V3:
209257
rollout_info = {}
210-
if hasattr(deployment, 'max_surge') and deployment.max_surge is not None:
211-
rollout_info['max_surge'] = deployment.max_surge
212-
if hasattr(deployment, 'max_unavailable') and deployment.max_unavailable is not None:
213-
rollout_info['max_unavailable'] = deployment.max_unavailable
258+
if (
259+
hasattr(deployment, "max_surge")
260+
and deployment.max_surge is not None
261+
):
262+
rollout_info["max_surge"] = deployment.max_surge
263+
if (
264+
hasattr(deployment, "max_unavailable")
265+
and deployment.max_unavailable is not None
266+
):
267+
rollout_info["max_unavailable"] = deployment.max_unavailable
214268
if rollout_info:
215269
display_rows.append(("Rollout strategy", rollout_info))
216-
270+
217271
click.echo(
218272
tabulate(
219273
display_rows,

‎centml/sdk/api.py‎

Lines changed: 73 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,37 @@ def get_status(self, id):
2828
return self._api.get_deployment_status_deployments_status_deployment_id_get(id)
2929

3030
def get_inference(self, id):
31-
return self._api.get_inference_deployment_deployments_inference_deployment_id_get(id)
31+
return (
32+
self._api.get_inference_deployment_deployments_inference_deployment_id_get(
33+
id
34+
)
35+
)
3236

3337
def get_compute(self, id):
34-
return self._api.get_compute_deployment_deployments_compute_deployment_id_get(id)
38+
return self._api.get_compute_deployment_deployments_compute_deployment_id_get(
39+
id
40+
)
3541

3642
def get_cserve(self, id):
37-
return self._api.get_cserve_v3_deployment_deployments_cserve_v3_deployment_id_get(id)
43+
return (
44+
self._api.get_cserve_v3_deployment_deployments_cserve_v3_deployment_id_get(
45+
id
46+
)
47+
)
3848

3949
def get_cserve_v2(self, id):
40-
return self._api.get_cserve_v2_deployment_deployments_cserve_v2_deployment_id_get(id)
50+
return (
51+
self._api.get_cserve_v2_deployment_deployments_cserve_v2_deployment_id_get(
52+
id
53+
)
54+
)
4155

4256
def get_cserve_v3(self, id):
43-
return self._api.get_cserve_v3_deployment_deployments_cserve_v3_deployment_id_get(id)
57+
return (
58+
self._api.get_cserve_v3_deployment_deployments_cserve_v3_deployment_id_get(
59+
id
60+
)
61+
)
4462

4563
def create_inference(self, request: CreateInferenceDeploymentRequest):
4664
return self._api.create_inference_deployment_deployments_inference_post(request)
@@ -57,24 +75,48 @@ def create_cserve_v2(self, request: CreateCServeV2DeploymentRequest):
5775
def create_cserve_v3(self, request: CreateCServeV3DeploymentRequest):
5876
return self._api.create_cserve_v3_deployment_deployments_cserve_v3_post(request)
5977

60-
def update_inference(self, deployment_id: int, request: CreateInferenceDeploymentRequest):
61-
return self._api.update_inference_deployment_deployments_inference_put(deployment_id, request)
78+
def update_inference(
79+
self, deployment_id: int, request: CreateInferenceDeploymentRequest
80+
):
81+
return self._api.update_inference_deployment_deployments_inference_put(
82+
deployment_id, request
83+
)
6284

63-
def update_compute(self, deployment_id: int, request: CreateComputeDeploymentRequest):
64-
return self._api.update_compute_deployment_deployments_compute_put(deployment_id, request)
85+
def update_compute(
86+
self, deployment_id: int, request: CreateComputeDeploymentRequest
87+
):
88+
return self._api.update_compute_deployment_deployments_compute_put(
89+
deployment_id, request
90+
)
6591

66-
def update_cserve(self, deployment_id: int, request: CreateCServeV3DeploymentRequest):
67-
return self._api.update_cserve_v3_deployment_deployments_cserve_v3_put(deployment_id, request)
92+
def update_cserve(
93+
self, deployment_id: int, request: CreateCServeV3DeploymentRequest
94+
):
95+
return self._api.update_cserve_v3_deployment_deployments_cserve_v3_put(
96+
deployment_id, request
97+
)
6898

69-
def update_cserve_v2(self, deployment_id: int, request: CreateCServeV2DeploymentRequest):
70-
return self._api.update_cserve_v2_deployment_deployments_cserve_v2_put(deployment_id, request)
99+
def update_cserve_v2(
100+
self, deployment_id: int, request: CreateCServeV2DeploymentRequest
101+
):
102+
return self._api.update_cserve_v2_deployment_deployments_cserve_v2_put(
103+
deployment_id, request
104+
)
71105

72-
def update_cserve_v3(self, deployment_id: int, request: CreateCServeV3DeploymentRequest):
73-
return self._api.update_cserve_v3_deployment_deployments_cserve_v3_put(deployment_id, request)
106+
def update_cserve_v3(
107+
self, deployment_id: int, request: CreateCServeV3DeploymentRequest
108+
):
109+
return self._api.update_cserve_v3_deployment_deployments_cserve_v3_put(
110+
deployment_id, request
111+
)
74112

75113
def _update_status(self, id, new_status):
76-
status_req = platform_api_python_client.DeploymentStatusRequest(status=new_status)
77-
self._api.update_deployment_status_deployments_status_deployment_id_put(id, status_req)
114+
status_req = platform_api_python_client.DeploymentStatusRequest(
115+
status=new_status
116+
)
117+
self._api.update_deployment_status_deployments_status_deployment_id_put(
118+
id, status_req
119+
)
78120

79121
def delete(self, id):
80122
self._update_status(id, DeploymentStatus.DELETED)
@@ -97,10 +139,16 @@ def get_prebuilt_images(self, depl_type: DeploymentType):
97139
return self._api.get_prebuilt_images_prebuilt_images_get(type=depl_type)
98140

99141
def get_cserve_recipe(self, model=None, hf_token=None):
100-
return self._api.get_cserve_recipe_deployments_cserve_recipes_get(model=model, hf_token=hf_token).results
142+
return self._api.get_cserve_recipe_deployments_cserve_recipes_get(
143+
model=model, hf_token=hf_token
144+
).results
101145

102146
def get_cluster_id(self, hardware_instance_id):
103-
filtered_hw = list(filter(lambda h: h.id == hardware_instance_id, self.get_hardware_instances()))
147+
filtered_hw = list(
148+
filter(
149+
lambda h: h.id == hardware_instance_id, self.get_hardware_instances()
150+
)
151+
)
104152

105153
if len(filtered_hw) == 0:
106154
raise Exception(f"Invalid hardware instance id {hardware_instance_id}")
@@ -114,7 +162,12 @@ def get_user_vault(self, type):
114162

115163
# pylint: disable=R0917
116164
def get_deployment_usage(
117-
self, id: int, metric: Metric, start_time_in_seconds: int, end_time_in_seconds: int, step: int
165+
self,
166+
id: int,
167+
metric: Metric,
168+
start_time_in_seconds: int,
169+
end_time_in_seconds: int,
170+
step: int,
118171
):
119172
return self._api.get_usage_deployments_usage_deployment_id_get(
120173
deployment_id=id,

‎examples/sdk/create_cserve.py‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ def get_default_cserve_config(cclient, name, model):
3636
def main():
3737
with get_centml_client() as cclient:
3838
### Get the configurations for the Qwen model
39-
qwen_config = get_fastest_cserve_config(cclient, name="qwen-fastest", model="Qwen/Qwen2-VL-7B-Instruct")
40-
#qwen_config = get_default_cserve_config(cclient, name="qwen-default", model="Qwen/Qwen2-VL-7B-Instruct")
39+
qwen_config = get_fastest_cserve_config(
40+
cclient, name="qwen-fastest", model="Qwen/Qwen2-VL-7B-Instruct"
41+
)
42+
# qwen_config = get_default_cserve_config(cclient, name="qwen-default", model="Qwen/Qwen2-VL-7B-Instruct")
4143

4244
### Modify the recipe if necessary
4345
qwen_config.recipe.additional_properties["max_num_seqs"] = 512
@@ -46,17 +48,18 @@ def main():
4648
response = cclient.create_cserve(qwen_config)
4749
print("Create deployment response: ", response)
4850

49-
### Get deployment details
51+
### Get deployment details
5052
deployment = cclient.get_cserve_v3(response.id)
5153
print("Deployment details: ", deployment)
5254

53-
'''
55+
"""
5456
### Pause the deployment
5557
cclient.pause(deployment.id)
5658
5759
### Delete the deployment
5860
cclient.delete(deployment.id)
59-
'''
61+
"""
62+
6063

6164
if __name__ == "__main__":
6265
main()

0 commit comments

Comments
 (0)