          """
          if get_backend() != "nvidia":
              logger.debug("Backend is not Nvidia. Not updating batchsize requirements")
              return
          if self._detector.vram == 0 and self._aligner.vram == 0 and self._masker.vram == 0:
              logger.debug("Either detector, aligner or masker have no VRAM requirements. Not "
                           "updating batchsize requirements.")
              return
          stats = GPUStats().get_card_most_free()
          vram_free = int(stats["free"])
          if self._is_parallel:
              vram_required = (self._detector.vram + self._aligner.vram + self._masker.vram +
 
</s> remove         vram_required = (self._detector.vram +
                         self._aligner.vram +
                         self._masker.vram +
                         self._vram_buffer)
 </s> add  </s> remove             vram_required = (self._detector.vram + self._aligner.vram + self._masker.vram +
                             self._vram_buffer)
            batch_required = ((self._detector.vram_per_batch * self._detector.batchsize) +
                              (self._aligner.vram_per_batch * self._aligner.batchsize) +
                              (self._masker.vram_per_batch * self._masker.batchsize))
            plugin_required = vram_required + batch_required
 </s> add             batch_required = sum([plugin.vram_per_batch * plugin.batchsize
                                  for plugin in self._all_plugins])
            plugin_required = self._total_vram_required + batch_required </s> remove             logger.debug("Parallel processing discabled by amd")
 </s> add             logger.debug("Parallel processing disabled by amd") </s> remove         Sets the batchsize of the requested plugins based on their vram and
        vram_per_batch_requirements if the the configured batchsize requires more
 </s> add         Sets the batch size of the requested plugins based on their vram and
        vram_per_batch_requirements if the the configured batch size requires more </s> remove     def _launch_detector(self):
        """ Launch the face detector """
        logger.debug("Launching Detector")
        kwargs = dict(in_queue=self._queues["extract_detect_in"],
                      out_queue=self._queues["extract_align_in"])
        self._detector.initialize(**kwargs)
        self._detector.start()
        logger.debug("Launched Detector")

    def _launch_aligner(self):
        """ Launch the face aligner """
        logger.debug("Launching Aligner")
        kwargs = dict(in_queue=self._queues["extract_align_in"],
                      out_queue=self._queues["extract_mask_in"])
        self._aligner.initialize(**kwargs)
        self._aligner.start()
        logger.debug("Launched Aligner")

    def _launch_masker(self):
        """ Launch the face masker """
        logger.debug("Launching Masker")
        kwargs = dict(in_queue=self._queues["extract_mask_in"],
                      out_queue=self._queues["extract_mask_out"])
        self._masker.initialize(**kwargs)
        self._masker.start()
        logger.debug("Launched Masker")
 </s> add     def _launch_plugin(self, phase):
        """ Launch an extraction plugin """
        logger.debug("Launching %s plugin", phase)
        in_qname = "extract_{}_in".format(phase)
        if phase == self._final_phase:
            out_qname = "extract_{}_out".format(self._final_phase)
        else:
            next_phase = self._flow[self._flow.index(phase) + 1]
            out_qname = "extract_{}_in".format(next_phase)
        logger.debug("in_qname: %s, out_qname: %s", in_qname, out_qname)
        kwargs = dict(in_queue=self._queues[in_qname], out_queue=self._queues[out_qname])

        plugin = getattr(self, "_{}".format(phase))
        plugin.initialize(**kwargs)
        plugin.start()
        logger.debug("Launched %s plugin", phase)
        if sum([plugin.vram for plugin in self._all_plugins]) == 0:
            logger.debug("No plugins use VRAM. Not updating batchsize requirements.")
          """
          if get_backend() != "nvidia":
              logger.debug("Backend is not Nvidia. Not updating batchsize requirements")
              return
        if sum([plugin.vram for plugin in self._all_plugins]) == 0:
            logger.debug("No plugins use VRAM. Not updating batchsize requirements.")
        if sum([plugin.vram for plugin in self._all_plugins]) == 0:
            logger.debug("No plugins use VRAM. Not updating batchsize requirements.")
        if sum([plugin.vram for plugin in self._all_plugins]) == 0:
            logger.debug("No plugins use VRAM. Not updating batchsize requirements.")
              return
          stats = GPUStats().get_card_most_free()
          vram_free = int(stats["free"])
          if self._is_parallel:
              vram_required = (self._detector.vram + self._aligner.vram + self._masker.vram +
keep keep keep keep replace replace replace keep keep keep keep keep
 Smart Mask - Extract code review

- Lint simple_tests.py
- Only reformat alignments file if it exists otherwise change filename
- Update legacy alignments to new format at all stages
- faces_detect.Mask.from_dict - logging format fix
- convert.py fix otf for new pipeline
- cli.py - Add note that masks not used. Revert convert masks
- faces_detect.py - Revert non-extract code
- Add .p and .pickle extensions for serializer
- plugins/extract revert some changes
- scripts/fsmedia - Revert code changes
- Pipeline - cleanup
- Consistant alpha channel stripping (fixes single-process)
- Store landmarks as numpy array
- Code attribution
- Normalize feed face and reference face to 0.0 - 1.0 in convert
- Lock in mask VRAM sized
- Add documentation to plugin_loader
- Update alignments tool to work with new format 
plugins/extract/pipeline.py