赞
踩
原始教程地址: 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
中
指定下载模型缓存位置,有以下两种方式:
cache_.dir
HF_HOME
和XDG_CACHE_HOME
的值pipeline = StableDiffusionUpscalePipeline.from_pretrained(model_id, torch_dtype=torch.float16, cache_dir="./models/")
就会在当前目录创建一个models文件,并将下载的模型缓存到该位置。
pipeline
进行推理导入Pipeline, from_pretrained()
加载模型,可以是本地模型,或从the Hugging Face Hub自动下载
一次性全加载进来
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
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")
设置timestep:
scheduler.set_timesteps(50)
print(scheduler.timesteps)
生成随机噪声
import torch
sample_size = model.config.sample_size # 尺寸得和unet对应
input = noise = torch.randn((1, 3, sample_size, sample_size), device="cuda")
执行迭代降噪
执行**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
图像输出
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()
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
)
代替默认的**PNDMScheduler,将其替换为UniPCMultistepScheduler**以插入不同的调度程序:
from diffusers import UniPCMultistepScheduler
scheduler = UniPCMultistepScheduler.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="scheduler")
为了加速推理,请将模型移至 GPU,因为与调度程序不同,它们具有可训练的权重
torch_device = "cuda"
vae.to(torch_device)
text_encoder.to(torch_device)
unet.to(torch_device)
创建文本嵌入
该文本用于调节 UNet 模型并将扩散过程引导至类似于输入提示的方向。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。