code: def set_schema(self):
      self.schema = KeyCheckerDict(
          {
              "models": KeyChecker(
                  ["trunk", "embedder"], essential=["trunk"]
              ),
              "loss_funcs": KeyChecker(["metric_loss"]),
              "mining_funcs": KeyChecker(
                  ["subset_batch_miner", "tuple_miner"],
                  warn_empty=False,
                  important=[],
              ),
              "loss_weights": KeyChecker(
                  self.loss_names,
                  warn_empty=False,
                  essential=self.loss_names,
              ),
              "optimizers": KeyChecker(
                  lambda s, d: c_f.append_map(
                      d["models"].keys + d["loss_funcs"].keys,
                      "_optimizer",
                  ),
                  important=c_f.append_map(
                      self.models.keys(), "_optimizer"
                  ),
              ),
              "lr_schedulers": KeyChecker(
                  lambda s, d: [
                      x + y
                      for y in self.allowed_lr_scheduler_key_suffixes.values()
                      for x in d["models"].keys + d["loss_funcs"].keys
                  ],
                  warn_empty=False,
                  important=[],
              ),
              "gradient_clippers": KeyChecker(
                  lambda s, d: c_f.append_map(
                      d["models"].keys + d["loss_funcs"].keys,
                      "_grad_clipper",
                  ),
                  warn_empty=False,
                  important=[],
              ),
          }
      )
      self.modify_schema()
  
imports: import torch
  import tqdm
  from ..utils import common_functions
  from ..utils import loss_tracker
  from ..utils.key_checker import KeyChecker, KeyCheckerDict
label_desc: Use image node_id 36 for calling the BaseTrainer obj's underlying member method code with example usage: obj.set_schema() without return types