1. 简介
稳定扩散是一种开源深度学习模型,可生成带有输入文本提示的新图像。它也可以用来修改图像;该模型可以从输入图像和文本提示生成新图像。
本指南使用预先训练的稳定扩散模型来设置系统,以根据输入图像和文本提示生成新图像。它没有涵盖如何从数据训练模型。
2. 兼容性
2.1. 硬件
此处描述的步骤已在 NVIDIA A100 GPU 上具有 10 GB Video-RAM (V-RAM) 共享的 Vultr Cloud GPU 实例上进行了测试。
虽然可以在仅使用 CPU 的机器上运行稳定扩散,但在没有 GPU 的情况下,处理时间可能会高出几个数量级。
2.2. 基本系统
这里描述的系统是在运行 Debian 11 的虚拟机上设置的。基于操作系统的命令与最新版本的 Ubuntu 兼容。Python 3 命令独立于操作系统。
2.3. 版本号
鉴于深度学习的快速变化,软件更新有时会破坏兼容性。必要时,安装命令指定所用软件的版本号。使用同一软件的较新版本或较旧版本可能会导致依赖项之间的冲突。
3. 系统设置
3.1. 安装 sshfs
生成映像(在第 4 节中)后,您将需要一种方法来查看或将它们复制到本地计算机。可以在本地文件系统上挂载远程目录。然后,您可以使用命令行或 GUI 浏览本地挂载的远程目录。您还可以将远程文件复制到本地文件系统。sshfs
检查已安装的本地计算机 ifis:sshfs
$ sshfs --version
如果未安装,请安装它:
# apt install sshfs
在本地计算机上创建挂载点:
$ mkdir ~/sshfs_mountpoint
将服务器的主目录挂载到此挂载点上:
$ sshfs -o follow_symlinks username@remote.server.ip.address:/home/username ~/sshfs_mountpoint
3.2. 获取访问代码
在使用预先训练的稳定扩散模型之前,您需要能够访问它们。这些模型可从Hugging Face获得 – 一个用于共享机器学习工具和模型的数据科学社区和平台(中心)。若要使用任何预先训练的模型,需要访问令牌。截至 2022 年 11 月,加入中心并创建访问令牌是免费的。
使用您的电子邮件地址在拥抱脸网站上注册一个帐户。按照屏幕上的说明操作并创建您的帐户。您需要确认您的电子邮件地址。
使用已确认的帐户登录后,导航到“设置”页面(单击屏幕右上角的个人资料图片图标,然后单击下拉选项中的“设置”)。在“设置”页上,导航到“访问令牌设置”(单击左侧垂直菜单中的“访问令牌”)。在“访问令牌”页上,使用“新建令牌”按钮创建新令牌。为其指定一个相关名称,并为角色选择“读取” – 您只需要读取预先训练的模型。
您需要在第 4 节中使用此访问代码。
3.3. 设置开发环境
稳定的扩散会话可以长时间运行。为避免在 SSH 会话断开连接时丢失工作,请使用TMUX或屏幕。
3.3.1 创建新用户
默认情况下,在新的 Vultr 实例上,您以 root 用户身份登录。不建议以 root 身份安装 Python 包。在继续之前,请设置一个新的非特权用户并为该用户配置 SSH 访问。
进一步的步骤假定您以常规的非特权用户身份登录。
3.3.2 安装 Conda
环境通过将不同项目使用的软件安装到单独的目录树中来帮助隔离它们。本指南使用 Conda 来管理 Python 环境。
Miniconda是一个最小的Conda安装程序。访问Conda网站并复制最新版本Miniconda的下载链接。下载安装文件:
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
运行安装文件以安装 Miniconda:
$ bash Miniconda3-latest-Linux-x86_64.sh
在安装过程中,请按照屏幕上的所有说明进行操作。
检查是否安装了 Conda:
$ conda --version
3.3.3. 新的 Conda 环境
升级到最新版本:conda
$ conda upgrade conda
创建新的 Conda 环境:
$ conda create --name env1 python=3.9
这将创建一个新环境,并将Python 3.9安装到其中。在安装过程中按照屏幕上的说明进行操作。env1
pip
在命令行中输入以查看 Conda 环境的列表。激活新的康达环境:conda env list
$ conda activate env1
要停用当前活动的环境并返回到常规命令行,请使用。conda deactivate
所有进一步的步骤都假定 Conda 环境处于活动状态。env1
导出包含 Conda 安装路径的环境变量:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/
导出路径后,不再需要键入安装到环境中的应用程序的完整路径。
在 Conda 目录中创建一个激活目录:
$ mkdir -p $CONDA_PREFIX/etc/conda/activate.d
在新文件中,在激活目录中,添加一个命令以导出具有 Conda 安装路径的变量:env_vars.sh
$ echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/' > $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
这将在每个 Conda 会话开始时自动加载路径。
3.4. 安装 Python 软件包 – Conda
3.4.1. PyTorch 和 CUDA
PyTorch()是一个Python库,支持张量计算,并包括用于处理神经网络的工具。PyTorch 模块同时适用于 GPU 和 CPU。在支持 GPU 的系统上,Torch 利用 GPU 来加速张量计算。torch
CUDA 是 NVIDIA 为其自己的 GPU 开发的“并行计算平台和编程模型”,包含对 CUDA 的运行时支持。截至 2022 年 11 月,无法通过 PyPI 安装。从 PyPI 安装 PyTorch 和从 Conda 安装 CUDA 可能会导致版本和 GPU 驱动程序架构相关的不兼容。为了确保 GPU 库的兼容性,请从 Conda 安装 Pytorch 和 CUDA:cudatoolkit
cudatoolkit
$ conda install pytorch=1.12.1 cudatoolkit=11.6 -c pytorch -c conda-forge
3.4.2. 快速检查
在继续安装其他软件包之前,请检查 PyTorch 是否已使用 CUDA 支持进行安装。请注意,您可能需要停用并重新激活 Conda 环境。启动 Python shell 并导入:env1
torch
>>> import torch
在以下位置检查 CUDA 版本:torch
>>> torch.version.cuda
输出应为类似于的版本号。11.6
检查 PyTorch 安装中 CUDA 支持的可用性:
>>> torch.cuda.is_available()
输出应该是。True
退出 Python shell 并继续安装剩余的包。
3.4.3. 其他版本
要安装其他版本的 PyTorch 和 CUDA,请根据计算机上安装的 GPU 驱动程序选择合适的版本。例如,如果更新了预安装的 NVIDIA 驱动程序,则可能需要执行此操作。发生这种情况时,您可能会收到错误消息,指出 CUDA 架构与当前的 PyTorch 安装不兼容。如果您的计算机使用的 GPU 与本指南测试的 GPU (NVIDIA A100) 不同,您也可能会收到错误。
检查已安装的驱动程序可以支持的最高 CUDA 版本:
$ nvidia-smi
输出的第一行应如下所示:
NVIDIA-SMI 510.85.02 Driver Version: 510.85.02 CUDA Version: 11.6
输出的右上角显示支持的最高 CUDA 版本。
查看 PyTorch 网站上的兼容性信息,以确定适合您计算机的PyTorch和 CUDA 版本。如果需要,请使用这些版本,而不是第 3.4.1 节中指定的版本。
3.5. 安装 Python 软件包 – PyPI
升级到最新版本:pip
$ pip install --upgrade pip
下面的软件包也可以从 Conda 安装,但安装过程更快。pip
3.5.1. Python 映像库
枕头是 Python 映像库 PIL 的积极维护(截至 2022 年 11 月)分支,不再维护。安装枕头:
$ pip install --upgrade Pillow
3.5.2. 扩散器
机器学习管道是捆绑整个数据处理工作流以构建模型的便捷方法。
扩散器以预打包管道的形式提供对预先训练的扩散模型的访问。它提供了用于构建和训练扩散模型的工具。扩散器还包括许多不同的核心神经网络模型 – 这些模型用作创建新管道的构建块。
自 2022 年 8 月以来,稳定扩散管道已通过扩散器提供。安装:diffusers
$ pip install --upgrade diffusers==0.7.2
3.5.3. 变压器
变形金刚是一个由Hugging Face团队构建的许多预先训练的机器学习模型的库。这些模型基于TensorFlow和PyTorch。在构建新管道时,变压器模型可用作构建块。安装变压器:
$ pip install --upgrade transformers==4.24.0
4. 生成图像
4.1. 访问代码
打开一个新的 Python 命令行。复制您的拥抱脸访问代码并将其分配给一个变量:
>>> hf_token = 'hf_copythetokenfromyourhuggingfaceaccount'
4.2. 导入软件包
进口:torch
>>> import torch
枕头模块用于从文件加载图像和保存新图像。导入模块:Image
Image
>>> from PIL import Image
许多深度学习管道,包括不同的稳定扩散管道,都可以通过扩散器获得。稳定扩散Img2Img管道包括所有处理步骤,以生成给定输入图像和输入文本提示的图像。导入 Img2Img 管道:
>>> from diffusers import StableDiffusionImg2ImgPipeline
4.3. 加载管道
该函数加载预训练管道的所有组件,包括模型权重。from_pretrained()
>>> pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
"CompVis/stable-diffusion-v1-4",
revision="fp16",
torch_dtype=torch.float16,
use_auth_token=hf_token
)
传递给函数的参数是:from_pretrained()
- 管道的模型 ID。上面的函数调用加载在 CompVis 组织的存储库下托管的模型。模型 ID 也可以是包含模型权重的本地目录的路径,也可以是检查点文件的路径(本地或 URL)。
stable-diffusion-v1-4
revision
表示使用其存储库 ID 的模型的特定版本。这是一个基于 git 的分支名称、标签名称或提交 ID。torch_dtype
是显式指定的用于管道 computations.is 张量的 Torch 数据类型,以便模型计算以 16 位浮点数(而不是默认的 32 位)完成。这有助于内存有限的系统。可以让系统使用最佳数据类型。默认设置为。float16
torch_dtype = "auto"
torch_dtype = "full-precision"
use_auth_token
指定用于从拥抱面部存储库下载预训练模型的访问令牌。
默认情况下,上面的函数将模型加载到 RAM(即 CPU 可以访问的内存空间)中。GPU 执行张量计算的速度比 CPU 快得多。但是GPU无法访问RAM,它只能访问自己的内存。因此,模型需要“移动”到 GPU。该函数用于执行此操作。将模型移动到 GPU 设备(在本例中,GPU 设备是 CUDA):from_pretrained()
Tensor.to()
>>> device = "cuda"
>>> pipe = pipe.to(device)
4.4. 加载输入图像
4.4.1. 从文件系统加载镜像
如果输入图像已经存在于服务器上,请将其加载到 Python 终端中:
>>> input_image = Image.open('/path/to/image')
4.4.2. 复制本地镜像到服务器
如果映像在本地计算机上,请使用(在本地计算机上)将其复制到服务器上:scp
$ scp /local/path/to/image username@server.ip.address:/remote/path/to/image
将映像复制到服务器上后,将其加载到 Python 终端中,如上一小节所示:
>>> input_image = Image.open('/path/to/image')
4.5. 调整输入图像的大小
建议将输入图像的大小调整为 512 像素的宽度或高度。
>>> height_orig = input_image.height
>>> width_orig = input_image.width
>>> aspect_ratio = width_orig / height_orig
>>> width_new = 512
>>> height_new = int(width_new / aspect_ratio)
>>> input_image = input_image.resize((width_new, height_new), 0)
稳定的扩散模型已经在 512×512 分辨率的图像上进行了训练。建议输入图像的至少一个尺寸为 512 像素。尝试沿两个轴生成分辨率大于 512 的图像可能会导致图像区域重复。请注意,尝试在具有 10 GB 共享 V-RAM 的系统(在 A100 GPU 上)上处理分辨率为 1024×1024 的图像可能会导致内存不足错误。
4.6. 文本提示
创建输入文本提示:
>>> prompt = "wearing a christmas hat"
4.7. 生成新镜像
4.7.1. 默认设置
使用加载的管道上的默认设置生成单个新映像:
>>> pipe_output = pipe(
prompt = prompt,
init_image = input_image,
)
在上面的函数调用中,参数是输入文本提示,并且是输入图像,如前所述。prompt
init_image
从输出对象中提取图像:
>>> output_images = pipe_output.images
output_images
是一个图像数组。
保存图像:
>>> output_images[0].save("/path/to/image/filename.png")
使用 查看图像,如第 3.1 节中所述。sshfs
4.7.2. 高级设置
映像生成管道接受许多其他选项。只有参数和是必需的。prompt
init_image
>>> pipe_output = pipe(
prompt = prompt,
init_image = input_image,
strength = 0.75,
num_inference_steps = 100,
guidance_scale = 7.5,
negative_prompt = negative_prompt,
num_images_per_prompt = 5
)
上述对管道函数的调用使用以下参数:
prompt
是输入文本提示。它是单个文本字符串或字符串数组。请注意,使用字符串数组会导致更高的 V-RAM 要求。一般来说,提示越复杂,处理它所需的 V-RAM 就越多。init_image
是要用作生成新图像的起点的输入图像。strength
是介于 0 和 1 之间的值。它指示输入图像可以接受的转换量。此值越高,输入图像的变化就越多。默认值为 0.8。设置为 1 时,输入图像在生成新图像时几乎不起作用。strength
num_inference_steps
:稳定扩散从随机噪声开始,反复去噪以生成有意义的图像。此值越大,输出图像的质量越高。默认值为 50。实际步数由参数调制。当参数的值小于 1 时,实际迭代次数小于 中指定的次数。num_inference_steps
strength
strength
num_inference_steps
guidance_scale
:指导是指输入文本提示对图像生成的影响程度。可以通过设置为大于 1 的值来启用它。此值越高,生成的图像越符合输入文本提示。但是,生成的图像与输入文本提示匹配得越多,图像的质量就越低。默认值为 7.5。guidance_scale
negative_prompt
:如果提示指示图像应该是什么,则否定提示指导不应该是什么。仅当引导刻度值大于 1 时,否定提示才适用。num_images_per_prompt
指定要生成的图像数。请注意,尝试为每个函数调用生成大量图像可能会导致内存不足错误。如果需要生成更多图像,请重复调用该函数。
提取并查看图像,如上一节所示。
上述默认值自 2022 年 11 月起为 true,将来可能会随着模型的更新而更改。
4.7.3. 备注
模型生成的图像的“准确”程度取决于模型在相关图像及其相关文本标记上训练的程度。它还取决于本节中描述的参数的配置。可能需要一些反复试验才能找出一组好的参数值。
5. 许可
Stability AI已根据Creative ML OpenRAIL-M许可证向公众发布了该模型。它允许商业和非商业用途。该许可证的重点是确保该模型的道德和合法使用。它还要求许可证本身包含在模型的任何分发中,包括最终用户。
6. 结论
本指南概述了如何设置稳定扩散系统以从给定图像和文本提示生成新图像。此处的观察结果截至 2022 年 11 月是准确的。未来的发展和软件升级可能会使它们部分不准确。在不同版本的模型行为中经常遇到错误和不一致。在配置系统时能够阅读和理解错误消息很有帮助。Hugging Face网站上的模型卡页面和Stable Diffusion博客上有该模型的完整,最新的详细信息。