Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -20,6 +20,13 @@ DEFAULT_MODEL = os.getenv("HYMT_MODEL", "tencent/Hunyuan-MT-7B-fp8")
|
|
| 20 |
# Model cố định cho API
|
| 21 |
FIXED_MODEL = "tencent/Hunyuan-MT-7B-fp8"
|
| 22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
# =========================
|
| 24 |
# NGÔN NGỮ & PROMPT
|
| 25 |
# =========================
|
|
@@ -69,8 +76,8 @@ ZH_CODES = {"zh", "zh-Hant", "yue"}
|
|
| 69 |
|
| 70 |
def build_prompt(src_lang: str, tgt_lang: str, text: str) -> str:
|
| 71 |
"""
|
| 72 |
-
Prompt template
|
| 73 |
-
- Nếu có tiếng Trung (zh/zh-Hant/yue) ở nguồn hoặc đích ->
|
| 74 |
- Nếu không -> template tiếng Anh
|
| 75 |
"""
|
| 76 |
txt = (text or "").strip()
|
|
@@ -122,13 +129,11 @@ def translate(text: str, src_code: str, tgt_code: str, model_choice: str) -> str
|
|
| 122 |
# =========================
|
| 123 |
# RATE LIMIT THEO IP (IN-MEMORY)
|
| 124 |
# =========================
|
| 125 |
-
# SỬA TẠI ĐÂY nếu muốn: tối đa bao nhiêu request / mỗi cửa sổ thời gian
|
| 126 |
RATE_WINDOW_SEC = int(os.getenv("RATE_WINDOW_SEC", "60")) # ví dụ: 60 giây
|
| 127 |
RATE_MAX_REQ = int(os.getenv("RATE_MAX_REQ", "10")) # ví dụ: 10 request / IP / 60s
|
| 128 |
|
| 129 |
_ip_buckets: dict[str, deque] = defaultdict(deque)
|
| 130 |
|
| 131 |
-
|
| 132 |
def _rate_limited(request: gr.Request) -> Tuple[bool, str]:
|
| 133 |
"""
|
| 134 |
Trả (ok, msg). ok=False nếu vượt ngưỡng.
|
|
@@ -202,7 +207,13 @@ def build_ui() -> gr.Blocks:
|
|
| 202 |
tgt_code = LABEL2CODE[tgt_label]
|
| 203 |
return translate(text, src_code, tgt_code, model_id)
|
| 204 |
|
| 205 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 206 |
|
| 207 |
gr.Markdown(
|
| 208 |
"""
|
|
@@ -237,8 +248,8 @@ def api_translate_fixed(text: str, src_code: str, tgt_code: str, request: gr.Req
|
|
| 237 |
|
| 238 |
def build_api_interface() -> gr.Interface:
|
| 239 |
"""
|
| 240 |
-
|
| 241 |
-
-
|
| 242 |
- Hoặc /run/predict với fn_index tương ứng
|
| 243 |
"""
|
| 244 |
return gr.Interface(
|
|
@@ -250,7 +261,8 @@ def build_api_interface() -> gr.Interface:
|
|
| 250 |
],
|
| 251 |
outputs=gr.Textbox(label="translation"),
|
| 252 |
title="Hunyuan-MT Fixed API",
|
| 253 |
-
description="POST JSON tới endpoint để nhận bản dịch. Model cố định: tencent/Hunyuan-MT-7B-fp8."
|
|
|
|
| 254 |
)
|
| 255 |
|
| 256 |
|
|
@@ -264,12 +276,9 @@ if __name__ == "__main__":
|
|
| 264 |
# Gộp UI + API vào cùng server
|
| 265 |
demo = gr.TabbedInterface([ui_app, api_iface], tab_names=["App", "API"])
|
| 266 |
|
| 267 |
-
#
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
QUEUE_MAX = int(os.getenv("GRADIO_QUEUE_MAX", "20")) # ví dụ: 20 job có thể chờ
|
| 271 |
-
|
| 272 |
-
demo = demo.queue(concurrency_count=CONCURRENCY, max_size=QUEUE_MAX, status_update_rate=2)
|
| 273 |
|
| 274 |
-
# Bật REST API
|
| 275 |
-
demo.launch(enable_api=True)
|
|
|
|
| 20 |
# Model cố định cho API
|
| 21 |
FIXED_MODEL = "tencent/Hunyuan-MT-7B-fp8"
|
| 22 |
|
| 23 |
+
# Giới hạn đồng thời theo event (thay cho concurrency_count cũ)
|
| 24 |
+
UI_CONCURRENCY_LIMIT = int(os.getenv("UI_CONCURRENCY_LIMIT", "2")) # nút Dịch
|
| 25 |
+
API_CONCURRENCY_LIMIT = int(os.getenv("API_CONCURRENCY_LIMIT", "2")) # endpoint API
|
| 26 |
+
|
| 27 |
+
# Số worker tổng (tuỳ chọn): ảnh hưởng thread pool của server
|
| 28 |
+
LAUNCH_MAX_THREADS = int(os.getenv("LAUNCH_MAX_THREADS", "40"))
|
| 29 |
+
|
| 30 |
# =========================
|
| 31 |
# NGÔN NGỮ & PROMPT
|
| 32 |
# =========================
|
|
|
|
| 76 |
|
| 77 |
def build_prompt(src_lang: str, tgt_lang: str, text: str) -> str:
|
| 78 |
"""
|
| 79 |
+
Prompt template:
|
| 80 |
+
- Nếu có tiếng Trung (zh/zh-Hant/yue) ở nguồn hoặc đích -> template tiếng Trung
|
| 81 |
- Nếu không -> template tiếng Anh
|
| 82 |
"""
|
| 83 |
txt = (text or "").strip()
|
|
|
|
| 129 |
# =========================
|
| 130 |
# RATE LIMIT THEO IP (IN-MEMORY)
|
| 131 |
# =========================
|
|
|
|
| 132 |
RATE_WINDOW_SEC = int(os.getenv("RATE_WINDOW_SEC", "60")) # ví dụ: 60 giây
|
| 133 |
RATE_MAX_REQ = int(os.getenv("RATE_MAX_REQ", "10")) # ví dụ: 10 request / IP / 60s
|
| 134 |
|
| 135 |
_ip_buckets: dict[str, deque] = defaultdict(deque)
|
| 136 |
|
|
|
|
| 137 |
def _rate_limited(request: gr.Request) -> Tuple[bool, str]:
|
| 138 |
"""
|
| 139 |
Trả (ok, msg). ok=False nếu vượt ngưỡng.
|
|
|
|
| 207 |
tgt_code = LABEL2CODE[tgt_label]
|
| 208 |
return translate(text, src_code, tgt_code, model_id)
|
| 209 |
|
| 210 |
+
# ✅ Đặt concurrency_limit ngay trên event listener (chuẩn mới)
|
| 211 |
+
btn.click(
|
| 212 |
+
_on_translate,
|
| 213 |
+
[inp, src, tgt, model_choice],
|
| 214 |
+
[out],
|
| 215 |
+
concurrency_limit=UI_CONCURRENCY_LIMIT
|
| 216 |
+
)
|
| 217 |
|
| 218 |
gr.Markdown(
|
| 219 |
"""
|
|
|
|
| 248 |
|
| 249 |
def build_api_interface() -> gr.Interface:
|
| 250 |
"""
|
| 251 |
+
Interface riêng để có endpoint REST.
|
| 252 |
+
- /run/api_translate_fixed (nếu platform hỗ trợ)
|
| 253 |
- Hoặc /run/predict với fn_index tương ứng
|
| 254 |
"""
|
| 255 |
return gr.Interface(
|
|
|
|
| 261 |
],
|
| 262 |
outputs=gr.Textbox(label="translation"),
|
| 263 |
title="Hunyuan-MT Fixed API",
|
| 264 |
+
description="POST JSON tới endpoint để nhận bản dịch. Model cố định: tencent/Hunyuan-MT-7B-fp8.",
|
| 265 |
+
concurrency_limit=API_CONCURRENCY_LIMIT, # ✅ giới hạn đồng thời cho API
|
| 266 |
)
|
| 267 |
|
| 268 |
|
|
|
|
| 276 |
# Gộp UI + API vào cùng server
|
| 277 |
demo = gr.TabbedInterface([ui_app, api_iface], tab_names=["App", "API"])
|
| 278 |
|
| 279 |
+
# Hàng chờ: KHÔNG dùng concurrency_count nữa!
|
| 280 |
+
QUEUE_MAX = int(os.getenv("GRADIO_QUEUE_MAX", "20")) # số job có thể chờ
|
| 281 |
+
demo = demo.queue(max_size=QUEUE_MAX, status_update_rate=2)
|
|
|
|
|
|
|
|
|
|
| 282 |
|
| 283 |
+
# Bật REST API; (tuỳ chọn) khống chế thread tổng bằng max_threads
|
| 284 |
+
demo.launch(enable_api=True, max_threads=LAUNCH_MAX_THREADS)
|