stable-diffusion官方版本地复现手册(2023年4月10日)

stable diffusion v1.4官方版(CompVis)本地复现手册

主页:https://github.com/wjxpro

邮箱:804359553@qq.com

〇、说明

对于只想体验stable-diffusion的朋友,可以参考这篇教程1使用网页版。对于想要进行深入研究、要进行本地版部署的朋友,现有教程大多使用基于WebUI版23以及非官方版4复现的,也有一些是基于官方版本56复现的,但是其版本已经过时,因此我重新复现了官方的CompVis v1.4版(2023年4月10日),希望能帮助到大家。

环境

windows环境下部署,需要有显卡,显存大于4G,显存大小影响可以生成图片的最大尺寸。工程最终大小约为7GB,请注意存储位置。

请自行配置Python运行环境(AnacondaVS Code)、CUDA、cudnn,注意修改国内镜像源,并保证可用。

一、准备

1. stable-diffusion(标题链接可点)

下载工程源码并解压,关于国内无法访问github,除了挂代理也可以通过修改DNS加速,工具下载地址

2. sd-v1-4.ckpt

下载权重模型,只下载sd-v1-4.ckpt(约3.97GB)就可以。下载完成后,将其放在工程根目录下。

3. clip-vit-large-patch14

下载openai的分词器clip-vit-large-patch14,本人猜测这个模型用于将输入的prompt转换为stable-diffusion的输入特征。需要下载的内容包括:

  • pytorch_model.bin(约1.59GB)
  • config.json
  • merges.txt
  • preprocessor_config.json
  • special_tokens_map.json
  • tokenizer.json
  • tokenizer_config.json
  • vocab.json

下载完成后,在工程根目录创建文件夹openai\clip-vit-large-patch14,将下载的内容放入其中。

4. safety_checker

下载安全性检查器。这个模型用于检测生成的内容是否为NSFW内容,如果是,则将其替换为assets\rick.jpeg(你被骗了)。需要下载的内容包括:

  • pytorch_model.bin(约1.13GB)
  • config.json

下载完成后,在工程根目录创建文件夹CompVis\stable-diffusion-safety-checker,将下载的内容放入其中。

二、构建

1. ldm虚拟环境

参照源码README,在Anaconda环境下,可以使用如下命令创建并激活ldm虚拟环境:

conda env create -f environment.yaml
conda activate ldm

此处可能产生两个报错:

  1. ImportError: cannot import name 'SAFE_WEIGHTS_NAME' from 'transformers.utils'
    解决方案参照此issue:修改environments.yaml,将diffusers改为diffusers==0.12.1
  2. Pip subprocess error: ERROR: Command errored out with exit status 128: git fetch -q ...
    参照5的解释,因为环境中包含了两个从github上下载的子工程,所以这个问题需要检查当前网络环境对github的访问是否通畅,然后重新下载:
    # 查看已存在环境
    conda env list
    # 先切换到base环境
    conda activate base
    # 删除ldm
    conda env remove --name ldm
    
    也可以通过以下命令更新环境:
    conda env update -f environment.yaml
    

2. 使用

在工程根目录下,激活ldm虚拟环境,然后直接运行script中的脚本即可。如果使用命令行运行,一个示例命令如下:

python scripts/txt2img.py --ckpt "sd-v1-4.ckpt" --prompt "a photograph of an astronaut riding a horse" --plms --H 256 --W 256

3. 重要超参数解释

以文本生成图片(script\txt2img.py)为例:

超参数解释
ckpt模型权重文件路径(相对于根目录)
prompt生成图像需要的文本提示
H生成图像的高
W生成图像的宽
n_iter一次运行进行n次采样
n_samples一次采样生成n张图像
seed随机数种子,修改其值可生成不同的结果
skip_grid不生成拼接的图像,拼接的图像由n_itern_samples列构成
skip_save不生成独立的图像
outdir结果保存的文件夹路径
plms一个采样器,暂未深入研究

三、修改源码

超参数

可以直接修改超参数的默认值减少命令行输入内容,一个修改示例如下:
修改示例

推荐修改的超参数推荐修改值
ckptsd-v1-4.ckpt
plmsTrue
H256(适用于显存小的显卡)
W256(适用于显存小的显卡)

禁用安全检查器

安全检查器有1GB多,不想下载的朋友可以按如下方法进行修改。(NSFW警告)

  1. 注释掉27-29行的# load safety model内容:
# safety_model_id = "CompVis/stable-diffusion-safety-checker"
# safety_feature_extractor = AutoFeatureExtractor.from_pretrained(safety_model_id)
# safety_checker = StableDiffusionSafetyChecker.from_pretrained(safety_model_id)
  1. 注释掉88-95行check_safety函数:
