cutechicken commited on
Commit
4980c48
ยท
verified ยท
1 Parent(s): bde5c1b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +34 -203
app.py CHANGED
@@ -1,226 +1,57 @@
1
  import gradio as gr
2
- import json
3
- import os
4
  from datetime import datetime
5
- import base64
6
- from PIL import Image, ImageDraw, ImageFont
7
- import io
8
  import random
9
 
10
- # ๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ
11
  jobs = []
12
- results = {}
13
-
14
- # ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
15
- os.makedirs("temp", exist_ok=True)
16
-
17
- def create_test_image(prompt):
18
- """ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€ ์ƒ์„ฑ"""
19
- img = Image.new('RGB', (512, 512), color=(255, 255, 255))
20
- draw = ImageDraw.Draw(img)
21
-
22
- # ๋ฐฐ๊ฒฝ ๊ทธ๋ผ๋ฐ์ด์…˜
23
- for i in range(512):
24
- color = int(255 * (1 - i/512))
25
- draw.rectangle([(0, i), (512, i+1)], fill=(color, color, 255))
26
-
27
- # ํ…์ŠคํŠธ ์ถ”๊ฐ€
28
- text_lines = [
29
- f"Prompt: {prompt[:40]}...",
30
- f"Generated at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}",
31
- f"Job ID: {random.randint(1000, 9999)}"
32
- ]
33
-
34
- y_offset = 20
35
- for line in text_lines:
36
- draw.text((20, y_offset), line, fill='white')
37
- y_offset += 30
38
-
39
- # ๊ฒฉ์ž ํŒจํ„ด
40
- for i in range(0, 512, 32):
41
- draw.line([(i, 100), (i, 512)], fill=(200, 200, 200), width=1)
42
- draw.line([(0, i+100), (512, i+100)], fill=(200, 200, 200), width=1)
43
-
44
- return img
45
 
46
  def submit_job(prompt):
47
  """์ž‘์—… ์ œ์ถœ"""
48
  if not prompt:
49
- return "โŒ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.", None
50
 
51
- job_id = f"job_{len(jobs)}_{datetime.now().strftime('%H%M%S')}"
52
- job = {
53
  "id": job_id,
54
  "prompt": prompt,
55
- "status": "processing",
56
- "created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
57
- }
58
- jobs.append(job)
59
 
60
- # ์‹œ๋ฎฌ๋ ˆ์ด์…˜: ๋ฐ”๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
61
- img = create_test_image(prompt)
62
-
63
- # ์ด๋ฏธ์ง€๋ฅผ ์ž„์‹œ ํŒŒ์ผ๋กœ ์ €์žฅ
64
- img_path = f"temp/{job_id}.png"
65
- img.save(img_path)
66
- results[job_id] = img_path
67
- job["status"] = "completed"
68
-
69
- return f"โœ… ์ž‘์—…์ด ์ œ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!\n์ž‘์—… ID: {job_id}", img
70
 
71
  def get_status():
72
- """์‹œ์Šคํ…œ ์ƒํƒœ"""
73
- total_jobs = len(jobs)
74
- completed = sum(1 for j in jobs if j["status"] == "completed")
75
-
76
- status_text = f"""## ๐Ÿ“Š ์‹œ์Šคํ…œ ์ƒํƒœ
77
-
78
- ### ํ˜„์žฌ ์ƒํ™ฉ
79
- - **์ „์ฒด ์ž‘์—…**: {total_jobs}๊ฐœ
80
- - **์™„๋ฃŒ๋œ ์ž‘์—…**: {completed}๊ฐœ
81
- - **๋Œ€๊ธฐ์ค‘ ์ž‘์—…**: {total_jobs - completed}๊ฐœ
82
-
83
- ### ์ตœ๊ทผ ์ž‘์—… (์ตœ๋Œ€ 5๊ฐœ)
84
- """
85
-
86
- recent_jobs = jobs[-5:][::-1] if jobs else []
87
- for job in recent_jobs:
88
- emoji = "โœ…" if job["status"] == "completed" else "โณ"
89
- status_text += f"\n{emoji} **{job['id']}**: {job['prompt'][:30]}... ({job['created_at']})"
90
-
91
  if not jobs:
92
- status_text += "\n\n*์•„์ง ์ž‘์—…์ด ์—†์Šต๋‹ˆ๋‹ค.*"
93
-
94
- return status_text
95
-
96
- def get_gallery():
97
- """๊ฐค๋Ÿฌ๋ฆฌ ์ด๋ฏธ์ง€ ๋ชฉ๋ก"""
98
- gallery_images = []
99
 
100
- for job in jobs[-12:][::-1]: # ์ตœ๊ทผ 12๊ฐœ
101
- if job["status"] == "completed" and job["id"] in results:
102
- img_path = results[job["id"]]
103
- if os.path.exists(img_path):
104
- gallery_images.append((img_path, f"{job['prompt'][:50]}..."))
105
 
