apathy-exe's picture
Update app.py
8ffec33 verified
Raw
History Blame Contribute Delete
4.24 kB
from __future__ import annotations
import json
import os
import subprocess
import tarfile
import time
import urllib.request
import zipfile
from fastapi import Request
from fastapi.responses import StreamingResponse
from gradio import Server
import httpx
app = Server()
try:
import spaces
HAS_SPACES = True
except ImportError:
HAS_SPACES = False
@spaces.GPU if HAS_SPACES else lambda f: f
def whygpu():
pass
def build_latest_llama_server():
binary_path = os.path.abspath("llama.cpp/build/bin/llama-server")
if os.path.exists(binary_path):
return binary_path
print("Building latest llama.cpp from master source...")
if not os.path.exists("llama.cpp"):
subprocess.run(["git", "clone", "https://github.com/ggml-org/llama.cpp.git"], check=True)
else:
subprocess.run(["git", "pull"], cwd="llama.cpp", check=True)
env = os.environ.copy()
if "/usr/local/cuda/bin" not in env.get("PATH", ""):
env["PATH"] = f"/usr/local/cuda/bin:{env.get('PATH', '')}"
cmake_cmd = ["cmake", "-B", "build"]
subprocess.run(cmake_cmd, cwd="llama.cpp", env=env, check=True)
subprocess.run(
["cmake", "--build", "build", "--config", "Release", "-j", str(os.cpu_count() or 4), "--target", "llama-server"],
cwd="llama.cpp",
env=env,
check=True
)
if not os.path.exists(binary_path):
raise RuntimeError("Failed to build llama-server binary!")
return binary_path
def apathy_exe():
model_path = hf_hub_download(
repo_id="meta-models/Muse-Glimmer-30B",
filename="muse-glimmer-30B-kquant-17gb.gguf",
)
def start_llama_server():
binary_path = build_latest_llama_server()
from huggingface_hub import hf_hub_download
model_path = hf_hub_download(
repo_id="meta-models/Muse-Glimmer-30B-GGUF",
filename="muse-glimmer-30B-kquant-17gb.gguf",
)
draft_path = hf_hub_download(
repo_id="meta-models/Muse-Glimmer-30B-GGUF",
filename="dflash-kquant.gguf",
)
binary_dir = os.path.dirname(os.path.abspath(binary_path))
env = os.environ.copy()
env["LD_LIBRARY_PATH"] = f"{binary_dir}:{env.get('LD_LIBRARY_PATH', '')}"
cmd = [
binary_path,
"-m", model_path,
"-md", draft_path,
"--port", "8000",
"--host", "127.0.0.1",
"-t", "16",
"-tb", "16",
"-fa", "on",
"--spec-type", "draft-dflash",
"--spec-draft-n-max", "15",
"--cache-type-k", "q4_0",
"--cache-type-v", "q4_0",
"--temp", "1.0",
"--top-p", "0.95",
"--top-k", "64",
"-c", "131072",
"--jinja",
]
process = subprocess.Popen(cmd, env=env)
time.sleep(10)
return process
@app.middleware("http")
async def proxy_middleware(request: Request, call_next):
path = request.url.path
if path.startswith("/gradio_api"):
return await call_next(request)
url = f"http://127.0.0.1:8000{path}"
headers = {
k: v for k, v in request.headers.items()
if k.lower() not in ("host", "content-length", "accept-encoding")
}
body = await request.body()
client = httpx.AsyncClient(timeout=httpx.Timeout(600.0, connect=30.0))
req = client.build_request(
method=request.method,
url=url,
headers=headers,
params=request.query_params,
content=body,
)
try:
response = await client.send(req, stream=True)
except Exception as e:
await client.aclose()
return StreamingResponse(iter([f"Proxy Error: {e}".encode()]), status_code=502)
async def stream_and_close():
try:
async for chunk in response.aiter_raw():
yield chunk
finally:
await response.aclose()
await client.aclose()
res_headers = {
k: v for k, v in response.headers.items()
if k.lower() not in ("content-length", "transfer-encoding", "connection")
}
return StreamingResponse(
stream_and_close(),
status_code=response.status_code,
headers=res_headers
)
if __name__ == "__main__":
start_llama_server()
app.launch(show_error=True)