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), чанк ограничивается раздельно:
- Бюджет весов — только параметры геномов в чанке:
- Потолок пика forward — веса + активации одного (или
parallel) forward, но не выше:
По умолчанию 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.