# IteraGPU Lab v1

Оригинальные материалы, версия от 24 сентября 2026 года, для подготовки воспроизводимого эксперимента на GPU. Ноутбук для измерения памяти и его companion-скрипт исполняют небольшую синтетическую сеть `Linear → GELU → Linear`. Они не скачивают ни модель, ни набор данных. Эта сеть не является ни LLM, ни обучением, ни репрезентативным бенчмарком предложенных в аренду GPU.

## Содержимое

- `mesure-memoire.ipynb`: автономный ноутбук, код включён, ячейки без сохранённых выходных данных.
- `mesure_memoire.py`: та же арифметика и тот же протокол измерения, доступные из командной строки.
- `protocole-qualite.md`: рабочий протокол, который нужно дополнить перед сравнением времени и стоимости.
- `resultats-bruts.csv`: пустая таблица, по одной строке на каждый реальный прогон.
- `calcul_forfaits.py`: расчёт полного тарифа, без внешних зависимостей.
- `tarifs-forfaits.csv`: 45 тарифов IteraGPU, 15 моделей × 3 длительности, снимок от 24 сентября 2026 года.
- `LICENSE.txt`: лицензия MIT на код, ноутбук и оригинальные документы.
- `MANIFEST.json`: исчерпывающий список девяти элементов архива, размеры и SHA-256 восьми файлов с содержимым. Манифест объявляет себя без отпечатка, чтобы избежать самореферентного отпечатка.

Архив `iteragpu-lab-v1.zip` содержит эти девять файлов в единственной папке. В нём нет ни результатов с GPU, ни окружения Python, ни драйвера, ни учётных данных. Распакуйте файлы в новый каталог. Ноутбук можно также скачать отдельно: он не импортирует companion-скрипт.

## Требования и ограничения

Арифметические расчёты и расчёт тарифа используют только Python 3.10 или новее и его стандартную библиотеку. Ноутбуку нужен инструмент, умеющий открывать ноутбук Python; сервер Jupyter не предоставляется. Для измерения дополнительно требуется уже установленный PyTorch, совместимый с GPU, драйвером и его средой выполнения CUDA или ROCm. Ни одна команда из этой папки не устанавливает эти компоненты.

Выбирайте явное устройство, например `cuda:0`. Бэкенд ROCm в PyTorch тоже использует это имя интерфейса; это не доказывает совместимость конкретной установки AMD. Без загружаемого PyTorch или без доступного GPU `measure` завершается с кодом 2 и понятным сообщением. Он не записывает никаких ложных измерений и не переключается на CPU. `environment` — это диагностика: корректный вывод может сообщить о недоступности GPU.

## 1. Оценить веса, без GPU

```console
python mesure_memoire.py estimate --parameters 7000000000 --bits 16 --reserve-gib 4
```

Этот расчёт принимает число параметров и ширину хранения. Он округляет биты до ближайшего большего целого числа байтов, затем переводит в GiB (`2**30` байт). Десятичный GB представляет `10**9` байт. Эти 4 GiB — допущение, выбранное в данном примере, а не измеренный резерв. Результат не включает автоматически активации, KV-кэш, метаданные квантования, градиенты, состояния оптимизатора или библиотеки. Он не предсказывает, поместится ли реальная модель на карту.

## 2. Проверить существующее окружение

```console
python mesure_memoire.py environment --device cuda:0
```

Сохраните Python, версию PyTorch, версию сборки CUDA/HIP, реально видимый GPU и память, объявленную средой выполнения. Драйвер следует фиксировать отдельно с помощью инструмента поставщика. Скрипт не собирает ни переменные окружения, ни персональные данные. Версия среды выполнения, встроенной в PyTorch, — это не версия драйвера.

## 3. Выполнить явно ограниченное измерение

Начните с малого, в новом процессе:

```console
python mesure_memoire.py measure --device cuda:0 --batch 1 --context 16 --width 64 --dtype float32 --warmup 1 --repeats 2 --output mesures-petit-essai.json
```

Чтобы затем исследовать размерности MLP, пример более крупной команды:

```console
python mesure_memoire.py measure --device cuda:0 --batch 2 --context 128 --width 1024 --dtype float32 --warmup 3 --repeats 5 --output mesures.json
```

Увеличивайте по одному измерению за раз и следите за доступной памятью. Вторая команда — это предложенная конфигурация, а не гарантированная ёмкость и не опубликованный результат. Здесь `context` обозначает число позиций входа `[batch, context, width]`, без механизма внимания или KV-кэша. Веса и входы используют запрошенный dtype; нет autocast, градиентов, оптимизатора, квантизации или распределения между GPU. `float16` и `bfloat16` зависят от фактической установки и не подтверждаются одной лишь проверкой float32.

JSON содержит `environment`, `configuration`, `synthetic_model` и `phases`. У файла должно быть новое имя; скрипт отказывается перезаписывать существующий результат.

