code: def _unpack_attributes(
      module_summaries: Dict[str, ModuleSummary],
      unpacked_attribs: Dict[str, List[str]],
      col_widths: Dict[str, int],
      human_readable_nums: bool = True,
      stop_attr: Optional[List[str]] = None,
  ) -> None:
      """
      Unpack/flatten recursive module_summaries into table columns and store in unpacked_attribs.
      Also, populate col_widths (with max column width).
  
      Args:
          module_summaries: dict of module summaries
          unpacked_attribs: collects unpacked/flattened columns
          col_widths: tracks max table width for each column
          human_readable_nums: human readable nums (e.g. 1.2 K for 1234)
          stop_attr: a list of attributes that we stop from adding to the table,
          i.e. exclude from _ATTRIBS
      """
  
      if not module_summaries:
          return
  
      for module_summary in module_summaries.values():
          for attrib in _ATTRIBS:
              if stop_attr is not None and attrib in stop_attr:
                  continue
  
              # Convert attribute value to string appropriately
              attrib_val = getattr(module_summary, attrib)
              if isinstance(attrib_val, bool):
                  attrib_val = "Yes" if attrib_val else "No"
              elif (
                  isinstance(attrib_val, int)
                  and attrib in _FLOP_ATTRIBS
              ):
                  if attrib_val < 0:
                      attrib_val = ""
                  else:
                      attrib_val = (
                          _get_human_readable_count(
                              attrib_val, labels=_PARAMETER_FLOPS_UNITS
                          )
                          if human_readable_nums
                          else str(attrib_val)
                      )
              elif isinstance(attrib_val, int):
                  attrib_val = (
                      _get_human_readable_count(attrib_val)
                      if human_readable_nums
                      else str(attrib_val)
                  )
              elif isinstance(attrib_val, float):
                  attrib_val = f"{attrib_val:.10f}"
              elif isinstance(attrib_val, list):
                  attrib_val = str(attrib_val)
              elif attrib_val is None:
                  attrib_val = ""
  
              # Store converted attribute value, track max column width
              unpacked_attribs[attrib].append(attrib_val)
              col_widths[attrib] = max(
                  len(_ATTRIB_TO_COL_HEADER[attrib]),
                  len(attrib_val),
                  col_widths[attrib],
              )
          # Recurse
          _unpack_attributes(
              module_summary.submodule_summaries,
              unpacked_attribs,
              col_widths,
              human_readable_nums,
              stop_attr,
          )
  
imports: import copy
  import math
  import warnings
  from collections import defaultdict, deque
  from dataclasses import dataclass, field
  from enum import Enum
  from time import perf_counter
  from typing import Any, Callable, DefaultDict, Deque, Dict, List, MutableMapping, Optional, Tuple, Union
  import torch
  from torch.nn.parameter import UninitializedParameter
  from torch.utils._pytree import PyTree, tree_flatten
  from torch.utils.hooks import RemovableHandle
  from torchtnt.utils.version import is_torch_version_geq_1_13
  from typing_extensions import Literal
label_desc: Use image node_id 9 for calling a global function with example usage: _unpack_attributes(module_summaries, unpacked_attribs, col_widths, human_readable_nums, stop_attr) without return types