Closed bjuergens closed 3 years ago
doch kein memory leak.
Das sind halt die Sachen, die zwischen generation gespeichert werden. Insbesondere bei Dask werden viele Daten vom profiler gespeichert. Hier scheint eine lösung vorgestellt zu werden. Eine Alternative Lösung wäre es einfach in solchen Fällen MP zu nutzen.
logs wurden erstellt mit diesen diff:
(kann man einspielen mit git patch diff.txt
)
mit MP sieht das beispiel von oben so aus:
(insb. gibt es einen sehr leichten anstieg im main thread. Ich denke das kommt von deap.stat oderso. Ist aber mMn vernachlässigbar)
memory mit mp
memory mit dask
console log mit mp
$ mprof run --multiprocess neuro_evolution_ctrnn/train.py configurations/temp.json -p mp
mprof: Sampling memory every 0.1s
running new process
INFO: Input space: Box(0.0, 1.0, (16, 16, 3), float16)
INFO: Output space: Discrete(15)
INFO: Individual size for this experiment: 4532
INFO: writing checkpoints to: /home/chef/dev/project/NeuroEvolution-CTRNN_new/checkpoints
fitness
--------------------------------------------------------
gen nevals steps min avg std max
0 150 1650000 0 0.0557933 0.0351874 0.129
1 150 1650000 0.011 0.0766067 0.0222285 0.118
Time elapsed: 412.52638053894043
Output directory: /home/chef/dev/project/CTRNN_Simulation_Results/data/2021-01-21_10-42-16
Done
console log mit dask
$ mprof run --multiprocess neuro_evolution_ctrnn/train.py configurations/temp.json
mprof: Sampling memory every 0.1s
running new process
INFO: Input space: Box(0.0, 1.0, (16, 16, 3), float16)
INFO: Output space: Discrete(15)
INFO: Individual size for this experiment: 4532
INFO: writing checkpoints to: /home/chef/dev/project/NeuroEvolution-CTRNN_new/checkpoints
bokeh.server.util - WARNING - Host wildcard '*' will allow connections originating from multiple (or possibly all) hostnames or IPs. Use non-wildcard values to restrict access explicitly
INFO: Dask dashboard available at port: 8787
fitness
--------------------------------------------------------
gen nevals steps min avg std max
0 150 1650000 0 0.0557933 0.0351874 0.129
1 150 1650000 0.01 0.0886333 0.0229595 0.133
Time elapsed: 456.97147393226624
Output directory: /home/chef/dev/project/CTRNN_Simulation_Results/data/2021-01-21_10-54-48
distributed.nanny - WARNING - Worker process still alive after 3 seconds, killing
distributed.nanny - WARNING - Worker process still alive after 3 seconds, killing
distributed.nanny - WARNING - Worker process still alive after 3 seconds, killing
distributed.nanny - WARNING - Worker process still alive after 3 seconds, killing
distributed.nanny - WARNING - Worker process still alive after 3 seconds, killing
distributed.nanny - WARNING - Worker process still alive after 3 seconds, killing
distributed.nanny - WARNING - Worker process still alive after 3 seconds, killing
distributed.nanny - WARNING - Worker process still alive after 3 seconds, killing
Done
config für beide läufe
{
"environment": "procgen:procgen-heist-v0",
"random_seed": 123,
"number_generations": 2,
"optimizer": {
"type": "MU_ES",
"hof_size": 10,
"checkpoint_frequency": 0,
"initial_gene_range": 2,
"tournsize": 0,
"mu": 50,
"extra_from_hof": 1,
"lambda_": 100,
"mutpb": 0.8,
"efficiency_weight": 0.0,
"fix_seed_for_generation": true,
"strategy_parameter_per_gene": false
}, "brain": {
"type": "CTRNN",
"number_neurons": 30,
"neuron_activation": "relu",
"neuron_activation_inplace": false,
"use_bias": true,
"delta_t": 0.05,
"normalize_input": false,
"normalize_input_target": 2,
"optimize_state_boundaries": "global",
"clipping_range_max": 1.0,
"clipping_range_min": -1.0,
"optimize_y0": false,
"set_principle_diagonal_elements_of_W_negative": false,
"parameter_perturbations": 0.0,
"w_mask": "logarithmic",
"w_mask_param": 32,
"v_mask": "logarithmic",
"v_mask_param": 8,
"t_mask": "logarithmic",
"t_mask_param": 4
},
"episode_runner": {
"number_fitness_runs": 1000,
"reuse_env": true,
"max_steps_per_run": 10,
"keep_env_seed_fixed_during_generation": true,
"environment_attributes": {
"type": "ProcGenAttr",
"screen_size": 16
}
}
}
das gleiche wie eben, nur mit hundertmal so langen läufen, und einem hundertstel an fitnessruns pro individuum
memory mit mp:
memory mit dask
console log mit mp
$ mprof run --multiprocess neuro_evolution_ctrnn/train.py configurations/temp.json -p mp
mprof: Sampling memory every 0.1s
running new process
INFO: Input space: Box(0.0, 1.0, (16, 16, 3), float16)
INFO: Output space: Discrete(15)
INFO: Individual size for this experiment: 4532
INFO: writing checkpoints to: /home/chef/dev/project/NeuroEvolution-CTRNN_new/checkpoints
fitness
--------------------------------------------------------
gen nevals steps min avg std max
0 150 1500000 0 0.042 0.068576 0.3
1 150 1500000 0 0.074 0.0926858 0.3
Time elapsed: 170.12743020057678
Output directory: /home/chef/dev/project/CTRNN_Simulation_Results/data/2021-01-21_11-10-05
Done
console log mit dask
$ mprof run --multiprocess neuro_evolution_ctrnn/train.py configurations/temp.json
mprof: Sampling memory every 0.1s
running new process
INFO: Input space: Box(0.0, 1.0, (16, 16, 3), float16)
INFO: Output space: Discrete(15)
INFO: Individual size for this experiment: 4532
INFO: writing checkpoints to: /home/chef/dev/project/NeuroEvolution-CTRNN_new/checkpoints
bokeh.server.util - WARNING - Host wildcard '*' will allow connections originating from multiple (or possibly all) hostnames or IPs. Use non-wildcard values to restrict access explicitly
INFO: Dask dashboard available at port: 8787
fitness
--------------------------------------------------------
gen nevals steps min avg std max
0 150 1500000 0 0.042 0.068576 0.3
1 150 1500000 0 0.000666667 0.0081377 0.1
Time elapsed: 182.65517282485962
Output directory: /home/chef/dev/project/CTRNN_Simulation_Results/data/2021-01-21_11-06-36
Done
config für beide: wie oben, nur mit folgender Änderung
"episode_runner": {
"number_fitness_runs": 10,
"reuse_env": true,
"max_steps_per_run": 1000,
"keep_env_seed_fixed_during_generation": true,
"environment_attributes": {
"type": "ProcGenAttr",
"screen_size": 16
}
ich stelle folgende Vermutung auf:
Ich würde komplett auf MP gehen für procgen, wenn da nicht #50 wäre.
Hinweis: Als "quickfix" für das dask-memory problem habe ich die über weihnachten die lifetime der worker auf 15minuten gesetzt. Ich hatte erhofft, dass das das Problem löst, aber das war leider nicht so
hier ein test script, in dem dem einfach nur envs angelegt werden, ohne dass sonst irgendwas passiert: https://gist.github.com/bjuergens/baceb62a68c113a3ab770184629f2cb1
Ergebnisse mit MP
Ergebnisse mit sequence:
und das gleiche nochmal mit --gc-force (man achte insb. auch auf die laufzeit, die man an der x-achse ablesen kann)
mit MP und --gc-force
mit sequence und --gc-force
Außerdem habe ich das gleiche auch mit dask getestet. Aber die worker sind bereits bei 50 wiederholen abgeschmirt. Bei 150 wiederholungen, ist der ganze process kaputt gegangen.
Wobei ich anmerken muss, dass ich mir nicht 100% sicher bin, ob meine dask-implementierung hier korrekt ist.
problem ist "gelöst", in dem ich mp benutze anstatt dask für procgen experimente
Here is the memory consumption for a simple BipedalWalker-v3 over 100 generation, which very short evaluations per individual.
graphik was created with
--> We have a memory leak