Перейти к содержанию

Gpu

12.1 VRAM-контроллер

Реализация: cnn_neat/vram_batch.py

VRAMBatchController адаптирует eval_batch_size во время эволюции:

Алгоритм:

  1. После каждого поколения: used / total > thresholdbatch_size //= 2.
  2. OOM (torch.cuda.OutOfMemoryError) → batch_size //= 2, retry (до 4 попыток).
  3. Нижний предел: 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