106
- return gallery_images
107
-
108
- # ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ
109
- CLIENT_CODE = """# P2P GPU Client (Demo Version)
110
- import time
111
- import random
112
- from datetime import datetime
113
-
114
- print("๐Ÿš€ P2P GPU ํด๋ผ์ด์–ธํŠธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜")
115
- print("์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” Gradio API๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.")
116
-
117
- while True:
118
- print(f"\\n[{datetime.now().strftime('%H:%M:%S')}] ์ž‘์—… ํ™•์ธ ์ค‘...")
119
-
120
- if random.random() > 0.7: # 30% ํ™•๋ฅ ๋กœ ์ž‘์—… ์ˆ˜์‹ 
121
- print("๐Ÿ“‹ ์ƒˆ ์ž‘์—… ๋ฐœ๊ฒฌ!")
122
- print("๐ŸŽจ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์ค‘...")
123
- time.sleep(2)
124
- print("โœ… ์™„๋ฃŒ! ์„œ๋ฒ„๋กœ ์ „์†ก")
125
- else:
126
- print("๋Œ€๊ธฐ ์ค‘...")
127
-
128
- time.sleep(5)
129
- """
130
 
131
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค
132
- with gr.Blocks(
 
 
 
133
  title="P2P GPU ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ—ˆ๋ธŒ",
134
- theme=gr.themes.Soft(),
135
- css="""
136
- .container { max-width: 1200px; margin: 0 auto; }
137
- #gallery { min-height: 400px; }
138
- """
139
- ) as demo:
140
-
141
- gr.Markdown("""
142
- # ๐Ÿค– P2P GPU ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ—ˆ๋ธŒ
143
-
144
- ์œ ํœด GPU๋ฅผ ํ™œ์šฉํ•œ ๋ถ„์‚ฐ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์‹œ์Šคํ…œ (๋ฐ๋ชจ ๋ฒ„์ „)
145
- """)
146
-
147
- with gr.Tabs():
148
- # ์ž‘์—… ์ œ์ถœ ํƒญ
149
- with gr.Tab("๐ŸŽจ ์ž‘์—… ์ œ์ถœ"):
150
- with gr.Row():
151
- with gr.Column(scale=2):
152
- prompt_input = gr.Textbox(
153
- label="์ด๋ฏธ์ง€ ํ”„๋กฌํ”„ํŠธ",
154
- placeholder="์ƒ์„ฑํ•˜๊ณ  ์‹ถ์€ ์ด๋ฏธ์ง€๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”...",
155
- lines=3
156
- )
157
- submit_btn = gr.Button("๐Ÿš€ ์ž‘์—… ์ œ์ถœ", variant="primary")
158
-
159
- result_msg = gr.Textbox(label="์ œ์ถœ ๊ฒฐ๊ณผ", interactive=False)
160
- result_img = gr.Image(label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€", type="pil")
161
-
162
- with gr.Column(scale=1):
163
- gr.Markdown("""
164
- ### ๐Ÿ’ก ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
165
- 1. ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ
166
- 2. ์ž‘์—… ์ œ์ถœ ํด๋ฆญ
167
- 3. ๊ฒฐ๊ณผ ํ™•์ธ
168
-
169
- ### ๐Ÿ“ ์˜ˆ์‹œ
170
- - ํ‘ธ๋ฅธ ํ•˜๋Š˜๊ณผ ๊ตฌ๋ฆ„
171
- - ์ผ๋ชฐ์˜ ํ•ด๋ณ€ ํ’๊ฒฝ
172
- - ๋ฏธ๋ž˜์ ์ธ ๋„์‹œ ์ „๊ฒฝ
173
- """)
174
-
175
- submit_btn.click(
176
- fn=submit_job,
177
- inputs=prompt_input,
178
- outputs=[result_msg, result_img]
179
- )
180
-
181
- # ์‹œ์Šคํ…œ ์ƒํƒœ ํƒญ
182
- with gr.Tab("๐Ÿ“Š ์‹œ์Šคํ…œ ์ƒํƒœ"):
183
- status_display = gr.Markdown()
184
- refresh_btn = gr.Button("๐Ÿ”„ ์ƒˆ๋กœ๊ณ ์นจ")
185
-
186
- def refresh_status():
187
- return get_status()
188
-
189
- refresh_btn.click(fn=refresh_status, outputs=status_display)
190
- demo.load(fn=refresh_status, outputs=status_display)
191
-
192
- # ๊ฐค๋Ÿฌ๋ฆฌ ํƒญ
193
- with gr.Tab("๐Ÿ–ผ๏ธ ๊ฐค๋Ÿฌ๋ฆฌ"):
194
- gallery = gr.Gallery(
195
- label="์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๋“ค",
196
- columns=3,
197
- rows=2,
198
- height="auto"
199
- )
200
- gallery_refresh_btn = gr.Button("๐Ÿ”„ ๊ฐค๋Ÿฌ๋ฆฌ ์ƒˆ๋กœ๊ณ ์นจ")
201
-
202
- gallery_refresh_btn.click(fn=get_gallery, outputs=gallery)
203
- demo.load(fn=get_gallery, outputs=gallery)
204
-
205
- # ๋‹ค์šด๋กœ๋“œ ํƒญ
206
- with gr.Tab("๐Ÿ’ป ํด๋ผ์ด์–ธํŠธ"):
207
- gr.Markdown("""
208
- ## ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ
209
-
210
- ### ๋ฐ๋ชจ ์ฝ”๋“œ
211
- ์•„๋ž˜๋Š” P2P ํด๋ผ์ด์–ธํŠธ์˜ ๊ฐ„๋‹จํ•œ ๋ฐ๋ชจ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค:
212
-
213
- ```python
214
- """ + CLIENT_CODE + """
215
- ```
216
-
217
- ### ์‹ค์ œ ๊ตฌํ˜„ ์‹œ
218
- - Gradio API๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ํ†ต์‹ 
219
- - GPU ์ž๋™ ๊ฐ์ง€ ๋ฐ ํ™œ์šฉ
220
- - ์‹ค์ œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ชจ๋ธ ์—ฐ๋™
221
- - ์ž๋™ ์ž‘์—… ์ฒ˜๋ฆฌ ๋ฐ ๊ฒฐ๊ณผ ์ „์†ก
222
- """)
223
 
224
- # ์•ฑ ์‹คํ–‰
225
  if __name__ == "__main__":
226
- demo.launch()
 
1
  import gradio as gr
 
 
2
  from datetime import datetime
 
 
 
3
  import random
4
 
5
+ # ๊ฐ„๋‹จํ•œ ์ž‘์—… ๋ชฉ๋ก
6
  jobs = []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
  def submit_job(prompt):
9
  """์ž‘์—… ์ œ์ถœ"""
10
  if not prompt:
11
+ return "ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
12
 
13
+ job_id = f"JOB-{random.randint(1000, 9999)}"
14
+ jobs.append({
15
  "id": job_id,
16
  "prompt": prompt,
17
+ "time": datetime.now().strftime("%H:%M:%S")
18
+ })
 
 
19
 
20
+ return f"โœ… ์ž‘์—… ์ œ์ถœ๋จ: {job_id}\nํ”„๋กฌํ”„ํŠธ: {prompt}"
 
 
 
 
 
 
 
 
 
21
 
22
  def get_status():
23
+ """์ƒํƒœ ํ™•์ธ"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  if not jobs:
25
+ return "์•„์ง ์ž‘์—…์ด ์—†์Šต๋‹ˆ๋‹ค."
 
 
 
 
 
 
26
 
27
+ status = f"์ „์ฒด ์ž‘์—…: {len(jobs)}๊ฐœ\n\n์ตœ๊ทผ ์ž‘์—…:\n"
28
+ for job in jobs[-5:]:
29
+ status += f"- {job['id']}: {job['prompt'][:30]}... ({job['time']})\n"
 
 
30
 
31
+ return status
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค
34
+ demo = gr.Interface(
35
+ fn=submit_job,
36
+ inputs=gr.Textbox(label="์ด๋ฏธ์ง€ ํ”„๋กฌํ”„ํŠธ", placeholder="์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”..."),
37
+ outputs=gr.Textbox(label="๊ฒฐ๊ณผ"),
38
  title="P2P GPU ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ—ˆ๋ธŒ",
39
+ description="๋ถ„์‚ฐ GPU๋ฅผ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์‹œ์Šคํ…œ"
40
+ )
41
+
42
+ # ์ƒํƒœ ํ™•์ธ์šฉ ๋‘ ๋ฒˆ์งธ ์ธํ„ฐํŽ˜์ด์Šค
43
+ status_demo = gr.Interface(
44
+ fn=get_status,
45
+ inputs=None,
46
+ outputs=gr.Textbox(label="์‹œ์Šคํ…œ ์ƒํƒœ"),
47
+ title="์‹œ์Šคํ…œ ์ƒํƒœ"
48
+ )
49
+
50
+ # ํƒญ์œผ๋กœ ๊ฒฐํ•ฉ
51
+ app = gr.TabbedInterface(
52
+ [demo, status_demo],
53
+ ["์ž‘์—… ์ œ์ถœ", "์‹œ์Šคํ…œ ์ƒํƒœ"]
54
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
 
56
  if __name__ == "__main__":
57
+ app.launch(server_name="0.0.0.0", server_port=7860)