# IteraGPU Lab v1

Оригінальні матеріали, версія від 24 вересня 2026 року, для підготовки відтворюваного експерименту на GPU. Ноутбук для вимірювання пам'яті та його супутній скрипт запускають невелику синтетичну мережу `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, ні драйвера, ні облікових даних. Розпакуйте файли в новий каталог. Ноутбук також можна завантажити окремо: він не імпортує супутній скрипт.

## Передумови та обмеження

Арифметичні розрахунки та розрахунки тарифів використовують лише Python 3.10 або новіший та його стандартну бібліотеку. Ноутбук потребує інструмента, здатного відкрити ноутбук Python; жоден сервер Jupyter не надається. Вимірювання додатково потребує наявного встановлення PyTorch, сумісного з GPU, драйвером та його середовищем виконання CUDA або ROCm. Жодна команда з цієї теки не встановлює ці компоненти.

Виберіть явний device, наприклад `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
```

Цей розрахунок приймає кількість параметрів і ширину зберігання. Він округлює біти до наступного цілого числа байтів, а потім переводить у Gio (`2**30` байтів). Один десятковий GB становить `10**9` байтів. Ці 4 Gio — це припущення, вибране в цьому прикладі, а не виміряний резерв. Результат не включає автоматично активації, 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 та інші згадані інструменти не розповсюджуються разом з архівом і зберігають свої відповідні ліцензії.
