


import argparse
import os
import shutil
from pathlib import Path

import onnx
import torch
from packaging import version
from torch.onnx import export

from diffusers import OnnxRuntimeModel, OnnxStableDiffusionPipeline, StableDiffusionPipeline


lowerCAmelCase     :   List[str]						     =  version.parse(version.parse(torch.__version__).base_version) < version.parse('1.11')

def    A_  (							a					,   a					,   a					,   a					,   a					,   a					,   a					,   a=False					,   ):

      """simple docstring"""



      output_path.parent.mkdir(parents=a					,   exist_ok=a  )
      # PyTorch deprecated the `enable_onnx_checker` and `use_external_data_format` arguments in v1.11,
      # so we check the torch version for backwards compatibility
      if is_torch_less_than_1_11:
            export(
                a					,   a					,   f=output_path.as_posix()					,   input_names=a					,   output_names=a					,   dynamic_axes=a					,   do_constant_folding=a					,   use_external_data_format=a					,   enable_onnx_checker=a					,   opset_version=a					,   )
      else:
            export(
                a					,   a					,   f=output_path.as_posix()					,   input_names=a					,   output_names=a					,   dynamic_axes=a					,   do_constant_folding=a					,   opset_version=a					,   )

@torch.no_grad()
def    A_  (							a					,   a					,   a					,   a = False  ):

      """simple docstring"""



      SCREAMING_SNAKE_CASE_				:  str           =     torch.floataa if fpaa else torch.floataa
      if fpaa and torch.cuda.is_available():
            SCREAMING_SNAKE_CASE_				:  List[Any]           =     'cuda'
      elif fpaa and not torch.cuda.is_available():
            raise ValueError('`float16` model export is only supported on GPUs with CUDA'  )
      else:
            SCREAMING_SNAKE_CASE_				:  List[str]           =     'cpu'
      SCREAMING_SNAKE_CASE_				:  int           =     StableDiffusionPipeline.from_pretrained(a					,   torch_dtype=a  ).to(a  )
      SCREAMING_SNAKE_CASE_				:  Optional[int]           =     Path(a  )

      # TEXT ENCODER
      SCREAMING_SNAKE_CASE_				:  List[Any]           =     pipeline.text_encoder.config.max_position_embeddings
      SCREAMING_SNAKE_CASE_				:  Optional[int]           =     pipeline.text_encoder.config.hidden_size
      SCREAMING_SNAKE_CASE_				:  Dict           =     pipeline.tokenizer(
          'A sample prompt'					,   padding='max_length'					,   max_length=pipeline.tokenizer.model_max_length					,   truncation=a					,   return_tensors='pt'					,   )
      onnx_export(
          pipeline.text_encoder					,   model_args=(text_input.input_ids.to(device=a					,   dtype=torch.intaa  ))					,   output_path=output_path / 'text_encoder' / 'model.onnx'					,   ordered_input_names=['input_ids']					,   output_names=['last_hidden_state', 'pooler_output']					,   dynamic_axes={
              'input_ids': {0: 'batch', 1: 'sequence'},
          }					,   opset=a					,   )
      del pipeline.text_encoder

      # UNET
      SCREAMING_SNAKE_CASE_				:  int           =     pipeline.unet.config.in_channels
      SCREAMING_SNAKE_CASE_				:  Union[str, Any]           =     pipeline.unet.config.sample_size
      SCREAMING_SNAKE_CASE_				:  Optional[int]           =     output_path / 'unet' / 'model.onnx'
      onnx_export(
          pipeline.unet					,   model_args=(
              torch.randn(2					,   a					,   a					,   a  ).to(device=a					,   dtype=a  ),
              torch.randn(2  ).to(device=a					,   dtype=a  ),
              torch.randn(2					,   a					,   a  ).to(device=a					,   dtype=a  ),
              False,
          )					,   output_path=a					,   ordered_input_names=['sample', 'timestep', 'encoder_hidden_states', 'return_dict']					,   output_names=['out_sample']					,   dynamic_axes={
              'sample': {0: 'batch', 1: 'channels', 2: 'height', 3: 'width'},
              'timestep': {0: 'batch'},
              'encoder_hidden_states': {0: 'batch', 1: 'sequence'},
          }					,   opset=a					,   use_external_data_format=a					,   )
      SCREAMING_SNAKE_CASE_				:  str           =     str(unet_path.absolute().as_posix()  )
      SCREAMING_SNAKE_CASE_				:  int           =     os.path.dirname(a  )
      SCREAMING_SNAKE_CASE_				:  Optional[Any]           =     onnx.load(a  )
      # clean up existing tensor files
      shutil.rmtree(a  )
      os.mkdir(a  )
      # collate external tensor files into one
      onnx.save_model(
          a					,   a					,   save_as_external_data=a					,   all_tensors_to_one_file=a					,   location='weights.pb'					,   convert_attribute=a					,   )
      del pipeline.unet

      # VAE ENCODER
      SCREAMING_SNAKE_CASE_				:  List[Any]           =     pipeline.vae
      SCREAMING_SNAKE_CASE_				:  Tuple           =     vae_encoder.config.in_channels
      SCREAMING_SNAKE_CASE_				:  Optional[int]           =     vae_encoder.config.sample_size
      # need to get the raw tensor output (sample) from the encoder
      SCREAMING_SNAKE_CASE_				:  Union[str, Any]           =     lambda a					,   a  : vae_encoder.encode(a					,   a  )[0].sample()
      onnx_export(
          a					,   model_args=(
              torch.randn(1					,   a					,   a					,   a  ).to(device=a					,   dtype=a  ),
              False,
          )					,   output_path=output_path / 'vae_encoder' / 'model.onnx'					,   ordered_input_names=['sample', 'return_dict']					,   output_names=['latent_sample']					,   dynamic_axes={
              'sample': {0: 'batch', 1: 'channels', 2: 'height', 3: 'width'},
          }					,   opset=a					,   )

      # VAE DECODER
      SCREAMING_SNAKE_CASE_				:  Dict           =     pipeline.vae
      SCREAMING_SNAKE_CASE_				:  Any           =     vae_decoder.config.latent_channels
      SCREAMING_SNAKE_CASE_				:  Optional[int]           =     vae_decoder.config.out_channels
      # forward only through the decoder part
      SCREAMING_SNAKE_CASE_				:  Any           =     vae_encoder.decode
      onnx_export(
          a					,   model_args=(
              torch.randn(1					,   a					,   a					,   a  ).to(device=a					,   dtype=a  ),
              False,
          )					,   output_path=output_path / 'vae_decoder' / 'model.onnx'					,   ordered_input_names=['latent_sample', 'return_dict']					,   output_names=['sample']					,   dynamic_axes={
              'latent_sample': {0: 'batch', 1: 'channels', 2: 'height', 3: 'width'},
          }					,   opset=a					,   )
      del pipeline.vae

      # SAFETY CHECKER
      if pipeline.safety_checker is not None:
            SCREAMING_SNAKE_CASE_				:  str           =     pipeline.safety_checker
            SCREAMING_SNAKE_CASE_				:  Dict           =     safety_checker.config.vision_config.num_channels
            SCREAMING_SNAKE_CASE_				:  str           =     safety_checker.config.vision_config.image_size
            SCREAMING_SNAKE_CASE_				:  List[Any]           =     safety_checker.forward_onnx
            onnx_export(
                pipeline.safety_checker					,   model_args=(
                    torch.randn(
                        1					,   a					,   a					,   a					,   ).to(device=a					,   dtype=a  ),
                    torch.randn(1					,   a					,   a					,   a  ).to(device=a					,   dtype=a  ),
                )					,   output_path=output_path / 'safety_checker' / 'model.onnx'					,   ordered_input_names=['clip_input', 'images']					,   output_names=['out_images', 'has_nsfw_concepts']					,   dynamic_axes={
                    'clip_input': {0: 'batch', 1: 'channels', 2: 'height', 3: 'width'},
                    'images': {0: 'batch', 1: 'height', 2: 'width', 3: 'channels'},
                }					,   opset=a					,   )
            del pipeline.safety_checker
            SCREAMING_SNAKE_CASE_				:  Tuple           =     OnnxRuntimeModel.from_pretrained(output_path / 'safety_checker'  )
            SCREAMING_SNAKE_CASE_				:  str           =     pipeline.feature_extractor
      else:
            SCREAMING_SNAKE_CASE_				:  Any           =     None
            SCREAMING_SNAKE_CASE_				:  Any           =     None

      SCREAMING_SNAKE_CASE_				:  Any           =     OnnxStableDiffusionPipeline(
          vae_encoder=OnnxRuntimeModel.from_pretrained(output_path / 'vae_encoder'  )					,   vae_decoder=OnnxRuntimeModel.from_pretrained(output_path / 'vae_decoder'  )					,   text_encoder=OnnxRuntimeModel.from_pretrained(output_path / 'text_encoder'  )					,   tokenizer=pipeline.tokenizer					,   unet=OnnxRuntimeModel.from_pretrained(output_path / 'unet'  )					,   scheduler=pipeline.scheduler					,   safety_checker=a					,   feature_extractor=a					,   requires_safety_checker=safety_checker is not None					,   )

      onnx_pipeline.save_pretrained(a  )
      print('ONNX pipeline saved to'					,   a  )

      del pipeline
      del onnx_pipeline
      SCREAMING_SNAKE_CASE_				:  str           =     OnnxStableDiffusionPipeline.from_pretrained(a					,   provider='CPUExecutionProvider'  )
      print('ONNX pipeline is loadable'  )


