From 7cf34fd14b5af9156e566b5f9fa367fb0f0efb93 Mon Sep 17 00:00:00 2001 From: second_constantine Date: Mon, 26 Jan 2026 23:38:01 +0300 Subject: [PATCH] Refactor benchmark base class and update main function - Removed unused imports and constants - Simplified run method signature by swapping num_ctx and context_size parameters - Added test case name logging for better traceability - Updated main function to pass context_size to benchmark run method - Improved code clarity and maintainability --- src/benchmarks/__pycache__/base.cpython-313.pyc | Bin 5252 -> 0 bytes .../__pycache__/codegen.cpython-313.pyc | Bin 3681 -> 0 bytes .../__pycache__/summarization.cpython-313.pyc | Bin 3692 -> 0 bytes .../__pycache__/translation.cpython-313.pyc | Bin 3666 -> 0 bytes src/benchmarks/base.py | 11 ++++------- src/main.py | 3 ++- .../__pycache__/ollama_client.cpython-313.pyc | Bin 5830 -> 0 bytes src/utils/__pycache__/report.cpython-313.pyc | Bin 13693 -> 0 bytes src/utils/__pycache__/scoring.cpython-313.pyc | Bin 15288 -> 0 bytes 9 files changed, 6 insertions(+), 8 deletions(-) delete mode 100644 src/benchmarks/__pycache__/base.cpython-313.pyc delete mode 100644 src/benchmarks/__pycache__/codegen.cpython-313.pyc delete mode 100644 src/benchmarks/__pycache__/summarization.cpython-313.pyc delete mode 100644 src/benchmarks/__pycache__/translation.cpython-313.pyc delete mode 100644 src/models/__pycache__/ollama_client.cpython-313.pyc delete mode 100644 src/utils/__pycache__/report.cpython-313.pyc delete mode 100644 src/utils/__pycache__/scoring.cpython-313.pyc diff --git a/src/benchmarks/__pycache__/base.cpython-313.pyc b/src/benchmarks/__pycache__/base.cpython-313.pyc deleted file mode 100644 index 456c37effa4b2ad00e9acc6b922a815750608323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5252 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 Kz>lShcmD-$6wm7b diff --git a/src/benchmarks/__pycache__/summarization.cpython-313.pyc b/src/benchmarks/__pycache__/summarization.cpython-313.pyc deleted file mode 100644 index 5c0fc7091f9c870e8d6cb321f9523560a4146783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3692 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 diff --git a/src/benchmarks/base.py b/src/benchmarks/base.py index 4a4e9cf..81520be 100644 --- a/src/benchmarks/base.py +++ b/src/benchmarks/base.py @@ -1,14 +1,9 @@ import logging import time -import os -import json from typing import Dict, Any, List from abc import ABC, abstractmethod from models.ollama_client import OllamaClient -# Импортируем константы -from constants import TEST_SEPARATOR - class Benchmark(ABC): """Базовый класс для всех бенчмарков.""" @@ -46,13 +41,14 @@ class Benchmark(ABC): """ pass - def run(self, ollama_client: OllamaClient, model_name: str, num_ctx: int = 32000, context_size: int = None) -> Dict[str, Any]: + def run(self, ollama_client: OllamaClient, model_name: str, context_size: int = 32000) -> Dict[str, Any]: """ Запуск бенчмарка. Args: ollama_client: Клиент для работы с Ollama model_name: Название модели + context_size: Размер контекста для модели Returns: Результаты бенчмарка @@ -65,6 +61,7 @@ class Benchmark(ABC): for i, test_case in enumerate(test_cases, 1): try: self.logger.info(f"Running test case {i}/{len(test_cases)} for {self.name}") + self.logger.info(f"Test name: {test_case['name']}") # Замер времени start_time = time.time() @@ -78,7 +75,7 @@ class Benchmark(ABC): # Для Ollama параметры контекста передаются в options options['num_ctx'] = context_size self.logger.debug(f"Setting context size to {context_size}") - + self.logger.debug(f"About to call generate with model={model_name}, prompt length={len(prompt)}, options={options}") model_response = ollama_client.generate( model=model_name, diff --git a/src/main.py b/src/main.py index eab4207..5f6da71 100644 --- a/src/main.py +++ b/src/main.py @@ -26,6 +26,7 @@ def run_benchmarks(ollama_client: OllamaClient, model_name: str, benchmarks: Lis ollama_client: Клиент для работы с Ollama model_name: Название модели benchmarks: Список имен бенчмарков для запуска + context_size: Размер контекста для модели Returns: Список результатов бенчмарков @@ -45,7 +46,7 @@ def run_benchmarks(ollama_client: OllamaClient, model_name: str, benchmarks: Lis logging.info(f"Running {benchmark_name} benchmark...") benchmark = benchmark_classes[benchmark_name]() - result = benchmark.run(ollama_client, model_name) + result = benchmark.run(ollama_client, model_name, context_size) results.append(result) return results diff --git a/src/models/__pycache__/ollama_client.cpython-313.pyc b/src/models/__pycache__/ollama_client.cpython-313.pyc deleted file mode 100644 index 4318c9d283abb9bbacfa2207151e60aa32d12000..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5830 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 Ga{dod>-X^h diff --git a/src/utils/__pycache__/scoring.cpython-313.pyc b/src/utils/__pycache__/scoring.cpython-313.pyc deleted file mode 100644 index b861ee83216dee169947893b5b35974e38a923dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15288 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 YG6@<;rW&TiD;-mhy&wFXUfFv59|OW)x&QzG