| | import argparse |
| |
|
| | import OmegaConf |
| | import torch |
| |
|
| | from diffusers import DDIMScheduler, LDMPipeline, UNetLDMModel, VQModel |
| |
|
| |
|
| | def convert_ldm_original(checkpoint_path, config_path, output_path): |
| | config = OmegaConf.load(config_path) |
| | state_dict = torch.load(checkpoint_path, map_location="cpu")["model"] |
| | keys = list(state_dict.keys()) |
| |
|
| | |
| | first_stage_dict = {} |
| | first_stage_key = "first_stage_model." |
| | for key in keys: |
| | if key.startswith(first_stage_key): |
| | first_stage_dict[key.replace(first_stage_key, "")] = state_dict[key] |
| |
|
| | |
| | unet_state_dict = {} |
| | unet_key = "model.diffusion_model." |
| | for key in keys: |
| | if key.startswith(unet_key): |
| | unet_state_dict[key.replace(unet_key, "")] = state_dict[key] |
| |
|
| | vqvae_init_args = config.model.params.first_stage_config.params |
| | unet_init_args = config.model.params.unet_config.params |
| |
|
| | vqvae = VQModel(**vqvae_init_args).eval() |
| | vqvae.load_state_dict(first_stage_dict) |
| |
|
| | unet = UNetLDMModel(**unet_init_args).eval() |
| | unet.load_state_dict(unet_state_dict) |
| |
|
| | noise_scheduler = DDIMScheduler( |
| | timesteps=config.model.params.timesteps, |
| | beta_schedule="scaled_linear", |
| | beta_start=config.model.params.linear_start, |
| | beta_end=config.model.params.linear_end, |
| | clip_sample=False, |
| | ) |
| |
|
| | pipeline = LDMPipeline(vqvae, unet, noise_scheduler) |
| | pipeline.save_pretrained(output_path) |
| |
|
| |
|
| | if __name__ == "__main__": |
| | parser = argparse.ArgumentParser() |
| | parser.add_argument("--checkpoint_path", type=str, required=True) |
| | parser.add_argument("--config_path", type=str, required=True) |
| | parser.add_argument("--output_path", type=str, required=True) |
| | args = parser.parse_args() |
| |
|
| | convert_ldm_original(args.checkpoint_path, args.config_path, args.output_path) |
| |
|