当前位置:   article > 正文

【Diffusers教程】一、简介:快速使用Diffusion网络_diffusion怎么访问

diffusion怎么访问

原始教程地址: https://huggingface.co/docs/diffusers/using-diffusers/write_own_pipeline

模型的下载,调用

diffuser 的 from_pretrained()加载模型时,优先加载本地模型,搜索不到会自动下载:base_url = https://huggingface.co/ 。查询地址为 base_url + 库名称。

默认下载的模型会缓存到C:Users\Administrator\.cache\huggingface\diffusers 或者是 ubuntu~/.cache

指定下载模型缓存位置,有以下两种方式:

  1. 在from_pretrained中指定cache_.dir
  2. 指定环境变量HF_HOMEXDG_CACHE_HOME的值
    示例以下第一种方式:
pipeline = StableDiffusionUpscalePipeline.from_pretrained(model_id, torch_dtype=torch.float16, cache_dir="./models/")
  • 1

就会在当前目录创建一个models文件,并将下载的模型缓存到该位置。

使用Diffusers进行模型推理

使用pipeline 进行推理

简单DDPM网络

导入Pipeline, from_pretrained()加载模型,可以是本地模型,或从the Hugging Face Hub自动下载

  1. 一次性全加载进来

    from diffusers import DDPMPipeline
    ddpm = DDPMPipeline.from_pretrained("google/ddpm-cat-256", use_safetensors=True).to("cuda")
    image = ddpm(num_inference_steps=25).images[0]
    image
    
    • 1
    • 2
    • 3
    • 4
  2. model and scheduler 分开加载

    from diffusers import DDPMScheduler, UNet2DModel
    scheduler = DDPMScheduler.from_pretrained("google/ddpm-cat-256")
    model = UNet2DModel.from_pretrained("google/ddpm-cat-256", use_safetensors=True).to("cuda")
    
    • 1
    • 2
    • 3
    1. 设置timestep:

      scheduler.set_timesteps(50)
      print(scheduler.timesteps)
      
      • 1
      • 2
    2. 生成随机噪声

      import torch
      sample_size = model.config.sample_size # 尺寸得和unet对应
      input = noise = torch.randn((1, 3, sample_size, sample_size), device="cuda")
      
      • 1
      • 2
      • 3
    3. 执行迭代降噪

      执行**UNet2DModel.forward()传递并返回噪声残差。调度程序的step()**方法采用噪声残差、时间步长和输入,并预测前一个时间步长的图像。

      for t in scheduler.timesteps:
          with torch.no_grad():
              noisy_residual = model(input, t).sample
          previous_noisy_sample = scheduler.step(noisy_residual, t, input).prev_sample
          input = previous_noisy_sample
      
      • 1
      • 2
      • 3
      • 4
      • 5
    4. 图像输出

      from PIL import Image
      import numpy as np
      image = (input / 2 + 0.5).clamp(0, 1).squeeze()
      image = (image.permute(1, 2, 0) * 255).round().to(torch.uint8).cpu().numpy()
      image = Image.fromarray(image)
      image.show()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

Stable Diffusion 案例

https://huggingface.co/blog/stable_diffusion#how-does-stable-diffusion-work

使用图像的低维表示而不是实际的像素空间,这使得它的内存效率更高。编码器将图像压缩为更小的表示,解码器将压缩的表示转换回图像。对于文本到图像模型,您需要一个分词器和一个编码器来生成文本嵌入。SD具有三个独立的预训练模型。

使用**from_pretrained()方法加载所有这些组件。您可以在预训练[runwayml/stable-diffusion-v1-5](https://huggingface.co/runwayml/stable-diffusion-v1-5)**检查点中找到它们,每个组件都存储在单独的子文件夹中

from PIL import Image
import torch
from transformers import CLIPTextModel, CLIPTokenizer
from diffusers import AutoencoderKL, UNet2DConditionModel, PNDMScheduler
vae = AutoencoderKL.from_pretrained("CompVis/stable-diffusion-v1-5", subfolder="vae", use_safetensors=True)
tokenizer = CLIPTokenizer.from_pretrained("CompVis/stable-diffusion-v1-5", subfolder="tokenizer")
text_encoder = CLIPTextModel.from_pretrained(
    "CompVis/stable-diffusion-v1-5", subfolder="text_encoder", use_safetensors=True
)
unet = UNet2DConditionModel.from_pretrained(
    "CompVis/stable-diffusion-v1-5", subfolder="unet", use_safetensors=True
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

代替默认的**PNDMScheduler,将其替换为UniPCMultistepScheduler**以插入不同的调度程序:

from diffusers import UniPCMultistepScheduler
scheduler = UniPCMultistepScheduler.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="scheduler")
  • 1
  • 2

为了加速推理,请将模型移至 GPU,因为与调度程序不同,它们具有可训练的权重

torch_device = "cuda"
vae.to(torch_device)
text_encoder.to(torch_device)
unet.to(torch_device)
  • 1
  • 2
  • 3
  • 4
  1. 创建文本嵌入

    1. 该文本用于调节 UNet 模型并将扩散过程引导至类似于输入提示的方向。

      声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/443382
推荐阅读
相关标签