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-модели — симулируем:

  1. Используем обычную instruct-модель (gpt-3.5-turbo, llama 3.1 8B) с принудительным chain-of-thought промптом: «Рассуждай шаг за шагом, затем дай ответ».
  2. Управляем длиной CoT через параметр max_tokens (от 256 до 4096).
  3. Для симуляции multiple sampling используем n_samples с temperature=0.7.
  4. Для iterative refinement: запускаем модель на том же запросе с фидбеком: «Твой предыдущий ответ был неверен. Подумай ещё раз и дай исправленный ответ.» (loop до 5 итераций).

3. Технологический стек

КомпонентИнструментыНазначение
Backend LLMOpenAI / 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 часа)

Действия

  1. Установить библиотеки:

    # requirements.txt
    openai>=1.0.0
    datasets
    tiktoken
    pandas
    seaborn
    matplotlib
    jupyter
    
  2. Загрузить датасет (например, GSM8K):

    from datasets import load_dataset
    dataset = load_dataset("gsm8k", "main")['test']
    question = dataset[0]['question']
    answer = dataset[0]['answer']
    
  3. Создать базовую функцию для инференса:

    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
    
  4. Запустить baseline: для 100 случайных вопросов с минимальным бюджетом (max_tokens=256). Зафиксировать accuracy и среднее число токенов.

  5. Настроить логирование: каждое выполнение записывать в CSV: question_id, budget (max_tokens), actual_tokens, time_s, answer, correct.

Ожидаемый результат этапа Готовый скрипт для запуска экспериментов и baseline accuracy (например, ~40% на GSM8K при 256 токенах).

Этап 2: Реализация стратегий scaling (3 часа)

Действия

  1. Стратегия A: Увеличение длины CoT (Max tokens scaling)

    • Реализовать цикл для max_tokens = [512, 1024, 2048, 4096].
    • Для каждого значения запустить на 200 вопросах, сохраняя результаты.
  2. Стратегия B: Multiple sampling + majority voting

    • Для каждого вопроса генерировать N ответов (N = [2, 5, 10]) с temperature=0.7.
    • Извлечь финальный ответ из каждого (регулярка поиска #### number).
    • majority voting: выбирать самый частый ответ.
    • budget = N * среднее число токенов на один ответ.
  3. Стратегия C: Iterative refinement (self-correct)

    • Начать с одного ответа (max_tokens=1024).
    • Если ответ неверный (по regex — но мы проверяем после), подать на вход тот же вопрос плюс предыдущий ответ и запросить исправление.
    • Количество итераций: [1, 2, 3, 5].
    • budget = сумма токенов всех итераций.
  4. Написать единую функцию run_strategy, принимающую параметры стратегии и возвращающую accuracy + cost.

Ожидаемый результат этапа Код всех трёх стратегий; возможность запускать их с разными параметрами.

Этап 3: Проведение экспериментов и сбор данных (2 часа)

Действия

  1. Выбрать подмножество датасета – 200 вопросов для тестирования (контрольных), 50 для валидации.
  2. Последовательно запустить все стратегии с разными бюджетами:
    • Strategy A: max_tokens = 256, 512, 1024, 2048, 4096.
    • Strategy B: N = 2, 5, 10, 20.
    • Strategy C: iters = 1, 2, 3, 5.
  3. Для каждой точки зафиксировать: accuracy, среднее число токенов (или медиану), среднее время.
  4. Параллелизовать запросы (не более 5 одновременных) для ускорения.
  5. Сохранить итоговый CSV со всеми результатами.

Ожидаемый результат этапа Собранные данные в файле experiment_results.csv с колонками: strategy, budget, accuracy, avg_tokens, avg_time.

Этап 4: Анализ и поиск оптимального budget (1.5 часа)

Действия

  1. Построить графики (Jupyter Notebook):

    • accuracy vs budget (общий график для всех стратегий).
    • accuracy vs cost (если известна цена токенов: например, $0.15/1M input, $0.60/1M output).
    • Выделить Pareto frontier — точки, где accuracy максимальна при небольшом budget.
  2. Рассчитать метрику «эффективность»:

    • delta_accuracy / log(budget) — прирост точности на единицу логарифма budget.
    • Найти бюджет, после которого прирост <1% на 2x увеличение.
  3. Определить оптимальный budget для каждого класса задач:

    • Короткие задачи (1-2 шага) — budget 512.
    • Сложные задачи (5+ шагов) — budget 2048+.
  4. Сформулировать рекомендацию: «Для продукта с latency <5 сек используем max_tokens=1024 (Strategy A), accuracy 65%. Для highest quality — multiple sampling с N=5 (budget ~5000 токенов), accuracy 78%».

Ожидаемый результат этапа Jupyter Notebook с графиками, таблицей оптимальных параметров, обоснованным выводом.

Этап 5: Документирование и шаблон для production (1 час)

Действия

  1. Оформить отчёт: README с описанием экспериментов, выводами, кодом.
  2. Написать два скрипта:
    • inference.py — принимает budget и стратегию как параметры командной строки.
    • optimize_budget.py — запускает автоматический grid search и записывает best.
  3. Добавить unit-тесты для функций извлечения ответа и majority voting.
  4. Подготовить дашборд (если есть 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. Бюджет времени (оценка)

ЭтапВремя
Подготовка и baseline2 часа
Реализация стратегий3 часа
Эксперименты и сбор данных2 часа
Анализ и поиск optimum1.5 часа
Документирование1 час
Итого9.5 часов

Примечание: при первом выполнении может потребоваться +1-2 часа на отладку API и regex.

9. Связанные вопросы из базы знаний

ВопросТема
12Как оценивать cost-to-quality ratio для LLM?
45Что такое test-time compute scaling и как его измерять?
89Реализация majority voting для улучшения точности
134Chain-of-thought prompting, техники управления длиной
203Оптимизация latency через adaptive compute
278Метрики качества reasoning (accuracy, pass@k)
312Библиотеки для бенчмаркинга LLM (lm-evaluation-harness)
456Rate limiting and async I/O для LLM API
567Pareto frontier в контексте ML-систем
678Self-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.