class_docstr: From: https://github.com/facebookresearch/barlowtwins/blob/main/main.py#L218
  
  Main differences:
      - we add a `exclude_bias_and_norm` parameter to filter out biases from the LARS adaptive LR
      - we remove the filter on weight decay as it is not needed in VISSL. See `get_optimizer_param_groups`
code: def step(self):
      for g in self.param_groups:
          for p in g["params"]:
              dp = p.grad
  
              if dp is None:
                  continue
  
              dp = dp.add(p, alpha=g["weight_decay"])
  
              if not g["exclude"] or not self._exclude_bias_and_norm(p):
                  param_norm = torch.norm(p)
                  update_norm = torch.norm(dp)
  
                  one = torch.ones_like(param_norm)
                  q = torch.where(
                      param_norm > 0.0,
                      torch.where(
                          update_norm > 0,
                          (g["eta"] * param_norm / update_norm),
                          one,
                      ),
                      one,
                  )
                  dp = dp.mul(q)
  
              param_state = self.state[p]
              if "mu" not in param_state:
                  param_state["mu"] = torch.zeros_like(p)
              mu = param_state["mu"]
              mu.mul_(g["momentum"]).add_(dp)
  
              p.add_(mu, alpha=-g["lr"])
  
file_path: vissl/vissl/optimizers/lars.py
imports: from typing import Any, Dict
  import torch
  from classy_vision.optim import ClassyOptimizer, register_optimizer
  from torch import optim
label_desc: Use image node_id 3 for calling the _LARS obj's underlying member method code with example usage: obj.step() without return types