| Фаза | Область |
| --- | --- |
| `model_load` | Построение и инициализация модели на CPU, перенос на выбранный GPU. Время включает эту подготовку на CPU; счётчики памяти относятся только к GPU. |
| `inputs` | Создание синтетических входов на этом GPU. |
| `cold_forward` | Первый проход модели после инициализации устройства, генератора и входов. Это не холодный запуск машины или драйвера. |
| `warmup` | Совокупность разогревочных проходов; это время не смешивается с последующими повторениями. |
| `warm_forward` | Одна строка на повторение после разогрева. |

Каждая фаза синхронизирует устройство до и после операции, снимает базовые значения, затем сбрасывает пики. Выходы ещё присутствуют при снятии конечных значений; они освобождаются перед следующим проходом. Веса и входы сохраняются между проходами. Кэш аллокатора сохраняется. Времена включают затраты Python и синхронизации: это не изолированные времена ядер.

`allocated` является частью `reserved`, поэтому их не складывают. `peak_allocated_bytes` и `peak_reserved_bytes` — два различных максимума: их не вычитают, чтобы вычислить кэш. Сравнивайте отдельно базовые значения, конечные значения и абсолютные пики. Счётчики охватывают только аллокатор PyTorch этого процесса на выбранном GPU, а не всю память GPU, драйвера или других процессов. Возможный другой GPU не измеряется. Значения также зависят от аллокатора и программного обеспечения: сохраняйте окружение вместе с результатами.

## 4. Связать качество и стоимость

Прочитайте `protocole-qualite.md`, зафиксируйте полезную работу и порог до испытания, затем заполните `resultats-bruts.csv` реальными наблюдениями. Этот набор не предоставляет ни корпуса для классификации, ни измерения качества.

```console
python calcul_forfaits.py --gpu b200 --days 7 --lots 2
```

Цена одного лота B200 уже включает два GPU. Два лота дают четыре GPU, но цена лота умножается только на два. Тарифы — из каталога IteraGPU на день этого снимка: целые единицы в центах USD, сроки 3, 7 или 30 дней, без конвертации и почасового пропорционального расчёта. CSV не подтверждает ни текущую доступность, ни резервирование. Проверьте отображаемое предложение перед любым решением о покупке.

Опция `--accepted-results` намеренно не имеет значения по умолчанию. Добавляйте её только с целым положительным числом действительно принятых различных полезных единиц. Удельная стоимость использует цену целого пакета. Повторения одного и того же бенчмарка не являются новыми полезными корпусами. Без указанного знаменателя удельная стоимость остаётся `null`; ноль отклоняется.

## Проверка этой версии

Арифметика, тарифы и отсутствие предзаполненных выходных данных проверены с Python 3.12.14 и его стандартной библиотекой. В этом окружении нет PyTorch: поэтому защита от отсутствия проверяется реально. Никаких установок не выполнялось.

Ограниченное функциональное испытание также было выполнено 24 сентября 2026 года на **локальной GeForce RTX 5070**, драйвер 610.62, Python 3.14.6, PyTorch 2.11.0+cu128, CUDA 12.8: batch 1, контекст 16, ширина 64, float32, один разогрев и два повторения. Оно подтверждает выполнение шести строк фаз скрипта на этом единственном случае. Оно не подтверждает ни производительность GPU из каталога, ни арендованную машину, ни LLM, ни ROCm, ни другие точности. Измерения этого испытания не предзаполнены в распространяемых файлах. Ноутбук сохраняет все свои выходные данные пустыми.

## Первичные технические источники

Документация просмотрена 24 сентября 2026 года. Эти ссылки объясняют API; фактически выполненная версия PyTorch указана выше и отличается от версии на документационных страницах.

- [PyTorch: управление памятью CUDA](https://docs.pytorch.org/docs/2.14/notes/cuda.html#memory-management)
- [PyTorch: семантика HIP/ROCm](https://docs.pytorch.org/docs/2.14/notes/hip.html)
- [PyTorch: синхронизация устройства](https://docs.pytorch.org/docs/2.14/generated/torch.cuda.synchronize.html)
- [PyTorch: сброс пиковых значений](https://docs.pytorch.org/docs/2.14/generated/torch.cuda.memory.reset_peak_memory_stats.html)
- [PyTorch: выделенная память](https://docs.pytorch.org/docs/2.14/generated/torch.cuda.memory.memory_allocated.html) и [зарезервированная память](https://docs.pytorch.org/docs/2.14/generated/torch.cuda.memory.memory_reserved.html)
- [PyTorch: максимум выделенной памяти](https://docs.pytorch.org/docs/2.14/generated/torch.cuda.memory.max_memory_allocated.html) и [максимум зарезервированной памяти](https://docs.pytorch.org/docs/2.14/generated/torch.cuda.memory.max_memory_reserved.html)
- [Python: десятичная арифметика](https://docs.python.org/3/library/decimal.html) и [файлы CSV](https://docs.python.org/3/library/csv.html)

## Лицензия

Оригинальные материалы проекта распространяются под лицензией MIT, воспроизведённой в `LICENSE.txt`. Сохраняйте уведомление при повторном распространении. Python, PyTorch и другие упомянутые инструменты не входят в архив и сохраняют свои соответствующие лицензии.
