# Протокол: корпус принят до сравнения стоимости

Версия 1 — 24 сентября 2026. Эта карточка предлагает протокол для заполнения; она не содержит ни измеренных результатов, ни набора данных. Связанный блокнот использует небольшой синтетический MLP, чтобы научиться снимать показания памяти. Он не выполняет описанный ниже рабочий протокол.

## 1. Определить полезную работу до испытаний

Пример работы: классифицировать корпус из **1 000 текстов**. Составьте сами разрешённый набор, репрезентативный для вашего применения, с уникальным идентификатором и проверенной ссылкой для каждого текста. Зафиксируйте ревизию корпуса, модели, токенизатора, кода и зерно. Храните отдельно список ожидаемых ID и индивидуальные выходы, чтобы обеспечить возможность аудита.

Определите до любых измерений: классы, формат выхода, основную метрику (например, macro-F1), её порог приёмки и максимально допустимую деградацию относительно эталона. Выберите допуск, подходящий для вашего применения; никакое универсальное значение здесь не приводится. Обучающие данные, данные настройки и данные оценки должны оставаться раздельными.

Корпус принимается только если все 1 000 ожидаемых ID присутствуют ровно один раз, в выходах нет ни одного лишнего ответа, формат корректен и заранее установленное правило качества соблюдено. Два файла, каждый из которых содержит 1 000 строк, сами по себе не доказывают равенство ID. Архивируйте проверку наборов и дубликатов.

## 2. Менять только заявленную вариацию

Чтобы изучить батч, подготовьте, например, варианты 1, 4 и 8. Сохраняйте один и тот же корпус, порядок входов, модель, токенизатор, точность и лимит контекста. Если затем вы изучаете точность, создайте отдельный эксперимент и заново проведите контроль качества. Опишите усечение: сокращение текстов меняет выполненную работу.

Зафиксируйте реальный GPU, число фактически использованных GPU, устройство, драйвер, Python, PyTorch и среду выполнения CUDA или ROCm. Также укажите версию вашего кода, возможные параметры генерации и любую конкуренцию за машину в `notes`. Коммерческий лот из двух GPU не означает, что программа использует оба.

## 3. Измерять сопоставимые проходы

Объявите, что охватывает секундомер: только обработка или полная цепочка с чтением, токенизацией и записью. Разделите загрузку, первый проход и прогретые проходы. Скрипт памяти измеряет только свой MLP и не замеряет полную цепочку классификации.

Выполните заявленный прогрев, затем пять измеренных проходов на каждую вариацию в чередующемся или заранее выбранном случайном порядке. Сохраняйте каждую сырую длительность. Приведение медианы и размаха min–max позволяет увидеть разброс; пять наблюдений не оправдывают устойчивую оценку p95. Не отбрасывайте молча ошибку или медленный проход: сохраните его строку и объясните инцидент. Перезапустите в новом процессе, если хотите сравнить первые проходы в схожих условиях.

Для измерений GPU в PyTorch синхронизируйте выбранное устройство перед первичным снятием и после операции. Снимите базовые значения `allocated` и `reserved`, сбросьте статистику пиков, затем сохраните абсолютные пики фазы. `allocated` включено в `reserved`: их сложение посчитало бы часть памяти дважды. Оба максимума могут быть достигнуты в разные моменты: их разность не является измерением кэша в конкретный момент. Аллокации других процессов и аллокации вне аллокатора PyTorch не покрываются.

## 4. Заполнить resultats-bruts.csv

Распространяемый CSV содержит только заголовки. Записывайте одну строку на проход, с точкой в качестве десятичного разделителя и секундами для времени, байтами для памяти и центами USD для тарифа. Пустая ячейка означает «не измерено»; ноль означает действительно ноль. Запятые, присутствующие в примечании, должны быть защищены обычными правилами CSV.

| Поля | Смысл и ввод |
| --- | --- |
| `experiment_id`, `variant_id` | Устойчивые идентификаторы эксперимента и варианта. |
| `corpus_revision`, `model_revision`, `tokenizer_revision`, `seed` | Неизменяемые версии или отпечатки, а также объявленное зерно. |
| `gpu_model`, `gpu_count`, `device`, `driver_version`, `python_version`, `torch_version`, `runtime_version` | Фактически использованное оборудование и наблюдаемая среда; не копируйте обещание из предложения. |
| `precision`, `batch`, `context` | Фактически применённая конфигурация. |
| `phase`, `run_index`, `warmup_iterations` | Отдельная фаза (`cold` или `warm`, например), номер прохода, число прогревов. Не смешивайте длительности. |
| `expected_ids`, `observed_ids` | Количество ожидаемых и наблюдаемых ID; подробные списки хранятся вместе с выходными данными. |
| `ids_match`, `format_valid` | `true`/`false` после реальной проверки, включая дубликаты и дополнительные ответы. |
| `quality_metric`, `quality_threshold`, `quality_tolerance`, `quality_value` | Заранее заданные название, порог и допуск, затем измеренное значение. Укажите смысл допуска и эталон в `notes`. |
| `corpus_accepted` | `true` только если все условия валидации выполнены; иначе `false`. |
| `elapsed_seconds` | Необработанная длительность в объявленном периметре, никогда не ожидаемое значение. |
| `baseline_allocated_bytes`, `baseline_reserved_bytes`, `peak_allocated_bytes`, `peak_reserved_bytes` | Отдельные показания только для измеряемого device. Оставьте пустыми, если не измерялись. |
| `duration_days`, `lots`, `package_total_usd_minor` | Выбранный полный пакет, оплачиваемые лоты и итоговая цена в центах USD; один расход не должен суммироваться пять раз. |
| `accepted_unique_corpora` | Число различных полезных корпусов, принятых для экономического анализа; это поле не следует суммировать между повторениями. |
| `notes` | Периметр, инциденты, решения по качеству, ревизия кода и ссылки на сохранённые материалы. |

## 5. Считать, не выдумывая объём работы

Цена для сравнения — это полный пакет на 3, 7 или 30 дней, умноженный на число лотов. Для B200 один лот содержит два GPU, и тариф уже покрывает этот лот. `calcul_forfaits.py` применяет это правило к предоставленным тарифам.

Если в качестве выбранной полезной работы выступает полный принятый корпус, в `--accepted-results` нужно передать число различных корпусов, фактически прошедших валидацию за период. Пять повторений одного и того же корпуса служат для измерения вариативности: они не создают пять полезных результатов. Зафиксируйте единицу измерения до сравнения и сохраняйте её для всех вариантов. Без измеренного и принятого количества оставьте этот параметр отсутствующим: будет рассчитана только стоимость пакета. Не проецируйте автоматически темп на 3, 7 или 30 дней.

Храните вместе заполненный протокол, отдельные выходные данные, проверки качества, необработанный CSV и экономический расчёт. Более быстрая, но не принятая конфигурация не выполняет ту же задачу. Конфигурация, превысившая память, остаётся наблюдением неудачи, а не временем, которое следует заменить нулём.
