From 79c5e10b2596781ac0b9aef96ec202a50e725ac2 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 11 Feb 2025 16:31:18 +0100 Subject: [PATCH 1/4] Move adaptivity_cpu_time from export output to metrics logging output --- micro_manager/adaptivity/global_adaptivity.py | 7 +++-- micro_manager/micro_manager.py | 28 +++---------------- 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/micro_manager/adaptivity/global_adaptivity.py b/micro_manager/adaptivity/global_adaptivity.py index 83f8a77..ccb4cc7 100644 --- a/micro_manager/adaptivity/global_adaptivity.py +++ b/micro_manager/adaptivity/global_adaptivity.py @@ -179,7 +179,7 @@ def get_full_field_micro_output(self, micro_output: list) -> list: return micro_sims_output - def log_metrics(self, n: int) -> None: + def log_metrics(self, n: int, adaptivity_cpu_time) -> None: """ Log metrics for global adaptivity. @@ -187,17 +187,20 @@ def log_metrics(self, n: int) -> None: ---------- n : int Time step count at which the metrics are logged + adaptivity_cpu_time : float + CPU time taken for adaptivity calculation """ global_active_sims = np.count_nonzero(self._is_sim_active) global_inactive_sims = np.count_nonzero(self._is_sim_active == False) self._metrics_logger.log_info_one_rank( - "{},{},{},{},{}".format( + "{},{},{},{},{},{}".format( n, np.mean(global_active_sims), np.mean(global_inactive_sims), np.max(global_active_sims), np.max(global_inactive_sims), + adaptivity_cpu_time, ) ) diff --git a/micro_manager/micro_manager.py b/micro_manager/micro_manager.py index e5bfe5b..157b6b9 100644 --- a/micro_manager/micro_manager.py +++ b/micro_manager/micro_manager.py @@ -116,7 +116,6 @@ def __init__(self, config_file: str) -> None: self._adaptivity_in_every_implicit_step = ( self._config.is_adaptivity_required_in_every_implicit_iteration() ) - self._micro_sims_active_steps = None self._adaptivity_output_n = self._config.get_adaptivity_output_n() self._output_adaptivity_cpu_time = self._config.output_adaptivity_cpu_time() @@ -204,8 +203,6 @@ def solve(self) -> None: if self._output_adaptivity_cpu_time: adaptivity_cpu_time += adaptivity_time - for i in range(self._local_number_of_sims): - micro_sims_output[i]["adaptivity_cpu_time"] = adaptivity_cpu_time # Check if more than a certain percentage of the micro simulations have crashed and terminate if threshold is exceeded if self._interpolate_crashed_sims: @@ -263,7 +260,7 @@ def solve(self) -> None: and n % self._adaptivity_output_n == 0 and self._rank == 0 ): - self._adaptivity_controller.log_metrics(n) + self._adaptivity_controller.log_metrics(n, adaptivity_cpu_time) self._logger.log_info_one_rank("Time window {} converged.".format(n)) @@ -704,26 +701,7 @@ def _solve_micro_simulations_with_adaptivity( tuple A tuple of micro_sims_output (list of Dicts) and adaptivity computation CPU time. """ - adaptivity_cpu_time = 0.0 - - if self._adaptivity_in_every_implicit_step: - start_time = time.process_time() - self._adaptivity_controller.compute_adaptivity( - dt, - self._micro_sims, - self._data_for_adaptivity, - ) - end_time = time.process_time() - - adaptivity_cpu_time = end_time - start_time - - active_sim_ids = self._adaptivity_controller.get_active_sim_ids() - - for active_id in active_sim_ids: - self._micro_sims_active_steps[active_id] += 1 - active_sim_ids = self._adaptivity_controller.get_active_sim_ids() - inactive_sim_ids = self._adaptivity_controller.get_inactive_sim_ids() micro_sims_output = [0] * self._local_number_of_sims @@ -798,7 +776,9 @@ def _solve_micro_simulations_with_adaptivity( ) end_time = time.process_time() - adaptivity_cpu_time += end_time - start_time + adaptivity_cpu_time = end_time - start_time + + inactive_sim_ids = self._adaptivity_controller.get_inactive_sim_ids() # Resolve micro sim output data for inactive simulations for inactive_id in inactive_sim_ids: From 9fcfca959614f8f013e7643db3e046d4ab5b1e9f Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 11 Feb 2025 18:52:05 +0100 Subject: [PATCH 2/4] Remove all instances of exporting adaptivity cpu time --- docs/configuration.md | 3 -- examples/precice-config-adaptivity.xml | 3 -- micro_manager/config.py | 41 ------------------- micro_manager/micro_manager.py | 4 +- .../test_unit_cube/precice-config.xml | 3 -- 5 files changed, 1 insertion(+), 53 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 325261e..f0fbeab 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -120,7 +120,6 @@ Parameter | Description `refining_constant` | Refining constant $$ C_r $$, set as $$ 0 =< C_r < 1 $$. `every_implicit_iteration` | If True, adaptivity is calculated in every implicit iteration.
If False, adaptivity is calculated once at the start of the time window and then reused in every implicit time iteration. `similarity_measure`| Similarity measure to be used for adaptivity. Can be either `L1`, `L2`, `L1rel` or `L2rel`. By default, `L1` is used. The `rel` variants calculate the respective relative norms. This parameter is *optional*. -`output_cpu_time` | Write CPU time of the adaptivity computation to preCICE, to be exported. This parameter is *optional*. The primary tuning parameters for adaptivity are the history parameter $$ \Lambda $$, the coarsening constant $$ C_c $$, and the refining constant $$ C_r $$. Their effects can be interpreted as: @@ -171,8 +170,6 @@ The Micro Manager uses the output functionality of preCICE, hence these data set ``` -If the parameter `output_cpu_time` in `adaptivity_settings` is set to `True`, a scalar data field `adaptivity_cpu_time` needs to be added in the same way as described above. - ## Interpolate a crashed micro simulation If the optional dependency `sklearn` is installed, the Micro Manager will derive the output of a crashed micro simulation by interpolating outputs from similar simulations. To enable this, set diff --git a/examples/precice-config-adaptivity.xml b/examples/precice-config-adaptivity.xml index eddc16e..57b9fd4 100644 --- a/examples/precice-config-adaptivity.xml +++ b/examples/precice-config-adaptivity.xml @@ -13,7 +13,6 @@ - @@ -23,7 +22,6 @@ - @@ -43,7 +41,6 @@ - diff --git a/micro_manager/config.py b/micro_manager/config.py index 185152f..e691688 100644 --- a/micro_manager/config.py +++ b/micro_manager/config.py @@ -50,8 +50,6 @@ def __init__(self, config_file_name): self._adaptivity_every_implicit_iteration = False self._adaptivity_similarity_measure = "L1" self._adaptivity_output_n = 1 - self._adaptivity_output_cpu_time = False - self._adaptivity_output_mem_usage = False # Snapshot information self._parameter_file_name = None @@ -246,34 +244,6 @@ def read_json_micro_manager(self): self._write_data_names.append("active_state") self._write_data_names.append("active_steps") - try: - if ( - self._data["simulation_params"]["adaptivity_settings"][ - "output_cpu_time" - ] - == "True" - ): - self._adaptivity_output_cpu_time = True - self._write_data_names.append("adaptivity_cpu_time") - except BaseException: - self._logger.log_info_one_rank( - "Micro Manager will not output CPU time of the adaptivity computation." - ) - - try: - if ( - self._data["simulation_params"]["adaptivity_settings"][ - "output_mem_usage" - ] - == "True" - ): - self._adaptivity_output_mem_usage = True - self._write_data_names.append("adaptivity_mem_usage") - except BaseException: - self._logger.log_info_one_rank( - "Micro Manager will not output CPU time of the adaptivity computation." - ) - if "interpolate_crash" in self._data["simulation_params"]: if self._data["simulation_params"]["interpolate_crash"] == "True": self._interpolate_crash = True @@ -547,17 +517,6 @@ def is_adaptivity_required_in_every_implicit_iteration(self): """ return self._adaptivity_every_implicit_iteration - def output_adaptivity_cpu_time(self): - """ - Check if CPU time of the adaptivity computation needs to be output. - - Returns - ------- - adaptivity_cpu_time : bool - True if CPU time of the adaptivity computation needs to be output, False otherwise. - """ - return self._adaptivity_output_cpu_time - def get_micro_dt(self): """ Get the size of the micro time window. diff --git a/micro_manager/micro_manager.py b/micro_manager/micro_manager.py index 157b6b9..6d21531 100644 --- a/micro_manager/micro_manager.py +++ b/micro_manager/micro_manager.py @@ -118,7 +118,6 @@ def __init__(self, config_file: str) -> None: ) self._adaptivity_output_n = self._config.get_adaptivity_output_n() - self._output_adaptivity_cpu_time = self._config.output_adaptivity_cpu_time() # Define the preCICE Participant self._participant = precice.Participant( @@ -201,8 +200,7 @@ def solve(self) -> None: micro_sims_output, adaptivity_time = micro_sim_solve(micro_sims_input, dt) - if self._output_adaptivity_cpu_time: - adaptivity_cpu_time += adaptivity_time + adaptivity_cpu_time += adaptivity_time # Check if more than a certain percentage of the micro simulations have crashed and terminate if threshold is exceeded if self._interpolate_crashed_sims: diff --git a/tests/integration/test_unit_cube/precice-config.xml b/tests/integration/test_unit_cube/precice-config.xml index 5bccfe8..23dafa4 100644 --- a/tests/integration/test_unit_cube/precice-config.xml +++ b/tests/integration/test_unit_cube/precice-config.xml @@ -9,7 +9,6 @@ - @@ -18,7 +17,6 @@ - @@ -36,7 +34,6 @@ - From de8c5a47e555d179d907aa660245621de4943e9b Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 11 Feb 2025 20:24:03 +0100 Subject: [PATCH 3/4] Add adaptivity_cpu_time output to local adaptivity metrics too --- micro_manager/adaptivity/global_adaptivity.py | 2 +- micro_manager/adaptivity/local_adaptivity.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/micro_manager/adaptivity/global_adaptivity.py b/micro_manager/adaptivity/global_adaptivity.py index ccb4cc7..513b480 100644 --- a/micro_manager/adaptivity/global_adaptivity.py +++ b/micro_manager/adaptivity/global_adaptivity.py @@ -179,7 +179,7 @@ def get_full_field_micro_output(self, micro_output: list) -> list: return micro_sims_output - def log_metrics(self, n: int, adaptivity_cpu_time) -> None: + def log_metrics(self, n: int, adaptivity_cpu_time: float) -> None: """ Log metrics for global adaptivity. diff --git a/micro_manager/adaptivity/local_adaptivity.py b/micro_manager/adaptivity/local_adaptivity.py index 5a11916..9c48354 100644 --- a/micro_manager/adaptivity/local_adaptivity.py +++ b/micro_manager/adaptivity/local_adaptivity.py @@ -138,7 +138,7 @@ def get_full_field_micro_output(self, micro_output: list) -> list: return micro_sims_output - def log_metrics(self, n: int) -> None: + def log_metrics(self, n: int, adaptivity_cpu_time: float) -> None: """ Log metrics for local adaptivity. @@ -146,6 +146,8 @@ def log_metrics(self, n: int) -> None: ---------- n : int Current time step + adaptivity_cpu_time : float + CPU time taken for adaptivity calculation """ # MPI Gather is necessary as local adaptivity only stores local data local_active_sims = np.count_nonzero(self._is_sim_active) @@ -155,12 +157,13 @@ def log_metrics(self, n: int) -> None: global_inactive_sims = self._comm.gather(local_inactive_sims) self._metrics_logger.log_info_one_rank( - "{},{},{},{},{}".format( + "{},{},{},{},{},{}".format( n, np.mean(global_active_sims), np.mean(global_inactive_sims), np.max(global_active_sims), np.max(global_inactive_sims), + adaptivity_cpu_time, ) ) From 323b9e7cd3a74b18744699ae9c8afa41ca0d3fcc Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 11 Feb 2025 20:36:53 +0100 Subject: [PATCH 4/4] Add Changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c33c54..181632e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## latest +- Move adaptivity CPU time output from preCICE export to metrics logging https://github.com/precice/micro-manager/pull/149 - Fix bug in the domain decomposition which was returning incorrect bounding box limits for the decomposition of `[2, 2, 1]` and similar https://github.com/precice/micro-manager/pull/146 - Fix bug in calling of the adaptivity computation for explicit coupling scenarios https://github.com/precice/micro-manager/pull/145 - Fix bug in handling of vector data returned by the MicroSimulation `solve()` method, for scenarios with adaptivity https://github.com/precice/micro-manager/pull/143