LLMTF Open — это открытый фреймворк для комплексной оценки больших языковых моделей (LLM) с поддержкой русского языка и реализованным на его основе бенчмарком.
- Быстрая оценка моделей с поддержкой VLLM для ускорения инференса
- Гибкая архитектура задач на основе message-формата
- Поддержка различных методов оценки: генерация текста, расчет вероятностей токенов, перплексия
- Оценка разных классов моделей: базовых, инструктивных, рассуждающих
- Богатый набор задач: от классификации до RAG и длинных контекстов
- Автоматизированный бенчмарк с параллельным выполнением на нескольких GPU
- LLM-as-a-Judge оценка с ELO рейтингами
TODO
# Оценка модели с VLLM
CUDA_VISIBLE_DEVICES=0 python evaluate_model.py \
--model_name_or_path openchat/openchat-3.5-0106 \
--conv_path conversation_configs/openchat_3.5_1210.json \
--output_dir results_openchat \
--few_shot_count 1 \
--max_len 4000 \
--batch_size 8 \
--vllm
# Запуск полного бенчмарка
python benchmark/calculate_benchmark_api.py \
--model_dir /path/to/model \
--gen_config_settings benchmark/config_balanced.json \
--api_key EMPTY \
--num_gpus 4- MMLU (русский/английский) — тест общих знаний
- Shlepa — специализированные домены (фильмы, музыка, право, книги)
- DaruMeru — комплексный русскоязычный бенчмарк
- Перевод — Flores ru↔en
- Суммаризация — новостные тексты
- Анализ тональности — извлечение мнений
- NER — распознавание именованных сущностей
- RAG — вопросно-ответные системы с контекстом
- IFEval — следование инструкциям
- Libra — работа с длинными контекстами (до 32K токенов)
- Математика — решение задач по математике и физике
-
llmtf/— ядро фреймворкаbase.py— базовые классы Task и LLMmodel.py— реализации HFModel и VLLMModelevaluator.py— основной класс для оценкиtasks/— коллекция задач для оценки
-
benchmark/— автоматизированный бенчмаркcalculate_benchmark_api.py— параллельное выполнение задач через APIllmaaj/— LLM-as-a-Judge оценка
-
conversation_configs/— конфигурации чат-шаблонов для различных моделей
Создайте класс, наследующий от SimpleFewShotHFTask:
from llmtf.base import SimpleFewShotHFTask
from llmtf.metrics import mean
class MyTask(SimpleFewShotHFTask):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self._max_task_new_tokens = 512
def dataset_args(self):
return {"path": "my_dataset", "name": "default"}
def create_messages(self, sample, with_answer=False):
messages = [{"role": "user", "content": sample["question"]}]
if with_answer:
messages.append({"role": "assistant", "content": sample["answer"]})
return messages
def evaluate(self, sample, prediction):
return {"accuracy": int(sample["answer"] == prediction)}
def aggregation(self):
return {"accuracy": mean}Фреймворк включает систему оценки моделей с помощью LLM-судей:
# Генерация ответов моделей
python benchmark/llmaaj/generate_llmaaj.py \
--base_url http://localhost:8000 \
--model_name_or_path /path/to/model \
--api_key EMPTY \
--model_name my_model \
--benchmark_name ru_arena-hard-v0.1
# Оценка судьей
python benchmark/llmaaj/judge_llmaaj.py \
--judge_base_url http://localhost:8001 \
--judge_model_name_or_path /path/to/judge_model \
--judge_api_key EMPTY \
--judge_model_name deepseek \
--benchmark_name ru_arena-hard-v0.1 \
--model_name my_model
# Показ результатов
python benchmark/llmaaj/show_benchmark.py \
--benchmark_name ru_arena-hard-v0.1 \
--judge_model_name deepseekКласс модели имеет поле generation_config, которое используется по умолчанию при генерации.
Локальные модели инициализируют это поле своим generation_config из HF. api vllm модели используют стандартный конфиг. Вы также можете задать произвольный конфиг.
В случае использования рассуждающих моделей - а именно классов HFModelReasoning, VLLMModelReasoning, ApiVLLMModelReasoning - помимо параметра max_new_tokens вы можете задать max_new_tokens_reasoning, ограничивающий бюджет на рассуждения (не идет в счет max_new_tokens).
Каждая задача предоставляет бюджет токенов - task.max_task_new_tokens - который имеет более высокий приоритет, чем
max_new_tokens в model.generation_config. Попмимо этого могут быть указаны дополнительные стоп-строки - task.additional_stop_strings - и параметры метода задачи - task.method_additional_args.
Помимо этого, метод evaluate класса Evaluator имеет параметр max_prompt_len - бюджет на токены промпта. Если общий бюджет токенов - model.model_max_len - окажется меньше чем max_new_tokens + max_prompt_len (+ max_new_tokens_reasoning в случае рассуждающей модели), то сначала будет укорачиваться бюджет на рассуждения, а потом на промпт.
Также вы можете передать произвольный конфиг в качестве параметра методу evaluate класса Evaluator, однако это может вызвать проблемы с некоторыми задачами, так как этот параметр имеет наивысший приоритет.
- VLLM: Рекомендуется для ускорения, но требует
CUDA_VISIBLE_DEVICES - Длинные контексты: Параметр
max_lenможет автоматически корректироваться - Квантизация: Экспериментальная поддержка, возможны проблемы, лучше не использовать
- Перплексия расчитывается без экспоненцирования
В директории examples/ находятся Jupyter notebook'и с примерами:
- Создание новой задачи
- Настройка конфигурации модели
- Результаты оценки различных моделей
Проект распространяется под открытой лицензией. См. файл LICENSE для деталей.