                     "\n1) Close any other application that is using your GPU (web browsers are "
                     "particularly bad for this)."
                     "\n2) Lower the batchsize (the amount of images fed into the model each "
                     "iteration)."
                     "\n3) Try Memory Saving Gradients and/or Ping Pong Training."
                     "\n4) Use a more lightweight model, or select the model's 'LowMem' option "
                     "(in config) if it has one.")
              raise FaceswapError(msg) from err
          loss = loss if isinstance(loss, list) else [loss]
          return loss
 
</s> remove         return Adam(**opt_kwargs)
 </s> add         return Adam(**opt_kwargs, cpu_mode=self.optimizer_savings) </s> remove                               "help": "Trades off VRAM useage against computation time. Can fit "
 </s> add                               "help": "Trades off VRAM usage against computation time. Can fit " </s> remove         argument_list.append({"opts": ("-pp", "--ping-pong"),
                              "action": "store_true",
                              "dest": "pingpong",
                              "default": False,
                              "help": "Enable ping pong training. Trains one side at a time, "
                                      "switching sides at each save iteration. Training will take "
                                      "2 to 4 times longer, with about a 30%%-50%% reduction in "
                                      "VRAM useage. NB: Preview won't show until both sides have "
                                      "been trained once."})
 </s> add 
                   "\n3) Try 'Memory Saving Gradients' and/or 'Optimizer Savings' and/or 'Ping "
                   "Pong Training'."
                     "\n1) Close any other application that is using your GPU (web browsers are "
                     "particularly bad for this)."
                     "\n2) Lower the batchsize (the amount of images fed into the model each "
                     "iteration)."
                   "\n3) Try 'Memory Saving Gradients' and/or 'Optimizer Savings' and/or 'Ping "
                   "Pong Training'."
                     "\n4) Use a more lightweight model, or select the model's 'LowMem' option "
                     "(in config) if it has one.")
              raise FaceswapError(msg) from err
          loss = loss if isinstance(loss, list) else [loss]
          return loss
keep keep keep keep replace keep keep keep keep keep
 Training improvements

Add Optimizer Savings option to offload some optimizer calculations to the CPU
Add output_shape to NNMeta class for referencing when building models 
plugins/train/trainer/_base.py