ahmedghani commited on
Commit
d79f30b
·
1 Parent(s): fb668db

added deployment code

Browse files
Files changed (2) hide show
  1. app.py +350 -0
  2. requirements.txt +5 -0
app.py ADDED
@@ -0,0 +1,350 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import json
3
+ import requests
4
+
5
+ def avaliable_providers():
6
+ providers = []
7
+
8
+ headers = {
9
+ "Content-Type": "application/json",
10
+ }
11
+ endpoint_url = "https://api.endpoints.huggingface.cloud/provider"
12
+ response = requests.get(endpoint_url, headers=headers)
13
+
14
+ for provider in response.json()['items']:
15
+ if provider['status'] == 'available':
16
+ providers.append(provider['vendor'])
17
+
18
+ return providers
19
+
20
+ def update_regions(provider):
21
+ avalialbe_regions = []
22
+
23
+ headers = {
24
+ "Content-Type": "application/json",
25
+ }
26
+ endpoint_url = f"https://api.endpoints.huggingface.cloud/provider/{provider}/region"
27
+ response = requests.get(endpoint_url, headers=headers)
28
+
29
+ for region in response.json()['items']:
30
+ if region['status'] == 'available':
31
+ avalialbe_regions.append(f"{region['region']}/{region['label']}")
32
+
33
+ return gr.Dropdown.update(
34
+ choices=avalialbe_regions,
35
+ value=avalialbe_regions[0] if len(avalialbe_regions) > 0 else None
36
+ )
37
+
38
+ def update_compute_options(provider, region):
39
+ region = region.split("/")[0]
40
+ avalialbe_compute_options = []
41
+
42
+ headers = {
43
+ "Content-Type": "application/json",
44
+ }
45
+ endpoint_url = f"https://api.endpoints.huggingface.cloud/provider/{provider}/region/{region}/compute"
46
+ print(endpoint_url)
47
+ response = requests.get(endpoint_url, headers=headers)
48
+
49
+ for compute in response.json()['items']:
50
+ if compute['status'] == 'available':
51
+ accelerator = compute['accelerator']
52
+ numAccelerators = compute['numAccelerators']
53
+ memoryGb = compute['memoryGb'].replace("Gi", "GB")
54
+ architecture = compute['architecture']
55
+ instanceType = compute['instanceType']
56
+
57
+ type = f"{numAccelerators}vCPU {memoryGb} · {architecture}" if accelerator == "cpu" else f"{numAccelerators}x {architecture}"
58
+
59
+ avalialbe_compute_options.append(
60
+ f"{compute['accelerator'].upper()} [{compute['instanceSize']}] · {type} · {instanceType}"
61
+ )
62
+
63
+ return gr.Dropdown.update(
64
+ choices=avalialbe_compute_options,
65
+ value=avalialbe_compute_options[0] if len(avalialbe_compute_options) > 0 else None
66
+ )
67
+
68
+ def submit(
69
+ hf_token_input,
70
+ endpoint_name_input,
71
+ provider_selector,
72
+ region_selector,
73
+ repository_selector,
74
+ revision_selector,
75
+ task_selector,
76
+ framework_selector,
77
+ compute_selector,
78
+ min_node_selector,
79
+ max_node_selector,
80
+ security_selector
81
+ ):
82
+ compute_resources = compute_selector.split("·")
83
+ accelerator = compute_resources[0][:3].strip()
84
+
85
+ size_l_index = compute_resources[0].index("[") - 1
86
+ size_r_index = compute_resources[0].index("]")
87
+ size = compute_resources[0][size_l_index : size_r_index].strip()
88
+
89
+ type = compute_resources[-1].strip()
90
+
91
+ payload = {
92
+ "accountId": repository_selector.split("/")[0],
93
+ "compute": {
94
+ "accelerator": accelerator.lower(),
95
+ "instanceSize": size[1:],
96
+ "instanceType": type,
97
+ "scaling": {
98
+ "maxReplica": int(max_node_selector),
99
+ "minReplica": int(min_node_selector)
100
+ }
101
+ },
102
+ "model": {
103
+ "framework": "custom",
104
+ "image": {
105
+ "huggingface": {}
106
+ },
107
+ "repository": repository_selector.lower(),
108
+ "revision": revision_selector,
109
+ "task": task_selector.lower()
110
+ },
111
+ "name": endpoint_name_input.strip(),
112
+ "provider": {
113
+ "region": region_selector.split("/")[0].lower(),
114
+ "vendor": provider_selector.lower()
115
+ },
116
+ "type": security_selector.lower()
117
+ }
118
+
119
+ print(payload)
120
+
121
+ payload = json.dumps(payload)
122
+ print(payload)
123
+
124
+ headers = {
125
+ "Authorization": f"Bearer {hf_token_input.strip()}",
126
+ "Content-Type": "application/json",
127
+ }
128
+ endpoint_url = f"https://api.endpoints.huggingface.cloud/endpoint"
129
+ print(endpoint_url)
130
+
131
+ response = requests.post(endpoint_url, headers=headers, data=payload)
132
+ if response.status_code == 400:
133
+ return f"{response.text}. Malformed data in {payload}"
134
+ elif response.status_code == 401:
135
+ return "Invalid token"
136
+ elif response.status_code == 409:
137
+ return f"Error: {response.text}"
138
+ elif response.status_code == 202:
139
+ return f"Endpoint {endpoint_name_input} created successfully on {provider_selector.lower()} using {repository_selector.lower()}@{revision_selector}. \n Please check out the progress at https://ui.endpoints.huggingface.co/endpoints."
140
+ else:
141
+ return f"something went wrong {response.status_code} = {response.text}"
142
+
143
+ with gr.Blocks() as demo2:
144
+ gr.Markdown(
145
+ """
146
+ ## Deploy Your Model on 🤗 Endpoint
147
+ ---
148
+ """)
149
+
150
+ gr.Markdown("""
151
+
152
+ #### Your 🤗 Access Token
153
+ """)
154
+ hf_token_input = gr.Textbox(
155
+ show_label=False,
156
+ type="password"
157
+ )
158
+
159
+ gr.Markdown("""
160
+ #### Decide the Endpoint name
161
+ """)
162
+ endpoint_name_input = gr.Textbox(
163
+ show_label=False
164
+ )
165
+
166
+ providers = avaliable_providers()
167
+
168
+ with gr.Row():
169
+ gr.Markdown("""
170
+ #### Cloud Provider
171
+ """)
172
+
173
+ gr.Markdown("""
174
+ #### Cloud Region
175
+ """)
176
+
177
+ with gr.Row():
178
+ provider_selector = gr.Dropdown(
179
+ choices=providers,
180
+ interactive=True,
181
+ show_label=False,
182
+ )
183
+
184
+ region_selector = gr.Dropdown(
185
+ [],
186
+ value="",
187
+ interactive=True,
188
+ show_label=False,
189
+ )
190
+
191
+ provider_selector.change(update_regions, inputs=provider_selector, outputs=region_selector)
192
+
193
+ with gr.Row():
194
+ gr.Markdown("""
195
+ #### Target Model
196
+ """)
197
+
198
+ gr.Markdown("""
199
+ #### Target Model Version(branch)
200
+ """)
201
+
202
+ with gr.Row():
203
+ repository_selector = gr.Textbox(
204
+ value="",
205
+ interactive=True,
206
+ show_label=False,
207
+ )
208
+
209
+ revision_selector = gr.Textbox(
210
+ value="",
211
+ interactive=True,
212
+ show_label=False,
213
+ )
214
+
215
+ with gr.Row():
216
+ gr.Markdown("""
217
+ #### Task
218
+ """)
219
+
220
+ gr.Markdown("""
221
+ #### Framework
222
+ """)
223
+
224
+ with gr.Row():
225
+ task_selector = gr.Textbox(
226
+ value="Custom",
227
+ interactive=True,
228
+ show_label=False,
229
+ )
230
+
231
+ framework_selector = gr.Textbox(
232
+ value="Custom",
233
+ interactive=True,
234
+ show_label=False,
235
+ )
236
+
237
+ gr.Markdown("""
238
+
239
+ #### Select Compute Instance Type
240
+ """)
241
+ compute_selector = gr.Dropdown(
242
+ [],
243
+ value="",
244
+ interactive=True,
245
+ show_label=False,
246
+ )
247
+ region_selector.change(update_compute_options, inputs=[provider_selector, region_selector], outputs=compute_selector)
248
+
249
+ with gr.Row():
250
+ gr.Markdown("""
251
+ #### Min Number of Nodes
252
+ """)
253
+
254
+ gr.Markdown("""
255
+ #### Max Number of Nodes
256
+ """)
257
+
258
+ gr.Markdown("""
259
+ #### Security Level
260
+ """)
261
+
262
+ with gr.Row():
263
+ min_node_selector = gr.Number(
264
+ value=1,
265
+ interactive=True,
266
+ show_label=False,
267
+ )
268
+
269
+ max_node_selector = gr.Number(
270
+ value=1,
271
+ interactive=True,
272
+ show_label=False,
273
+ )
274
+
275
+ security_selector = gr.Radio(
276
+ choices=["Protected", "Public", "Private"],
277
+ value="Public",
278
+ interactive=True,
279
+ show_label=False,
280
+ )
281
+
282
+ submit_button = gr.Button(
283
+ value="Submit",
284
+ )
285
+
286
+ status_txt = gr.Textbox(
287
+ value="any status update will be displayed here",
288
+ interactive=False
289
+ )
290
+
291
+ submit_button.click(
292
+ submit,
293
+ inputs=[
294
+ hf_token_input,
295
+ endpoint_name_input,
296
+ provider_selector,
297
+ region_selector,
298
+ repository_selector,
299
+ revision_selector,
300
+ task_selector,
301
+ framework_selector,
302
+ compute_selector,
303
+ min_node_selector,
304
+ max_node_selector,
305
+ security_selector],
306
+ outputs=status_txt)
307
+
308
+ gr.Markdown("""
309
+ #### Pricing Table(CPU) - 2023/2/22
310
+ """)
311
+
312
+ gr.Dataframe(
313
+ headers=["provider", "size", "$/h", "vCPUs", "Memory", "Architecture"],
314
+ datatype=["str", "str", "str", "number", "str", "str"],
315
+ row_count=8,
316
+ col_count=(6, "fixed"),
317
+ value=[
318
+ ["aws", "small", "$0.06", 1, "2GB", "Intel Xeon - Ice Lake"],
319
+ ["aws", "medium", "$0.12", 2, "4GB", "Intel Xeon - Ice Lake"],
320
+ ["aws", "large", "$0.24", 4, "8GB", "Intel Xeon - Ice Lake"],
321
+ ["aws", "xlarge", "$0.48", 8, "16GB", "Intel Xeon - Ice Lake"],
322
+ ["azure", "small", "$0.06", 1, "2GB", "Intel Xeon"],
323
+ ["azure", "medium", "$0.12", 2, "4GB", "Intel Xeon"],
324
+ ["azure", "large", "$0.24", 4, "8GB", "Intel Xeon"],
325
+ ["azure", "xlarge", "$0.48", 8, "16GB", "Intel Xeon"],
326
+ ]
327
+ )
328
+
329
+ gr.Markdown("""
330
+ #### Pricing Table(GPU) - 2023/2/22
331
+ """)
332
+
333
+ gr.Dataframe(
334
+ headers=["provider", "size", "$/h", "GPUs", "Memory", "Architecture"],
335
+ datatype=["str", "str", "str", "number", "str", "str"],
336
+ row_count=6,
337
+ col_count=(6, "fixed"),
338
+ value=[
339
+ ["aws", "small", "$0.60", 1, "14GB", "NVIDIA T4"],
340
+ ["aws", "medium", "$1.30", 1, "24GB", "NVIDIA A10G"],
341
+ ["aws", "large", "$4.50", 4, "56GB", "NVIDIA T4"],
342
+ ["aws", "xlarge", "$6.50", 1, "80GB", "NVIDIA A100"],
343
+ ["aws", "xxlarge", "$7.00", 4, "96GB", "NVIDIA A10G"],
344
+ ["aws", "xxxlarge", "$45.0", 8, "640GB", "NVIDIA A100"],
345
+ ]
346
+ )
347
+
348
+ gr.TabbedInterface(
349
+ [demo2], ["Deploy on 🤗 Endpoint"]
350
+ ).launch(enable_queue=True)
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ tensorflow==2.11
2
+ keras_cv==0.4.0
3
+ numpy==1.21.6
4
+ tensorflow-datasets==4.8.0
5
+ huggingface_hub