oki0ki commited on
Commit
7c8eb9e
·
verified ·
1 Parent(s): f3bc30f

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +54 -22
README.md CHANGED
@@ -1,24 +1,56 @@
1
- ---
2
- sdk: docker
3
- emoji:
4
- colorTo: indigo
5
- ---
6
- # ⚡ Ultralekki OpenAI-Compatible Server
7
- - **Model**: `unsloth/granite-4.1-3b-GGUF` (kwantyzacja `UD-IQ2_M` ~1.1GB)
8
- - **Format**: Pełna kompatybilność z `/v1/chat/completions`, `/v1/completions`, streaming SSE
9
- - **Auth**: Brak (otwarty dostęp)
10
- - **Optymalizacja**: CPU-only, mmap, limit kontekstu 2048, max 3 równoczesne requesty
11
- - **Resilience**: Obsługa zerwanych połączeń, keep-alive 120s, graceful shutdown
12
 
13
- ## 🌐 Endpointy
14
- - `POST /v1/chat/completions`
15
- - `GET /health`
16
- - `GET /docs` (Swagger)
17
 
18
- ## ⚙️ Zmienne środowiskowe (opcjonalne)
19
- | Zmienna | Domyślnie | Opis |
20
- |--------|-----------|------|
21
- | `N_CTX` | `2048` | Maksymalny kontekst |
22
- | `N_THREADS` | `2` | Wątki CPU |
23
- | `MAX_CONCURRENCY` | `3` | Limit równoczesnych zapytań |
24
- | `MODEL_FILE` | `granite-4.1-3b-UD-IQ2_M.gguf` | Nazwa pliku GGUF |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Ultralekki entrypoint dla HF Spaces (Docker SDK)
4
+ Pobiera model z cache HF → uruchamia llama_cpp.server
5
+ ✅ OpenAI format | ✅ Brak auth | ✅ Odporny na zerwania | ✅ Optymalizacja CPU/RAM
6
+ """
7
+ import os
8
+ import sys
9
+ import signal
10
+ import logging
11
+ from huggingface_hub import hf_hub_download
12
 
13
+ logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
14
+ logger = logging.getLogger(__name__)
 
 
15
 
16
+ MODEL_REPO = "unsloth/granite-4.1-3b-GGUF"
17
+ MODEL_FILE = os.environ.get("MODEL_FILE", "granite-4.1-3b-UD-IQ2_M.gguf")
18
+ PORT = os.environ.get("PORT", "7860")
19
+ N_CTX = os.environ.get("N_CTX", "2048")
20
+ N_THREADS = os.environ.get("N_THREADS", "2")
21
+ N_BATCH = os.environ.get("N_BATCH", "512")
22
+
23
+ def graceful_shutdown(signum, frame):
24
+ logger.info("📡 Otrzymano sygnał zakończenia. Zamykanie...")
25
+ sys.exit(0)
26
+
27
+ signal.signal(signal.SIGTERM, graceful_shutdown)
28
+ signal.signal(signal.SIGINT, graceful_shutdown)
29
+
30
+ if __name__ == "__main__":
31
+ logger.info(f"⬇️ Pobieranie/weryfikacja: {MODEL_REPO}/{MODEL_FILE}")
32
+ model_path = hf_hub_download(
33
+ repo_id=MODEL_REPO,
34
+ filename=MODEL_FILE,
35
+ resume_download=True,
36
+ local_dir_use_symlinks=False
37
+ )
38
+ logger.info(f"✅ Model gotowy: {model_path}")
39
+
40
+ # Komenda startowa llama_cpp.server (wbudowany serwer OpenAI-compatible)
41
+ cmd = [
42
+ sys.executable, "-m", "llama_cpp.server",
43
+ "--model", model_path,
44
+ "--host", "0.0.0.0",
45
+ "--port", PORT,
46
+ "--n_ctx", N_CTX,
47
+ "--n_threads", N_THREADS,
48
+ "--n_batch", N_BATCH,
49
+ "--n_gpu_layers", "0",
50
+ "--use_mmap",
51
+ "--no_flash_attn"
52
+ ]
53
+
54
+ logger.info(f"🚀 Start serwera: {' '.join(cmd)}")
55
+ # execvp zastępuje proces Pythona serwerem → poprawna obsługa sygnałów Docker/HF
56
+ os.execvp(sys.executable, cmd)