class_docstr: Base class for all trainers - this base class implements the basic functions that we
  need for a trainer.
  
  The trainer needs to have the following functions:
      - step: takes in a batch of data and performs a step of training
      - loss: takes in a batch of data and returns the loss
      - compute_rewards: takes in a batch of data and returns the rewards
      - _build_models_and_tokenizer: builds the models and tokenizer
      - _build_dataset: builds the dataset
  Each user is expected to implement their own trainer class that inherits from this base
  if they want to use a new training algorithm.
code: def step(self, *args):
      raise NotImplementedError("Not implemented")
  
imports: from huggingface_hub import PyTorchModelHubMixin
label_desc: Use image node_id 2 for calling the BaseTrainer obj's underlying member method code with example usage: obj.step() without return types