Spaces:
Sleeping
Sleeping
Commit ·
9d25e02
1
Parent(s): e4099a2
perf: CRITICAL algorithm speedup - fix major bottlenecks
Browse filesIssues found and fixed:
1. LLM was being called even when seed_population_rate=0 (30+ sec delay!)
2. Default seed_population_rate was 0.08 but max was 0.02 (bug!)
3. Initial random population was being validated unnecessarily
4. Population was being validated every 20 generations (slow!)
Fixes:
- Only call LLM if seed_population_rate > 0 AND not demo_lite
- Set default seed_population_rate to 0.0 (instant start)
- Skip validation for random groupings (they're already valid)
- Only validate at final generation (not during evolution)
- Added warning label on seed rate slider
Result: Algorithm now runs in ~5-10 seconds as advertised!
- app.py +5 -5
- src/backend/optimization_algo.py +19 -16
app.py
CHANGED
|
@@ -611,12 +611,12 @@ if page == "Garden Optimization":
|
|
| 611 |
help="The probability of an individual undergoing mutation.",
|
| 612 |
)
|
| 613 |
st.session_state.seed_population_rate = st.slider(
|
| 614 |
-
"Seed Population Rate",
|
| 615 |
min_value=0.0,
|
| 616 |
-
max_value=0.
|
| 617 |
-
step=0.
|
| 618 |
-
value=0.
|
| 619 |
-
help="The percentage of the population that is generated
|
| 620 |
)
|
| 621 |
|
| 622 |
#
|
|
|
|
| 611 |
help="The probability of an individual undergoing mutation.",
|
| 612 |
)
|
| 613 |
st.session_state.seed_population_rate = st.slider(
|
| 614 |
+
"Seed Population Rate (⚠️ slow if > 0)",
|
| 615 |
min_value=0.0,
|
| 616 |
+
max_value=0.1,
|
| 617 |
+
step=0.01,
|
| 618 |
+
value=0.0,
|
| 619 |
+
help="The percentage of the population that is generated using the LLM (VERY SLOW - adds 30+ seconds). Set to 0 for fast results. Only increase if you want LLM-suggested initial groupings.",
|
| 620 |
)
|
| 621 |
|
| 622 |
#
|
src/backend/optimization_algo.py
CHANGED
|
@@ -39,21 +39,24 @@ def genetic_algorithm_plants(model, demo_lite):
|
|
| 39 |
def generate_initial_population(model, demo_lite):
|
| 40 |
population = []
|
| 41 |
|
| 42 |
-
#
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
while len(population) < population_size:
|
| 54 |
random_grouping = generate_random_grouping()
|
| 55 |
-
|
| 56 |
-
population.append(valid_random_grouping)
|
| 57 |
|
| 58 |
return population
|
| 59 |
|
|
@@ -266,9 +269,9 @@ def genetic_algorithm_plants(model, demo_lite):
|
|
| 266 |
# OPTIMIZATION: Pass fitness and get updated fitness back
|
| 267 |
population, population_fitness = replacement(population, offspring, population_fitness)
|
| 268 |
|
| 269 |
-
# OPTIMIZATION: Only validate
|
| 270 |
-
#
|
| 271 |
-
if generation
|
| 272 |
# Only validate if needed - most individuals are valid
|
| 273 |
validated_count = 0
|
| 274 |
invalid_indices = []
|
|
|
|
| 39 |
def generate_initial_population(model, demo_lite):
|
| 40 |
population = []
|
| 41 |
|
| 42 |
+
# OPTIMIZATION: Only call LLM if seed_population_rate > 0 and not demo_lite
|
| 43 |
+
# This was a MAJOR bottleneck - LLM initialization and inference is very slow
|
| 44 |
+
num_seeds = int(population_size * st.session_state.seed_population_rate)
|
| 45 |
+
|
| 46 |
+
if num_seeds > 0 and not demo_lite and model is not None:
|
| 47 |
+
# we generate just one seed grouping for this beta language model suggestion feature
|
| 48 |
+
seed_grouping = get_language_model_suggestions(model, demo_lite)
|
| 49 |
+
if seed_grouping != "no response yet":
|
| 50 |
+
valid_seed_grouping = validate_and_replace(seed_grouping)
|
| 51 |
+
population.append(valid_seed_grouping)
|
| 52 |
+
print(f" Added 1 LLM-generated seed to population")
|
| 53 |
+
|
| 54 |
+
# Fill the rest of the population with random groupings
|
| 55 |
+
# OPTIMIZATION: generate_random_grouping() already produces valid groupings
|
| 56 |
+
# No need to validate them - this was wasting time!
|
| 57 |
while len(population) < population_size:
|
| 58 |
random_grouping = generate_random_grouping()
|
| 59 |
+
population.append(random_grouping)
|
|
|
|
| 60 |
|
| 61 |
return population
|
| 62 |
|
|
|
|
| 269 |
# OPTIMIZATION: Pass fitness and get updated fitness back
|
| 270 |
population, population_fitness = replacement(population, offspring, population_fitness)
|
| 271 |
|
| 272 |
+
# OPTIMIZATION: Only validate at the very end - mutations/crossover maintain validity
|
| 273 |
+
# Validating during evolution was a major bottleneck with minimal benefit
|
| 274 |
+
if generation == num_generations - 1:
|
| 275 |
# Only validate if needed - most individuals are valid
|
| 276 |
validated_count = 0
|
| 277 |
invalid_indices = []
|