neuroevolution-ai / NeuroEvolution-CTRNN_new

MIT License
3 stars 3 forks source link

memory leak #42

Closed bjuergens closed 3 years ago

bjuergens commented 3 years ago

Here is the memory consumption for a simple BipedalWalker-v3 over 100 generation, which very short evaluations per individual.

image

graphik was created with

mprof run --multiprocess neuro_evolution_ctrnn/train.py --configuration configurations/temp.json
mprof plot

--> We have a memory leak

bjuergens commented 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.

memory_dask.txt memory_mp.txt

logs wurden erstellt mit diesen diff:

diff.txt

(kann man einspielen mit git patch diff.txt)

mit MP sieht das beispiel von oben so aus:

image

(insb. gibt es einen sehr leichten anstieg im main thread. Ich denke das kommt von deap.stat oderso. Ist aber mMn vernachlässigbar)

bjuergens commented 3 years ago

https://stackoverflow.com/questions/35121659/python-del-not-freeing-all-the-memory/35121781#35121781

https://stackoverflow.com/questions/26545051/is-there-a-way-to-delete-created-variables-functions-etc-from-the-memory-of-th/49544890#49544890

bjuergens commented 3 years ago

memory mit mp

grafik

memory mit dask

grafik

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

    }
  }
}
bjuergens commented 3 years ago

das gleiche wie eben, nur mit hundertmal so langen läufen, und einem hundertstel an fitnessruns pro individuum

memory mit mp:

grafik

memory mit dask

grafik

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

    }
bjuergens commented 3 years ago

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

bjuergens commented 3 years ago

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

grafik

Ergebnisse mit sequence:

grafik

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

grafik

mit sequence und --gc-force

grafik

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.

bjuergens commented 3 years ago

problem ist "gelöst", in dem ich mp benutze anstatt dask für procgen experimente