Update app.py
Browse files
app.py
CHANGED
|
@@ -21,13 +21,24 @@ Hunyuan3D Full Pipeline UI (aptol/genshin 메인 기준)
|
|
| 21 |
BLENDER_PATH=/path/to/blender (없으면 PATH의 'blender' 사용)
|
| 22 |
"""
|
| 23 |
|
| 24 |
-
|
|
|
|
| 25 |
from pathlib import Path
|
| 26 |
from typing import List, Tuple, Optional, Dict, Any, Union
|
| 27 |
|
| 28 |
import gradio as gr
|
| 29 |
from PIL import Image
|
| 30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
# ---------------------------
|
| 32 |
# 경로 & 기본 폴더
|
| 33 |
# ---------------------------
|
|
@@ -109,7 +120,22 @@ def _lazy_imports():
|
|
| 109 |
return P
|
| 110 |
|
| 111 |
PKG = _lazy_imports()
|
| 112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
# ---------------------------
|
| 114 |
# Space Profiles (정밀 튜닝)
|
| 115 |
# - genshin을 메인으로 사용하되, 포크/업스트림도 호환
|
|
@@ -795,5 +821,19 @@ with gr.Blocks(css="""
|
|
| 795 |
|
| 796 |
gr.Markdown("<small id='small-note'>※ genshin(메인) ↔ fork ↔ tencent Space간 입력 차이는 프로필 매핑으로 자동 흡수하도록 구성했습니다. Space 시그니처가 바뀌면 상단 SPACES['variants_*']만 수정하면 됩니다.</small>")
|
| 797 |
|
|
|
|
| 798 |
if __name__ == "__main__":
|
| 799 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
BLENDER_PATH=/path/to/blender (없으면 PATH의 'blender' 사용)
|
| 22 |
"""
|
| 23 |
|
| 24 |
+
|
| 25 |
+
import os, io, json, time, hashlib, shutil, tempfile, subprocess, textwrap
|
| 26 |
from pathlib import Path
|
| 27 |
from typing import List, Tuple, Optional, Dict, Any, Union
|
| 28 |
|
| 29 |
import gradio as gr
|
| 30 |
from PIL import Image
|
| 31 |
|
| 32 |
+
# ✨ NEW: Hugging Face Spaces GPU decorator
|
| 33 |
+
try:
|
| 34 |
+
import spaces
|
| 35 |
+
except Exception:
|
| 36 |
+
class _Dummy:
|
| 37 |
+
def GPU(self, *a, **k):
|
| 38 |
+
def deco(fn): return fn
|
| 39 |
+
return deco
|
| 40 |
+
spaces = _Dummy()
|
| 41 |
+
|
| 42 |
# ---------------------------
|
| 43 |
# 경로 & 기본 폴더
|
| 44 |
# ---------------------------
|
|
|
|
| 120 |
return P
|
| 121 |
|
| 122 |
PKG = _lazy_imports()
|
| 123 |
+
# 2) lazy_imports 아래 아무 곳에 추가 (전역 함수)
|
| 124 |
+
@spaces.GPU(duration=120) # HF가 GPU 워커를 정상 인식하도록 “한 개 이상” 필요
|
| 125 |
+
def _spaces_gpu_warmup() -> str:
|
| 126 |
+
"""
|
| 127 |
+
HF Spaces가 부팅시 GPU 핸들링/워밍업을 확인할 수 있게 하는 더미 함수.
|
| 128 |
+
실제 호출 안 해도 되지만, 있으면 부팅이 안정됩니다.
|
| 129 |
+
"""
|
| 130 |
+
try:
|
| 131 |
+
import torch
|
| 132 |
+
if torch.cuda.is_available():
|
| 133 |
+
# 아주 가벼운 텐서로 GPU 컨텍스트를 열어둔다
|
| 134 |
+
_ = torch.randn(1, device="cuda") * 0.0
|
| 135 |
+
return "gpu:ok"
|
| 136 |
+
return "gpu:not_available"
|
| 137 |
+
except Exception as e:
|
| 138 |
+
return f"gpu:error:{e}"
|
| 139 |
# ---------------------------
|
| 140 |
# Space Profiles (정밀 튜닝)
|
| 141 |
# - genshin을 메인으로 사용하되, 포크/업스트림도 호환
|
|
|
|
| 821 |
|
| 822 |
gr.Markdown("<small id='small-note'>※ genshin(메인) ↔ fork ↔ tencent Space간 입력 차이는 프로필 매핑으로 자동 흡수하도록 구성했습니다. Space 시그니처가 바뀌면 상단 SPACES['variants_*']만 수정하면 됩니다.</small>")
|
| 823 |
|
| 824 |
+
# 3) __main__ 부분 교체 (SSR 끄기)
|
| 825 |
if __name__ == "__main__":
|
| 826 |
+
# (선택) 워밍업을 한 번 호출해도 무방 — 실패해도 앱은 계속 뜹니다.
|
| 827 |
+
try:
|
| 828 |
+
_spaces_gpu_warmup()
|
| 829 |
+
except Exception:
|
| 830 |
+
pass
|
| 831 |
+
|
| 832 |
+
# ✨ SSR 끔: Node.js 사이드카 문제 회피
|
| 833 |
+
demo.queue(concurrency_count=2, max_size=64).launch(
|
| 834 |
+
server_name="0.0.0.0",
|
| 835 |
+
server_port=int(os.environ.get("PORT", "7860")),
|
| 836 |
+
ssr_mode=False, # <- 중요
|
| 837 |
+
share=False
|
| 838 |
+
)
|
| 839 |
+
|