arindae commited on
Commit
71db45a
·
verified ·
1 Parent(s): 7ffed06

Afri model addition

Browse files
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, SunbirdNLLBProvider
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
- SunbirdNLLBProvider(),
 
 
 
 
 
 
 
 
 
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 Sunbird NLLB 3.3B =="
19
- HF_MODEL="Sunbird/translate-nllb-3.3b-salt" \
20
- CT2_MODEL_DIR="/data/models/sunbird-nllb-3.3b-int8" \
21
- python backend/convert_model.py || echo "WARNING: Sunbird NLLB 3.3B conversion failed, continuing"
 
 
 
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