Gpu
12.1 VRAM-контроллер¶
Реализация: cnn_neat/vram_batch.py
VRAMBatchController адаптирует eval_batch_size во время эволюции:
Алгоритм:
- После каждого поколения:
used / total > threshold→batch_size //= 2. - OOM (
torch.cuda.OutOfMemoryError) →batch_size //= 2, retry (до 4 попыток). - Нижний предел:
max(batch_size, eval_batch_size_min).
Адаптивный размер batch (при adaptive_eval_batch_size=True):
\[
B_\text{eval} = \min\!\Big(B_\text{cap},\; \max\!\Big(B_\min,\; \frac{\lfloor \alpha \cdot M_\text{free} \rfloor - M_\text{reserve}}{M_\text{sample}}\Big)\Big)
\]
| Символ | Параметр | Default |
|---|---|---|
| \(B_\text{cap}\) | eval_batch_size |
45000 |
| \(B_\min\) | eval_batch_size_min |
256 |
| \(\alpha\) | gpu_memory_fraction |
0.85 |
| \(M_\text{reserve}\) | cuda_graph_memory_reserve_bytes |
600 МБ |
| \(M_\text{free}\) | torch.cuda.mem_get_info()[0] |
runtime |
Оценка памяти на образец (estimate_bytes_per_sample):
\[
M_\text{sample} = \left\lfloor 1.35 \cdot \max_{t} \sum_{i \le t} (3 \cdot H_i W_i \cdot 4) \right\rfloor \quad \text{[байт, fp32]}
\]
Коэффициент 1.35 — запас на overhead PyTorch/cuDNN.
12.2 Режимы forward runtime¶
Конфигурация: ExperimentConfig.forward_runtime
| Режим | Описание | Применение |
|---|---|---|
eager |
Прямой вызов genome.forward() |
Дефолт; безопасен для любой топологии |
compile |
torch.compile(PlannedForwardBody, mode=...) |
+20–40% скорость; warmup на первом batch |
cuda_graph |
Статические GPU-буферы + CUDAGraph.replay() |
Максимальная скорость; требует фикс. batch size |
AMP (Automatic Mixed Precision): при use_amp=True и CUDA — torch.autocast(dtype=float16) вокруг форварда.
Кэш runner'ов: WeakKeyDictionary[genome → (batch_size, mode, amp, plan_version) → runner] — при изменении топологии кэш инвалидируется автоматически.
flowchart LR
batch["Батч B изображений"] --> cache["GPUValCache\n(val на GPU)"]
cache --> runner["ForwardRunner\n(eager/compile/cuda_graph)"]
runner --> feat["F ∈ R^B×3×Hout×Wout"]
feat --> head["Binary Head\n(sum + sigmoid)"]
head --> metrics["TP/TN/FP/FN\n→ fitness"]
12.3 Прочие оптимизации¶
| Техника | Файл | Описание |
|---|---|---|
GPUValCache |
eval.py |
Весь val (25k образцов) предзагружен на GPU; исключает CPU→GPU transfer при каждом eval |
fitness_eval_parallel |
eval.py |
Параллельная оценка геномов через несколько CUDA streams |
keep_population_on_gpu_within_generation |
experiment.py |
Геномы остаются на GPU внутри поколения (default False; включай только если VRAM хватает на всю популяцию) |
cache_refinement_*_on_gpu |
evolution_loop.py |
Train/test на GPU для elite refinement |
CUDA_EMPTY_CACHE_INTERVAL |
config.py |
torch.cuda.empty_cache() каждые 50 сохранений |
cudnn_benchmark |
runtime_gpu.py |
cuDNN autotune (полезно при фикс. размерах batch) |
| Chunked eval | eval.py |
Val обрабатывается батчами по eval_batch_size |
pin_memory=True |
cifar10_data.py |
Быстрая передача с CPU на GPU |