class_docstr: **Base class for Variational Inference**
  
  Communicates Operator, Approximation and Test Function to build Objective Function
  
  Parameters
  ----------
  op : Operator class    #:class:`~pymc.variational.operators`
  approx : Approximation class or instance    #:class:`~pymc.variational.approximations`
  tf : TestFunction instance  #?
  model : Model
      PyMC Model
  kwargs : kwargs passed to :class:`Operator` #:class:`~pymc.variational.operators`, optional
code: def run_profiling(self, n=1000, score=None, **kwargs):
      score = self._maybe_score(score)
      fn_kwargs = kwargs.pop("fn_kwargs", dict())
      fn_kwargs["profile"] = True
      step_func = self.objective.step_function(
          score=score, fn_kwargs=fn_kwargs, **kwargs
      )
      progress = progress_bar(range(n))
      try:
          for _ in progress:
              step_func()
      except KeyboardInterrupt:
          pass
      return step_func.profile
  
imports: import collections
  import logging
  import warnings
  import numpy
  from fastprogress.fastprogress import progress_bar
  import pymc
  from pymc.variational import test_functions
  from pymc.variational.approximations import Empirical, FullRank, MeanField
  from pymc.variational.operators import KL, KSD
label_desc: Use image node_id 3 for calling the Inference obj's underlying member method code with example usage: obj.run_profiling(n, score) and returns: step_func