geocine's picture
Disable experimental SSR (slow page loads); preload only Q4_K_M GGUF
abf87a8 verified
Raw
History Blame Contribute Delete
3.81 kB
#!/usr/bin/env python3
"""Hugging Face Space — MiniMax H3 Prompt Enhancer 2.6B (ZeroGPU + llama.cpp).
Loads Q4_K_M GGUF via llama-cpp-python (CUDA wheel). Generation runs inside
``@spaces.GPU`` so ``n_gpu_layers=-1`` can offload onto the ZeroGPU slice.
Companion (fast CPU 350M):
https://huggingface.co/spaces/geocine/MiniMax-H3-Prompt-Enhancer
"""
from __future__ import annotations
import ctypes
import os
import sys
from pathlib import Path
# Import spaces first so ZeroGPU can patch the runtime before Gradio starts.
import spaces # noqa: F401
# Torch ships libcudart; preload so the CUDA llama-cpp wheel can dlopen later.
# Do NOT import llama_cpp at module scope — CUDA init belongs inside @spaces.GPU.
import torch
_torch_lib = Path(torch.__file__).resolve().parent / "lib"
for _name in ("libcudart.so.12", "libcudart.so"):
_cand = _torch_lib / _name
if _cand.is_file():
try:
ctypes.CDLL(str(_cand), mode=ctypes.RTLD_GLOBAL)
print(f"[boot] preloaded {_cand.name} from torch", flush=True)
except OSError as exc:
print(f"[boot] libcudart preload skipped: {exc}", flush=True)
break
_ld = os.environ.get("LD_LIBRARY_PATH", "")
if str(_torch_lib) not in _ld.split(":"):
os.environ["LD_LIBRARY_PATH"] = (
f"{_torch_lib}:{_ld}" if _ld else str(_torch_lib)
)
ROOT = Path(__file__).resolve().parent
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
from huggingface_hub import hf_hub_download
from minimax.apps.gradio import build_app
from minimax.modeling.gguf_runtime import effective_cpus, resolve_gguf_file
from minimax.paths import DEFAULT_GGUF_FILE, DEFAULT_GGUF_REPO
GGUF_REPO = os.environ.get("GGUF_REPO", DEFAULT_GGUF_REPO)
GGUF_FILE = os.environ.get("GGUF_FILE", DEFAULT_GGUF_FILE)
LOCAL_MODELS = ROOT / "models"
N_THREADS = int(os.environ.get("N_THREADS", "0")) or None
N_CTX = int(os.environ.get("N_CTX", "4096"))
N_GPU_LAYERS = int(os.environ.get("N_GPU_LAYERS", "-1"))
GPU_DURATION = int(os.environ.get("GPU_DURATION", "120"))
def resolve_model_path() -> str:
env = os.environ.get("GGUF_PATH") or os.environ.get("MODEL_ID")
if env and (Path(env).exists() or str(env).endswith(".gguf")):
p = Path(env)
if p.exists():
return str(resolve_gguf_file(p) if p.is_dir() else p)
if str(env).endswith(".gguf") and (LOCAL_MODELS / env).is_file():
return str(LOCAL_MODELS / env)
if LOCAL_MODELS.is_dir() and list(LOCAL_MODELS.glob("*.gguf")):
path = str(resolve_gguf_file(LOCAL_MODELS))
print(f"[boot] using local GGUF {path}", flush=True)
return path
print(f"[boot] resolving {GGUF_REPO}/{GGUF_FILE} …", flush=True)
return hf_hub_download(repo_id=GGUF_REPO, filename=GGUF_FILE)
print(
f"[boot] torch={torch.__version__} cpus={effective_cpus()} "
f"n_gpu_layers={N_GPU_LAYERS}",
flush=True,
)
MODEL_PATH = resolve_model_path()
print(
f"[boot] GGUF={MODEL_PATH} n_threads={N_THREADS or 'auto'} n_ctx={N_CTX} "
f"gpu_duration={GPU_DURATION}s",
flush=True,
)
print("[boot] building Gradio UI (GGUF loads on first Generate inside ZeroGPU)", flush=True)
demo = build_app(
model_path=MODEL_PATH,
backend="gguf",
n_ctx=N_CTX,
n_threads=N_THREADS,
n_gpu_layers=N_GPU_LAYERS,
prefer_cpu=False,
gpu_duration=GPU_DURATION,
)
print("[boot] Gradio ready", flush=True)
if __name__ == "__main__":
demo.queue(default_concurrency_limit=1)
demo.launch(
server_name="0.0.0.0",
server_port=int(os.environ.get("PORT", 7860)),
# SSR is experimental and makes Space page loads very slow.
ssr_mode=False,
)