class_docstr: Class that defines the methods necessary to hook into process.
class_docstr_tok: ["Class","that","defines","the","methods","necessary","to","hook","into","process","."]
code: def on_eval_end(self, trainer, progress_tracker, save_path):
      optimizer_config = {}
      for index, group in enumerate(trainer.optimizer.param_groups):
          for key in group:
              if "param" not in key:
                  optimizer_config[
                      f"param_group_{index}_{key}"
                  ] = group[key]
  
      self.aim_run["optimizer_config"] = self.normalize_config(
          optimizer_config
      )
  
      self.aim_track(progress_tracker)
  
file_path: ludwig/ludwig/contribs/aim.py
imports: import json
  import logging
  from ludwig.api_annotations import PublicAPI
  from ludwig.callbacks import Callback
  from ludwig.utils.data_utils import NumpyEncoder
  from ludwig.utils.package_utils import LazyLoader
label_desc: Use image node_id 7 for calling the AimCallback obj's underlying member method code with example usage: obj.on_eval_end(trainer, progress_tracker, save_path) without return types