English translation is not available yet. Showing Russian content.
Настроить inference-time scaling для модели reasoning
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Настроить inference-time scaling для модели reasoning
1. Цель задачи
Научиться управлять количеством compute, затрачиваемого на этапе инференса (test-time compute), для улучшения качества ответов LLM на задачах, требующих рассуждений (reasoning). Необходимо реализовать и протестировать несколько стратегий scaling (увеличение числа токенов CoT, multiple sampling с majority voting, iterative refinement) и найти оптимальный budget (количество токенов/запросов), который даёт максимальную точность при приемлемых затратах по времени и стоимости.
Ключевой результат Построенная quality-cost curve для выбранной модели и датасета; обоснованная рекомендация по оптимальному budget для production-сценария.
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| LLM с поддержкой reasoning (например, deepseek-r1, o1-mini, или обычная модель + CoT) | OpenAI API, DeepSeek API, или локальная модель через HuggingFace |
| Датасет задач с ответами (reasoning benchmark) | GSM8K, MATH, MMLU (выбрать один) — скачать с HuggingFace |
| Скрипт для batch-инференса | Написать на Python с aiohttp или OpenAI SDK |
| Средства логирования времени и токенов | Python logging + tiktoken |
| Система мониторинга (опционально) | Langfuse, Weights & Biases |
Если нет реального reasoning-модели — симулируем:
- Используем обычную instruct-модель (gpt-3.5-turbo, llama 3.1 8B) с принудительным chain-of-thought промптом: «Рассуждай шаг за шагом, затем дай ответ».
- Управляем длиной CoT через параметр max_tokens (от 256 до 4096).
- Для симуляции multiple sampling используем n_samples с temperature=0.7.
- Для iterative refinement: запускаем модель на том же запросе с фидбеком: «Твой предыдущий ответ был неверен. Подумай ещё раз и дай исправленный ответ.» (loop до 5 итераций).
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Backend LLM | OpenAI / DeepSeek API, HuggingFace Transformers | Исполнение reasoning |
| Оркестрация экспериментов | Python + asyncio | Параллельный запуск запросов |
| Замеры токенов | tiktoken / transformers tokenizer | Подсчёт затраченных токенов |
| Датасет | HuggingFace datasets | Загрузка GSM8K/MATH |
| Логирование | Python logging + CSV файлы | Сохранение числа токенов, времени, точности |
| Анализ данных | Jupyter Notebook, seaborn | Построение curves, поиск budget |
| Метрики | accuracy, pass@k | Оценка качества |
4. Этапы выполнения
Этап 1: Подготовка инфраструктуры и получение baseline (2 часа)
Действия
-
Установить библиотеки:
# requirements.txt openai>=1.0.0 datasets tiktoken pandas seaborn matplotlib jupyter -
Загрузить датасет (например, GSM8K):
from datasets import load_dataset dataset = load_dataset("gsm8k", "main")['test'] question = dataset[0]['question'] answer = dataset[0]['answer'] -
Создать базовую функцию для инференса:
import openai def infer(question: str, max_tokens: int, model="gpt-4o-mini"): response = openai.chat.completions.create( model=model, messages=[{"role": "user", "content": f"Рассуждай шаг за шагом. {question}"}], max_tokens=max_tokens, temperature=0.0 ) return response.choices[0].message.content, response.usage.total_tokens -
Запустить baseline: для 100 случайных вопросов с минимальным бюджетом (max_tokens=256). Зафиксировать accuracy и среднее число токенов.
-
Настроить логирование: каждое выполнение записывать в CSV: question_id, budget (max_tokens), actual_tokens, time_s, answer, correct.
Ожидаемый результат этапа Готовый скрипт для запуска экспериментов и baseline accuracy (например, ~40% на GSM8K при 256 токенах).
Этап 2: Реализация стратегий scaling (3 часа)
Действия
-
Стратегия A: Увеличение длины CoT (Max tokens scaling)
- Реализовать цикл для max_tokens = [512, 1024, 2048, 4096].
- Для каждого значения запустить на 200 вопросах, сохраняя результаты.
-
Стратегия B: Multiple sampling + majority voting
- Для каждого вопроса генерировать N ответов (N = [2, 5, 10]) с temperature=0.7.
- Извлечь финальный ответ из каждого (регулярка поиска
#### number). - majority voting: выбирать самый частый ответ.
- budget = N * среднее число токенов на один ответ.
-
Стратегия C: Iterative refinement (self-correct)
- Начать с одного ответа (max_tokens=1024).
- Если ответ неверный (по regex — но мы проверяем после), подать на вход тот же вопрос плюс предыдущий ответ и запросить исправление.
- Количество итераций: [1, 2, 3, 5].
- budget = сумма токенов всех итераций.
-
Написать единую функцию
run_strategy, принимающую параметры стратегии и возвращающую accuracy + cost.
Ожидаемый результат этапа Код всех трёх стратегий; возможность запускать их с разными параметрами.
Этап 3: Проведение экспериментов и сбор данных (2 часа)
Действия
- Выбрать подмножество датасета – 200 вопросов для тестирования (контрольных), 50 для валидации.
- Последовательно запустить все стратегии с разными бюджетами:
- Strategy A: max_tokens = 256, 512, 1024, 2048, 4096.
- Strategy B: N = 2, 5, 10, 20.
- Strategy C: iters = 1, 2, 3, 5.
- Для каждой точки зафиксировать: accuracy, среднее число токенов (или медиану), среднее время.
- Параллелизовать запросы (не более 5 одновременных) для ускорения.
- Сохранить итоговый CSV со всеми результатами.
Ожидаемый результат этапа Собранные данные в файле experiment_results.csv с колонками: strategy, budget, accuracy, avg_tokens, avg_time.
Этап 4: Анализ и поиск оптимального budget (1.5 часа)
Действия
-
Построить графики (Jupyter Notebook):
-
Рассчитать метрику «эффективность»:
delta_accuracy / log(budget)— прирост точности на единицу логарифма budget.- Найти бюджет, после которого прирост <1% на 2x увеличение.
-
Определить оптимальный budget для каждого класса задач:
- Короткие задачи (1-2 шага) — budget 512.
- Сложные задачи (5+ шагов) — budget 2048+.
-
Сформулировать рекомендацию: «Для продукта с latency <5 сек используем max_tokens=1024 (Strategy A), accuracy 65%. Для highest quality — multiple sampling с N=5 (budget ~5000 токенов), accuracy 78%».
Ожидаемый результат этапа Jupyter Notebook с графиками, таблицей оптимальных параметров, обоснованным выводом.
Этап 5: Документирование и шаблон для production (1 час)
Действия
- Оформить отчёт: README с описанием экспериментов, выводами, кодом.
- Написать два скрипта:
inference.py— принимает budget и стратегию как параметры командной строки.optimize_budget.py— запускает автоматический grid search и записывает best.
- Добавить unit-тесты для функций извлечения ответа и majority voting.
- Подготовить дашборд (если есть W&B) — метрики accuracy vs cost на разных ветках.
Ожидаемый результат этапа Пакет кода, готовый к интеграции в production pipeline; документация с описанием trade-offs.
5. Критерии приемки (Definition of Done)
- Реализованы минимум 3 стратегии scaling (длина CoT, multiple sampling, iterative refinement).
- Эксперименты проведены на датасете из ≥200 вопросов.
- Построен график quality-cost curve с подписанными осями.
- Найден оптимальный budget для каждой стратегии (критерий: прирост accuracy <1% при удвоении budget).
- Написан скрипт
inference.pyс поддержкой выбора стратегии и budget. - Результаты воспроизводимы: seed фиксирован (temperature=0 для Strategy A и первый шаг B).
- Читаемая документация (README) с таблицей trade-offs.
- Unit-тесты покрывают извлечение ответа и majority voting.
6. Ожидаемый результат
Основной результат
- Репозиторий с кодом (скрипты, ноутбук, документация).
- Файл
experiment_results.csvсо всеми данными. - График Pareto frontier (PNG/PDF).
- Выводы в Markdown: какой бюджет выбрать для production.
Опциональные результаты
- Дашборд в W&B.
- Скрипт для мониторинга текущего latency и автоматического переключения стратегии.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Ограничения API по скорости (rate limits) | Использовать asyncio + exponential backoff; уменьшить количество параллельных запросов |
| Некорректное извлечение ответа из CoT | Написать универсальный regex: r'####\s*(\d+(?:\.\d+)?)' для GSM8K; для MATH — извлекать после \\boxed{} |
| Нестабильность времени выполнения | Замерить несколько раз, брать медиану; для timing использовать time.perf_counter |
| Большое количество токенов у дорогих моделей | Использовать дешёвую модель (deepseek-chat, gpt-4o-mini) для экспериментов; позже реплицировать на дорогую |
| Дрейф распределения задач (data drift) | Взять фиксированный тестовый датасет, не менять между прогонами |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Подготовка и baseline | 2 часа |
| Реализация стратегий | 3 часа |
| Эксперименты и сбор данных | 2 часа |
| Анализ и поиск optimum | 1.5 часа |
| Документирование | 1 час |
| Итого | 9.5 часов |
Примечание: при первом выполнении может потребоваться +1-2 часа на отладку API и regex.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 12 | Как оценивать cost-to-quality ratio для LLM? |
| 45 | Что такое test-time compute scaling и как его измерять? |
| 89 | Реализация majority voting для улучшения точности |
| 134 | Chain-of-thought prompting, техники управления длиной |
| 203 | Оптимизация latency через adaptive compute |
| 278 | Метрики качества reasoning (accuracy, pass@k) |
| 312 | Библиотеки для бенчмаркинга LLM (lm-evaluation-harness) |
| 456 | Rate limiting and async I/O для LLM API |
| 567 | Pareto frontier в контексте ML-систем |
| 678 | Self-correcting LLMs: iterative refinement techniques |
10. Чек-лист самопроверки
- Я чётко понимаю разницу между train-time и test-time compute scaling.
- Я выбрал конкретный датасет и модель; baseline accuracy зафиксирован.
- Скрипт для экспериментов логирует все необходимые метрики (tokens, time, correct).
- Каждая стратегия реализована с изолированными параметрами и повторяемым seed.
- Я построил quality-cost curve и могу объяснить, почему выбрал именно этот budget.
- Код покрыт unit-тестами как минимум для извлечения ответа и voting.
- Документация содержит пример запуска для production с одним параметром
--budgetи--strategy.