feat(retrieval): prefer CUDA devices

This commit is contained in:
Julian lechner committed 2026-09-17 17:50:33 +02:00
1 parent 5ec6d0b6ac
commit e5b63965b8
2 files changed
+15 -2

No files matched your search

+6
View File
@@ -27,6 +27,12 @@ def embedding():
class RetrievalServerTests(unittest.TestCase): class RetrievalServerTests(unittest.TestCase):
def test_preferred_device_uses_cuda_with_cpu_fallback(self):
with patch.dict('sys.modules', torch=SimpleNamespace(cuda=SimpleNamespace(is_available=lambda: True))):
self.assertEqual(MODULE.preferred_device(), 'cuda')
with patch.dict('sys.modules', torch=SimpleNamespace(cuda=SimpleNamespace(is_available=lambda: False))):
self.assertEqual(MODULE.preferred_device(), 'cpu')
@unittest.skipUnless(os.environ.get('QWEN_TEST_MODEL_CACHE'), 'Set QWEN_TEST_MODEL_CACHE to run the real-model check.') @unittest.skipUnless(os.environ.get('QWEN_TEST_MODEL_CACHE'), 'Set QWEN_TEST_MODEL_CACHE to run the real-model check.')
def test_real_models(self): def test_real_models(self):
os.environ['HF_HOME'] = os.environ['QWEN_TEST_MODEL_CACHE'] os.environ['HF_HOME'] = os.environ['QWEN_TEST_MODEL_CACHE']
+9 -2
View File
@@ -118,6 +118,11 @@ def document_text(path: str, symbol: str, content: str):
return f"Path: {path}\nSymbol: {symbol}\n\n{content}" return f"Path: {path}\nSymbol: {symbol}\n\n{content}"
def preferred_device():
import torch
return "cuda" if torch.cuda.is_available() else "cpu"
def reciprocal_rank_fusion(*rankings): def reciprocal_rank_fusion(*rankings):
scores = {} scores = {}
for ranking in rankings: for ranking in rankings:
@@ -165,13 +170,15 @@ class Index:
if self.model is None: if self.model is None:
from sentence_transformers import SentenceTransformer from sentence_transformers import SentenceTransformer
self.model = SentenceTransformer(MODEL, truncate_dim=EMBEDDING_DIMENSIONS, self.model = SentenceTransformer(MODEL, truncate_dim=EMBEDDING_DIMENSIONS,
prompts={"query": f"Instruct: {RETRIEVAL_INSTRUCTION}\nQuery: "}) prompts={"query": f"Instruct: {RETRIEVAL_INSTRUCTION}\nQuery: "},
device=preferred_device())
return self.model return self.model
def reranker(self): def reranker(self):
if self.reranker_model is None: if self.reranker_model is None:
from sentence_transformers import CrossEncoder from sentence_transformers import CrossEncoder
self.reranker_model = CrossEncoder(RERANKER_MODEL, prompts={"query": RETRIEVAL_INSTRUCTION}, default_prompt_name="query") self.reranker_model = CrossEncoder(RERANKER_MODEL, prompts={"query": RETRIEVAL_INSTRUCTION},
default_prompt_name="query", device=preferred_device())
return self.reranker_model return self.reranker_model
def rerank(self, query: str, rows: list[dict], limit: int): def rerank(self, query: str, rows: list[dict], limit: int):