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

Цикл эволюции (2026)

cnn_neat.evolution_loop.run_evolution оркестрирует кэши, GD, cone и Studio. Псевдокод отражает текущий код, не только классический NEAT.

Вход: ExperimentConfig cfg
  device ← configure_gpu_for_training(cfg)   # или CPU + periodic_gd_device=cuda
  set_seed(cfg.seed)
  val / screen loaders, GPUValCache
  vram_ctrl ← VRAMBatchController(cfg)
  pop_vram ← PopulationVRAMManager(cfg)
  neat ← create_evolver(cfg)
  cone ← BreedingConeService(...) если breeding_cone_enabled
  hash_cache ← ForwardActivationCache(...) если fitness_forward_hash_cache_enabled
  write_run_meta; write_studio_status

  пока gen < num_generations (или не stagnation):
    eval_cfg ← replace(cfg, eval_batch_size=vram_ctrl.current)

    # --- Fitness ---
    если planned hash-cache:
      plan_population_misses + execute_planned_population
    иначе если tiered:
      evaluate_population_fitness_tiered(+ screen_cache / hash_cache)
    иначе:
      evaluate_population_fitness
    neat.set_fitness_scores(...)
    если dynamic_population_enabled:
      pop ← occupancy (max(VRAM, cache) **этого** гена, цель ~60–70%, рост ≤×1.2)
      если cache уже держал ≥ cache_min и occupancy жмёт pop ниже cache_min:
        выключить hash-cache, pop остаётся и растёт occupancy до naive_max;
        seed 8 < 10 сам по себе кэш не выключает;
        CUDA OOM сначала режет pop и повторяет с кешем; drop — только на min;
        genome-stagnation patience не пересчитывается (бюджет геномов)
    stagn += 1 поколение или N full-eval геномов (`stagnation_unit`)

    # --- Periodic GD ---
    если should_run_periodic_gd:
      park forward-cache и spill train cache
      run_periodic_gd_on_population (device может быть cuda при CPU-eval)
      selective invalidate Merkle maps; restore never-GD
      cone.wipe + warmup

    # --- Elite refinement (опционально) ---
    если should_run_elite_refinement:
      select_elites_with_gradient_refinement

    # --- Размножение ---
    если dual_track после первого GD:
      neat.evolve_dual_track(...)
    иначе если cone:
      serve ← cone.serve(); neat.evolve_with_cone(serve)
    иначе:
      neat.evolve(elites)
    reconcile hash-cache metadata-only (без второго forward)

    build_generation_summary; archive shard; dashboard; studio_status
    vram_ctrl.maybe_shrink; optional empty_cuda_cache
    on_generation_end(record)
    если stagnation_patience: break

  save_final_run_report

Callback on_generation_end(record) — live dashboard study и Studio. Record содержит best_* метрики, timing_*, флаги periodic_gd_applied, elite_refinement_applied, размеры кэша.

Цикл поколения

Cone prefetch на CPU параллельно GPU-eval; GD паркует кэш.