code: def pre_op(self, params):
      max_cuda_used_pre_op = self.mem_monitor.finish()
      # record max cuda overall data for prev OP.
      self._memstats.record_max_cuda_overall_data(max_cuda_used_pre_op)
      # record max cuda non model data for prev OP.
      self._memstats.calc_max_cuda_non_model_data()
  
      self._allocate_params_on_cuda(params)
      # record max cuda  model data for current OP
      self.record_model_data_volume(params)
  
      self.mem_monitor.start()
      self._memstats.increase_preop_step(params)
  
imports: from contextlib import contextmanager
  from enum import Enum
  from functools import partial
  from typing import List
  import torch
  from colossalai.legacy.zero.gemini.tensor_utils import alloc_storage, free_storage
  from colossalai.tensor.param_op_hook import ColoParamOpHook
  from colossalai.zero.gemini.memory_tracer import MemStats, SyncCudaMemoryMonitor
label_desc: Use image node_id 5 for calling the ParamMemTracerHook obj's underlying member method code with example usage: obj.pre_op(params) without return types