在本地跑一个AI模型(5) - Stable Diffusion

在之前的文章中,我们使用ollama在本地运行了大语言模型,它可以与你聊天,帮助你理解和生成文本内容。使用coqui-tts在本地运行了文本转语音模型,它可以将大语言模型生成的文字转换成语音,让你的应用更有趣。今天我们将要介绍Stable Diffusion,一种扩散神经网络的深度学习模型,使用它可以生成各种不可思议的图片。

我们使用的工具是huggingface提供的diffusers,一个在纯python环境下运行的库。废话不多说,我们进入今天的教程。

安装

diffusers目前不支持python 3.12,因此我们使用虚拟环境来安装。

# 使用3.10版本的python创建venv
/opt/homebrew/opt/python@3.10/libexec/bin/python3 -m venv .venv
# 激活venv
source .venv/bin/activate 

安装diffusers及其依赖:

pip install diffusers accelerate transformers

下载模型

和之前文章里介绍的一样,模型我们还是选择自己下载。你可以到huggingface网站下载已经训练好的模型,比如runwayml/stable-diffusion-v1-5

Tips:你可以使用如下命令下载huggingface上的模型:

git lfs install
git clone git@hf.co:<MODEL ID> # example: git clone git@hf.co:bigscience/bloom

此外,diffusers支持AUTOMATIC1111的模型,因此你可以去Civitai下载各种CheckPointLoRA。本文使用的模型就是Civitaidreamshaper。选择模型时要注意以下几点:

  • 根据自己的喜好选择模型的风格,比如“写实”、“动漫”或者“魔幻”
  • 模型有一个属性是“基础模型”,如下图。对应的诸如SD 1.5SDXL 1.0SDXL Turbo等等。SD系列只能生成512x512的图片,SDXL系列可以生成1024x1024及以上的图片。而Turbo系列可以将生成所需的时间缩短。根据自己的电脑配置选择合适的模型吧。

Civitai Model

选择好模型后,就点击Download下载吧。

加载模型

如果你的模型是单个safetensors格式的,使用from_single_file加载,如果是从huggingface下载的预训练模型,使用from_pretrained加载。此外如果你的模型是SDXL,使用StableDiffusionXLPipeline,因此dreamshaperXL模型加载的代码如下:

from diffusers import StableDiffusionXLPipeline

pipe = StableDiffusionXLPipeline.from_single_file("your/path/dreamshaperXL_v21TurboDPMSDE.safetensors")

使用GPU运行

windows用户可以根据如下代码判断自己的电脑能否进行GPU推理:

device = "cuda" if torch.cuda.is_available() else "cpu"

MACM1M2芯片可以使用如下代码:

device = 'mps'

然后:

pipe = pipe.to(device)

调度器

diffusers的调度器对应的是AUTOMATIC1111中的Sampling method,它对获得高质量的图像至关重要。Sampling methoddiffusers的调度器的对应关系可以参照此处

Diffusers Scheduler

至于如何选择调度器,在模型的详情页可以找到作者给出的建议,比如:

在这里插入图片描述

这里作者建议的是DPM++ SDE Karras,可以参照上面的对应表找到对应的调度器为DPMSolverSinglestepScheduler,初始化参数为use_karras_sigmas=True

调度器代码如下:

pipe.scheduler = DPMSolverSinglestepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True)

提示词

提示词的质量对最终生成的图像质量有很大的影响。提示词的写法这里不做展开,提示词的例子:

prompt = "masterpiece, cat wizard, gandalf, lord of the rings, detailed, fantasy, cute, adorable, Pixar, Disney"

negative_prompt = "worst quality, low quality, normal quality, lowres, low details, oversaturated, undersaturated, overexposed, underexposed"

提示词目前有77个长度的限制,要突破这个限制,可以将提示词向量化,以下是代码例子:

pip install compel
compel = Compel(
    tokenizer=[pipe.tokenizer, pipe.tokenizer_2] ,
    text_encoder=[pipe.text_encoder, pipe.text_encoder_2],
    returned_embeddings_type=ReturnedEmbeddingsType.PENULTIMATE_HIDDEN_STATES_NON_NORMALIZED,
    requires_pooled=[False, True]
)

conditioning, pooled = compel(prompt)
negative_prompt_embeds, negative_pooled = compel(negative_prompt)

图片生成

image = pipe(
            prompt_embeds = conditioning,
            pooled_prompt_embeds=pooled,
            negative_prompt_embeds = negative_prompt_embeds,
            negative_pooled_prompt_embeds=negative_pooled,
            # height=800,
            # width=512,
            num_inference_steps=6,
            guidance_scale=2,
            strength=0.5
        ).images[0]

image.save("data/out.jpg")

这里对图片生成质量有影响的几个参数是guidance_scalenum_inference_steps,这两个参数分别对应AUTOMATIC1111里的CFG ScaleSampling steps。你也可以在模型的详情页找到作者给出的建议:

至此,运行代码,你应该可以获得模型生成的图片了。

总结

本文介绍了使用diffusers在本地运行Stable Diffusion的方法,并进行了一次基本的Text to Image的实践。下篇文章将继续介绍diffusers使用LoRAControlNetAdapter生成高级图片的实践。

本文首发于:https://babyno.top/posts/2024/04/run-stable-diffusion-locally/

欢迎订阅公众号:

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要安装PyTorch和Stable Diffusion库。在PyTorch官网上可以找到安装指南。安装完成后,你可以运行以下命令来安装Stable Diffusion库: ``` pip install git+https://github.com/hojonathanho/diffusion.git ``` 安装完成后,你可以使用以下代码在PyCharm中搭建一个AI绘画的Stable Diffusion应用: ```python import torch import torch.nn.functional as F from torchvision.utils import save_image from diffusion import GaussianDiffusion # 加载已经训练好的模型 model = torch.load('path/to/model.pt') # 定义噪声和图片大小 noise_size = 128 image_size = 256 # 定义Diffusion过程中的参数 timesteps = 1000 beta_start = 0.0001 beta_end = 0.02 betas = torch.linspace(beta_start, beta_end, timesteps) # 定义Diffusion过程中的步长 step_size = 0.0001 # 定义噪声和图片张量 noise = torch.randn(1, noise_size, image_size, image_size) image = torch.zeros(1, 3, image_size, image_size) # 初始化Gaussian Diffusion过程 diffusion = GaussianDiffusion() # 运行Diffusion过程生成图像 for i in range(timesteps): # 计算当前Diffusion过程的beta值 beta = betas[i] # 在当前噪声和图像上执行Diffusion步骤 noise, image = diffusion.step(model, noise, image, beta, step_size) # 对生成的图像进行可视化保存 if i % 100 == 0: save_image(image.clamp(0, 1), 'path/to/output/image_{}.png'.format(i)) ``` 这段代码会加载一个已经训练好的模型,通过Gaussian Diffusion过程对噪声进行迭代生成图像,并将生成的图像保存到本地。你可以根据需要修改参数和模型来生成不同的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值