if __name__ == "__main__":
    lowerCAmelCase     :   Any						     =  argparse.ArgumentParser()

    parser.add_argument(
        '--model_path',
        type=str,
        required=True,
        help='Path to the `diffusers` checkpoint to convert (either a local directory or on the Hub).',
    )

    parser.add_argument('--output_path', type=str, required=True, help='Path to the output model.')

    parser.add_argument(
        '--opset',
        default=14,
        type=int,
        help='The version of the ONNX operator set to use.',
    )
    parser.add_argument('--fp16', action='store_true', default=False, help='Export the models in `float16` mode')

    lowerCAmelCase     :   Dict						     =  parser.parse_args()

    convert_models(args.model_path, args.output_path, args.opset, args.fpaa)









from ..utils import DummyObject, requires_backends
class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      Optional[int]       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      List[str]       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      Any       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      Optional[Any]       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      int       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      List[str]       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      int       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      Any       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      Optional[Any]       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      Dict       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      Any       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      Union[str, Any]       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)

class  _A		(  metaclass=__magic_name__):
  SCREAMING_SNAKE_CASE    :      Union[str, Any]       =  ['''flax''']

  def __init__(				self ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(self ,					['flax']					)

  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)



  @classmethod
  def  UpperCAmelCase    (				cls ,					*_SCREAMING_SNAKE_CASE ,					**_SCREAMING_SNAKE_CASE					):





        """simple docstring"""







        requires_backends(cls ,					['flax']					)






