Spaces:
Sleeping
Sleeping
Afri model addition
Browse files- README.md +17 -1
- backend/providers/__init__.py +13 -2
- backend/providers/gemma.py +65 -0
- backend/requirements.txt +2 -0
- entrypoint.sh +7 -4
README.md
CHANGED
|
@@ -68,4 +68,20 @@ docker build -t translator-api .
|
|
| 68 |
|
| 69 |
# Run Docker container mapping port 7860
|
| 70 |
docker run -p 7860:7860 -v $(pwd)/data:/data translator-api
|
| 71 |
-
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
|
| 69 |
# Run Docker container mapping port 7860
|
| 70 |
docker run -p 7860:7860 -v $(pwd)/data:/data translator-api
|
| 71 |
+
```
|
| 72 |
+
|
| 73 |
+
## 📜 Citation & Credits
|
| 74 |
+
|
| 75 |
+
This Space utilizes [AfriNLLB](https://huggingface.co/AfriNLP/AfriNLLB-12enc-12dec-full-ft-kd) developed by AfriNLP:
|
| 76 |
+
|
| 77 |
+
```bibtex
|
| 78 |
+
@inproceedings{moslem-etal-2026-afrinllb,
|
| 79 |
+
title = "{A}fri{NLLB}: Efficient Translation Models for African Languages",
|
| 80 |
+
author = "Moslem, Yasmin and Wassie, Aman Kassahun and Gizachew, Amanuel",
|
| 81 |
+
booktitle = "Proceedings of the Seventh Workshop on African Natural Language Processing (AfricaNLP)",
|
| 82 |
+
month = mar,
|
| 83 |
+
year = "2026",
|
| 84 |
+
address = "Rabat, Morocco",
|
| 85 |
+
publisher = "Association for Computational Linguistics",
|
| 86 |
+
url = "https://openreview.net/forum?id=hVJZNUZBur"
|
| 87 |
+
}
|
backend/providers/__init__.py
CHANGED
|
@@ -13,8 +13,9 @@ from providers.base import ProviderInfo, TranslationProvider
|
|
| 13 |
from providers.gemini import GeminiProvider
|
| 14 |
from providers.groq import GroqProvider, GroqQwenProvider
|
| 15 |
from providers.madlad import MADLADProvider
|
| 16 |
-
from providers.nllb import NLLBProvider
|
| 17 |
from providers.ollama import OllamaProvider
|
|
|
|
| 18 |
|
| 19 |
_PROVIDERS: list[TranslationProvider] = [
|
| 20 |
NLLBProvider(),
|
|
@@ -26,8 +27,18 @@ _PROVIDERS: list[TranslationProvider] = [
|
|
| 26 |
),
|
| 27 |
hf_model=os.environ.get("HF_MODEL_1_3B", "facebook/nllb-200-distilled-1.3B"),
|
| 28 |
),
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
MADLADProvider(),
|
|
|
|
| 31 |
OllamaProvider(),
|
| 32 |
GeminiProvider(),
|
| 33 |
GroqQwenProvider(),
|
|
|
|
| 13 |
from providers.gemini import GeminiProvider
|
| 14 |
from providers.groq import GroqProvider, GroqQwenProvider
|
| 15 |
from providers.madlad import MADLADProvider
|
| 16 |
+
from providers.nllb import NLLBProvider
|
| 17 |
from providers.ollama import OllamaProvider
|
| 18 |
+
from providers.gemma import SwahiliGemmaProvider
|
| 19 |
|
| 20 |
_PROVIDERS: list[TranslationProvider] = [
|
| 21 |
NLLBProvider(),
|
|
|
|
| 27 |
),
|
| 28 |
hf_model=os.environ.get("HF_MODEL_1_3B", "facebook/nllb-200-distilled-1.3B"),
|
| 29 |
),
|
| 30 |
+
NLLBProvider(
|
| 31 |
+
provider_id="afrinllb",
|
| 32 |
+
name="AfriNLLB (600M)",
|
| 33 |
+
model_dir=os.environ.get(
|
| 34 |
+
"CT2_MODEL_DIR_AFRINLLB", "/models/afrinllb-600m-int8"
|
| 35 |
+
),
|
| 36 |
+
hf_model=os.environ.get(
|
| 37 |
+
"HF_MODEL_AFRINLLB", "AfriNLP/AfriNLLB-12enc-12dec-full-ft-kd"
|
| 38 |
+
),
|
| 39 |
+
),
|
| 40 |
MADLADProvider(),
|
| 41 |
+
SwahiliGemmaProvider(),
|
| 42 |
OllamaProvider(),
|
| 43 |
GeminiProvider(),
|
| 44 |
GroqQwenProvider(),
|
backend/providers/gemma.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Swahili Gemma 1B engine via llama-cpp-python (GGUF)."""
|
| 2 |
+
|
| 3 |
+
from __future__ import annotations
|
| 4 |
+
|
| 5 |
+
import os
|
| 6 |
+
from threading import Lock
|
| 7 |
+
|
| 8 |
+
from providers.base import TranslationProvider
|
| 9 |
+
|
| 10 |
+
MODEL_PATH = os.environ.get(
|
| 11 |
+
"GEMMA_MODEL_PATH",
|
| 12 |
+
"/data/models/swahili-gemma-1b/Q4_K_M/swahili-gemma-1b-q4_k_m.gguf",
|
| 13 |
+
)
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
class SwahiliGemmaProvider(TranslationProvider):
|
| 17 |
+
kind = "local"
|
| 18 |
+
description = "Fine-tuned Gemma 1B · Specialized English -> Swahili translation"
|
| 19 |
+
private = True
|
| 20 |
+
setup_hint = "Download GGUF model to /data/models/swahili-gemma-1b"
|
| 21 |
+
|
| 22 |
+
def __init__(
|
| 23 |
+
self,
|
| 24 |
+
provider_id: str = "swahili_gemma",
|
| 25 |
+
name: str = "Swahili Gemma (1B GGUF)",
|
| 26 |
+
model_path: str = MODEL_PATH,
|
| 27 |
+
) -> None:
|
| 28 |
+
self.id = provider_id
|
| 29 |
+
self.name = name
|
| 30 |
+
self.model_path = model_path
|
| 31 |
+
self._llm = None
|
| 32 |
+
self._lock = Lock()
|
| 33 |
+
|
| 34 |
+
def is_available(self) -> bool:
|
| 35 |
+
return os.path.isfile(self.model_path)
|
| 36 |
+
|
| 37 |
+
def _ensure_loaded(self) -> None:
|
| 38 |
+
if self._llm is not None:
|
| 39 |
+
return
|
| 40 |
+
with self._lock:
|
| 41 |
+
if self._llm is not None:
|
| 42 |
+
return
|
| 43 |
+
from llama_cpp import Llama
|
| 44 |
+
|
| 45 |
+
self._llm = Llama(
|
| 46 |
+
model_path=self.model_path,
|
| 47 |
+
n_ctx=2048,
|
| 48 |
+
n_threads=8, # Match your 8 vCPUs
|
| 49 |
+
verbose=False,
|
| 50 |
+
)
|
| 51 |
+
|
| 52 |
+
def translate(self, text: str, src: str, tgt: str, api_key: str | None = None) -> str:
|
| 53 |
+
self._ensure_loaded()
|
| 54 |
+
|
| 55 |
+
prompt = f"Translate to Swahili: {text}"
|
| 56 |
+
|
| 57 |
+
response = self._llm(
|
| 58 |
+
prompt,
|
| 59 |
+
max_tokens=256,
|
| 60 |
+
temperature=0.3,
|
| 61 |
+
top_p=0.95,
|
| 62 |
+
repeat_penalty=1.1,
|
| 63 |
+
)
|
| 64 |
+
|
| 65 |
+
return response["choices"][0]["text"].strip()
|
backend/requirements.txt
CHANGED
|
@@ -9,7 +9,9 @@ ctranslate2==4.5.0
|
|
| 9 |
transformers==4.47.1
|
| 10 |
sentencepiece==0.2.0
|
| 11 |
protobuf==5.29.2
|
|
|
|
| 12 |
|
| 13 |
# ctranslate2 4.5 imports pkg_resources, removed in setuptools>=81
|
| 14 |
setuptools<81
|
| 15 |
scalar-fastapi
|
|
|
|
|
|
| 9 |
transformers==4.47.1
|
| 10 |
sentencepiece==0.2.0
|
| 11 |
protobuf==5.29.2
|
| 12 |
+
llama-cpp-python>=0.2.80
|
| 13 |
|
| 14 |
# ctranslate2 4.5 imports pkg_resources, removed in setuptools>=81
|
| 15 |
setuptools<81
|
| 16 |
scalar-fastapi
|
| 17 |
+
huggingface_hub
|
entrypoint.sh
CHANGED
|
@@ -15,10 +15,13 @@ HF_MODEL="google/madlad400-3b-mt" \
|
|
| 15 |
CT2_MODEL_DIR="/data/models/madlad400-3b-mt-int8" \
|
| 16 |
python backend/convert_model.py || echo "WARNING: MADLAD conversion failed, continuing"
|
| 17 |
|
| 18 |
-
echo "== Converting
|
| 19 |
-
HF_MODEL="
|
| 20 |
-
CT2_MODEL_DIR="/data/models/
|
| 21 |
-
python backend/convert_model.py || echo "WARNING:
|
|
|
|
|
|
|
|
|
|
| 22 |
|
| 23 |
echo "== Starting server =="
|
| 24 |
cd backend && exec uvicorn main:app --host 0.0.0.0 --port 7860
|
|
|
|
| 15 |
CT2_MODEL_DIR="/data/models/madlad400-3b-mt-int8" \
|
| 16 |
python backend/convert_model.py || echo "WARNING: MADLAD conversion failed, continuing"
|
| 17 |
|
| 18 |
+
echo "== Converting AfriNLLB 600M =="
|
| 19 |
+
HF_MODEL="AfriNLP/AfriNLLB-12enc-12dec-full-ft-kd" \
|
| 20 |
+
CT2_MODEL_DIR="/data/models/afrinllb-600m-int8" \
|
| 21 |
+
python backend/convert_model.py || echo "WARNING: AfriNLLB conversion failed, continuing"
|
| 22 |
+
|
| 23 |
+
echo "== Downloading Swahili Gemma GGUF =="
|
| 24 |
+
python3 -c "from huggingface_hub import hf_hub_download; hf_hub_download(repo_id='CraneAILabs/swahili-gemma-1b-GGUF', filename='Q4_K_M/swahili-gemma-1b-q4_k_m.gguf', local_dir='/data/models/swahili-gemma-1b')" || echo "WARNING: Swahili Gemma download failed, continuing"
|
| 25 |
|
| 26 |
echo "== Starting server =="
|
| 27 |
cd backend && exec uvicorn main:app --host 0.0.0.0 --port 7860
|