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

Population vram

12.4 Батчирование популяции на GPU (PopulationVRAMManager)

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

Два независимых контроллера VRAM:

Контроллер Что ограничивает
PopulationVRAMManager Сколько геномов (веса) одновременно на GPU
VRAMBatchController Размер val-батча изображений (eval_batch_size)

Режимы

Режим Условие Поведение
gpu_resident models + eval_activations ≤ 50% VRAM Все геномы на GPU на поколение
cpu_staged иначе Популяция на CPU; на GPU — чанки

Два бюджета при population_gpu_chunk_bytes

Когда задан population_gpu_chunk_bytes (например 2 GiB), чанк ограничивается раздельно:

  1. Бюджет весов — только параметры геномов в чанке:
\[ n_\text{models} = \left\lfloor \frac{\texttt{population\_gpu\_chunk\_bytes}}{M_\text{model}^\max} \right\rfloor \]
  1. Потолок пика forward — веса + активации одного (или parallel) forward, но не выше:
\[ M_\text{peak}(n) = n \cdot M_\text{model}^\max + \min(n, P) \cdot M_\text{act}^\max \le \texttt{vram\_usage\_threshold} \times M_\text{VRAM} - M_\text{fixed} \]

По умолчанию vram_usage_threshold = 0.80 (тот же порог, что у VRAMBatchController).

Итог: 2 GiB — это хранение весов в чанке; eval_batch_size=25000 может дать активации на несколько GiB — это учитывается во втором ограничении (до ~80% VRAM), а не вычитается из 2 GiB.

fixed_overhead = val cache на GPU + cuda_graph_memory_reserve_bytes + прочий memory_allocated.

Без population_gpu_chunk_bytes используется единый бюджет 40–50% VRAM (веса + активации вместе).


Жизненный цикл eval

flowchart TD
    prep[prepare_for_eval] --> staged{cpu_staged?}
    staged -->|yes| cpu[все genomes .cpu]
    staged -->|no| gpu[все genomes .cuda]
    cpu --> chunks[iter_eval_chunks]
    chunks --> load[load_chunk → .cuda]
    load --> eval[evaluate каждого индекса]
    eval --> unload[unload_chunk → .cpu + empty_cache]
    unload --> chunks

Пример: 10 000 моделей, 2 GiB на веса, forward до 80% VRAM

ExperimentConfig(
    population_size=10_000,
    adaptive_population_vram=True,
    population_gpu_chunk_bytes=2_000_000_000,  # только веса в чанке
    vram_usage_threshold=0.80,                  # потолок пика: веса+активации
    eval_batch_size=25000,                      # можно; активации — из 80% VRAM
    cache_val_on_gpu=True,
)

На GPU 16 GiB (без val cache в overhead для оценки):

  • chunk_model_budget = 2 GiB → сотни–тысячи минимальных геномов в чанке (зависит от \(M_\text{model}\)).
  • chunk_total_budget\(0.8 \times 16\) GiB − overhead ≈ 12+ GiB на пик чанка (веса в чанке + forward).
  • В логе: POP | CPU staged | models≤2.00 GB peak≤12.80 GB (80% VRAM−overhead) | N genomes/chunk.

VRAMBatchController по-прежнему может урезать eval_batch_size при реальном OOM или пике memory_reserved во время eval.


Связанные параметры

Параметр Default Роль
population_gpu_chunk_bytes None Лимит весов на GPU-чанк (байты)
vram_usage_threshold 0.80 Потолок пика чанка (веса + активации)
population_vram_resident_threshold 0.50 Порог режима gpu_resident
population_gpu_batch_frac_min/max 0.40 / 0.50 Единый бюджет, если chunk_bytes не задан
eval_batch_size 45000 Val-батч изображений (отдельный контроллер)
fitness_eval_parallel 1 Параллельные forward в чанке

См. §12.1 (VRAMBatchController), mathematics/variable-channels.md.