# def check_safety(x_image):
#     safety_checker_input = safety_feature_extractor(numpy_to_pil(x_image), return_tensors="pt")
#     x_checked_image, has_nsfw_concept = safety_checker(images=x_image, clip_input=safety_checker_input.pixel_values)
#     assert x_checked_image.shape[0] == len(has_nsfw_concept)
#     for i in range(len(has_nsfw_concept)):
#         if has_nsfw_concept[i]:
#             x_checked_image[i] = load_replacement(x_checked_image[i])
#     return x_checked_image, has_nsfw_concept
  1. 318行内容修改:
x_checked_image, has_nsfw_concept = check_safety(x_samples_ddim)

修改为:

x_checked_image = x_samples_ddim

禁用不可见水印

  1. 注释掉262-265行内容:
# print("Creating invisible watermark encoder (see https://github.com/ShieldMnt/invisible-watermark)...")
# wm = "StableDiffusionV1"
# wm_encoder = WatermarkEncoder()
# wm_encoder.set_watermark('bytes', wm.encode('utf-8'))
  1. 注释掉327与343行内容:
# img = put_watermark(img, wm_encoder)

四、生成结果示例

默认prompt: a painting of a virus monster playing guitar

生成结果示例


  1. https://zhuanlan.zhihu.com/p/560226367 ↩︎

  2. https://zhuanlan.zhihu.com/p/617997179 ↩︎

  3. https://zhuanlan.zhihu.com/p/617997179 ↩︎

  4. https://zhuanlan.zhihu.com/p/565851314 ↩︎

  5. https://juejin.cn/post/7143441237037711396 ↩︎ ↩︎

  6. https://zhuanlan.zhihu.com/p/563731965 ↩︎

### 如何复现 Stable Diffusion 模型 #### 准备环境 要成功复现 Stable Diffusion 模型,首先需要准备合适的开发环境。建议使用 Python 和 PyTorch 或 TensorFlow 进行实现。安装必要的库可以通过 pip 完成。 ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113 pip install diffusers transformers accelerate safetensors ``` #### 数据集获取与预处理 对于图像生成任务而言,高质量的数据集至关重要。通常情况下会采用公开的大规模图片数据集如 ImageNet 或者 LSUN 来训练模型[^1]。在实际操作前还需要对原始图像做一系列变换处理: - 调整尺寸至统一规格; - 归一化像素值范围; - 可选地应用增强技术提升泛化能力; 这部分工作可通过编写自定义 Dataset 类完成,在 `__getitem__` 方法内加入上述逻辑即可满足需求。 #### 构建网络架构 构建基于 U-net 的编码器解码器结构作为核心组件之一。U-net 是一种经典的卷积神经网络设计模式,特别适合于语义分割以及本案例中的条件分布估计问题。此外还需引入 Time Embedding 层用于捕捉时间维度上的变化特征。 ```python import torch.nn as nn class UNet(nn.Module): def __init__(self, ...): # 参数省略 super().__init__() self.time_embedding = ... self.encoder = ... self.decoder = ... def forward(self, x, timesteps=None): time_emb = self.time_embedding(timesteps) encoded_x = self.encoder(x + time_emb[:, :, None, None]) output = self.decoder(encoded_x) return output ``` #### 训练流程设置 考虑到该类模型存在较长的训练周期特性[^2],因此推荐配置如下优化方案以加快收敛速度并改善最终效果: - **混合精度训练**:利用 FP16 浮点数代替默认的 FP32 表示形式能够有效降低显存占用量的同时提高运算速率。 - **分布式训练**:当具备多张 GPU 卡件时不妨考虑启用 DataParallel 或 DistributedDataParallel 方式让不同设备协同作业分担负载压力。 - **梯度累积机制**:适当增大 batch size 对于某些特定场景下的性能表现有所助益,而无需额外购置昂贵硬件设施就能达成目的的方法就是积累若干次反向传播后的总梯度再执行一次参数更新动作。 最后按照常规 DL 工作流依次经历初始化、迭代读取 mini-batch 输入样本送入 net 中计算 loss 值继而调用 optimizer.step() 执行权值调整直至达到预定轮次数结束整个过程。 #### 预测阶段部署 经过充分训练之后便可以尝试运用已学得的知识去创造全新的艺术作品啦!此时只需简单修改推理脚本里的 few lines of code 就能轻松搞定哦~ 加载保存下来的 checkpoint 文件恢复先前中断处继续前进或者直接拿来即用都毫无障碍~记得把测试集中挑选出来的几张代表性的图喂给 model.predict() 接口看看成果如何吧!
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值