使用 Keras 和 TensorFlow 实现稳定的扩散

1. 简介

机器学习,特别是深度学习的出现,为计算开辟了新的可能性。近年来,这项技术已经从研究人员发展到从业者。深度学习模型可以总结文章,回答开放和封闭的问题,生成文本,甚至生成图像和视频。

2022 年中下旬,OpenAI 向公众发布了 DALL-E 2。DALL-E 2 是一种深度学习模型,用于根据用户输入的文本提示生成图像。截至 2022 年 10 月,该模型是闭源的。进入训练集的图像的性质存在限制。对用户可以输入的提示的性质也有限制。谷歌的 Imagen 是另一种专有的文本到图像模型,不可供公众使用(截至 2022 年 10 月)。

1.1. 稳定扩散

稳定扩散是一种开源深度学习模型,可根据文本提示生成图像。Stability AI,LMU Munich的CompVis小组和Runway是其主要开发商。使用数百万张公开可用的(在线)高分辨率图像及其相关的文本描述(英语)训练了稳定的扩散模型。训练过程使用了 4000 个 NVIDIA A100 GPU 的集群。

模型权重、模型卡和代码都是开源的。任何人都可以训练和自定义模型,也可以下载并运行预先训练的模型。

1.2. 范围

本指南展示了如何使用 Keras 和 TensorFlow 实现(部署)预先训练的稳定扩散模型。起点是一个普通的 Debian 安装。最终目标是使用预先训练的模型来部署您自己的系统,以根据文本提示生成图像。本指南不介绍如何从数据训练模型。

2. 准备工作和兼容性

2.1 第一原则

在深度学习中,输入数据表示为张量。输入数据通过许多连续的张量操作层转换为输出。TensorFlow和PyTorch是用于构建深度学习模型的计算工具的开源框架。Keras是一个更易于使用的Python前端API,具有更高的抽象级别。这使得它更适合实现模型。Keras使用TensorFlow作为执行实际计算的后端。它也可以使用其他后端,如Theano。Keras现在与TensorFlow集成在一起。KerasCV是核心Keras API的“水平扩展”。它是专门针对计算机视觉问题的构建块的集合。

Stable Diffusion最初建立在PyTorch上。2022 年 9 月,它直接在 KerasCV 上可用。

2.2. 硬件

截至 2022 年 10 月,稳定扩散模型使用大约 7 GB 的视频 RAM。建议在至少具有 10 GB 视频 RAM 的系统上运行该模型。Stability AI建议使用NVIDIA芯片,并计划为其他芯片组(AMD,Apple芯片等)发布优化版本。NVIDIA 的 A100 GPU 面向人工智能、分析和深度学习等应用;A40 GPU 更适合视觉计算、图形、模拟等。

Vultr 云 GPU 虚拟机虚拟化 GPU,并将 GPU 芯片总容量的一小部分分配给每个虚拟机。原则上,可以在仅使用 CPU 的计算机上运行模型。实际上,在没有 GPU 的情况下,生成图像可能需要更多数量级的时间。

本指南已在具有 NVIDIA A100 GPU 的 10 GB GPU RAM 份额的虚拟机上进行了全面测试。尝试在 GPU 内存不足的计算机上运行模型会导致错误。

注意:用户无需执行任何特殊操作即可利用 GPU。只要安装了驱动程序和 CUDA 库,它就会自动发生。

2.2.1、实用技巧

云 GPU 虚拟机价格昂贵。在具有少量 GPU RAM 的虚拟机上设置模型可能具有成本效益。这将获取正确的驱动程序和依赖项。可以将此 VM 的快照还原到具有更多 GPU RAM 的计算机上,以运行模型和生成映像。请注意,源虚拟机和目标虚拟机必须使用相同的 GPU 芯片组。

2.3. 编程语言

必须基本熟悉 Python 3,才能按照后续部分中的命令进行操作。本指南使用 Conda 管理 Python 环境,使用 PyPI 进行包管理。pip

2.4. 操作系统和映像

使用的基本操作系统是 Vultr Debian 11 映像。这些命令应与最近的 Ubuntu 版本一对一兼容。要使用其他操作系统,请调整软件包安装命令。Python 命令在操作系统中是相同的。

也可以使用Vultr Anaconda和Miniconda图像。它们预装了康达。如果您使用这些映像,请跳过有关安装的步骤(第 3.2.1 节)。conda

2.5. 版本号

深度学习是一个快速发展的领域。模型和软件包经常更新。这有时会导致兼容性问题。包的当前版本可能依赖于另一个包的旧版本。这两个包的最新版本可能彼此不兼容。两个必需的包可以分别依赖于第三个包的不同版本。

在适用的情况下,安装命令会提及测试设置中使用的软件的版本号。使用同一软件的较新版本或较旧版本可能会导致依赖项之间的不兼容。

3. 系统设置

3.1. 创建新用户

在 Vultr 仪表板中,部署新的云 GPU 实例。建议在部署期间添加 SSH 密钥。

默认情况下,您以根用户身份登录。强烈建议创建和使用常规用户帐户。

以身份登录到新服务器并创建一个非特权用户:root

# adduser username

按照屏幕上的说明操作并完成用户创建过程。

授予新用户权限,以便它可以执行特权操作,例如安装新程序:sudo

# usermod -aG sudo username

将 的目录(包含密钥)复制到新用户的主目录中。这允许您以非特权用户身份通过 SSH 连接到服务器。.sshroot

# cp -R /root/.ssh /home/username/

将复制目录的所有者从 更改为新用户:root

# chown -R username /home/username/.ssh

Vultr 上的默认 Debian 安装使用 UFW 来管理防火墙。通过检查 UFW 设置来确认是这种情况:

# ufw status verbose

输出应等效于:

Status: active

Logging: on (low)

Default: deny (incoming), allow (outgoing), disabled (routed)

New profiles: skip



To                         Action      From

--                         ------      ----

22 (v6)                    ALLOW IN    Anywhere 

22 (v6)                    ALLOW IN    Anywhere (v6)

如果未配置防火墙,请先进行设置,然后再继续。

打开一个新的终端窗口并以非特权用户身份登录:

ssh username@ip.address

确认新用户具有 SSH 和访问权限后,返回到您以 身份登录的旧终端会话。退出该会话并以常规用户身份继续。sudoroot

建议在服务器上正确配置 SSH,并使用 TMUX 或屏幕来管理远程会话。

3.2. 安装所需软件

本指南使用 Conda 来管理 Python 环境。Conda 还可以更轻松地安装所需的 CUDA 和 cuDNN 软件。CUDA 是 NVIDIA GPU 的并行计算平台。cuDNN 是一个针对 CUDA 优化的深度神经网络库。

3.2.1. 安装 Conda

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:

$ conda --version

注意:如果您使用 Vultr Anaconda 或 Miniconda 安装映像,请跳过此小节。

3.2.2. 设置新环境

确保已升级到最新版本:conda

$ conda upgrade conda

创建新的 Conda 环境:

$ conda create --name env1 python=3.9

这将创建一个新的环境 env1 并将 Python 3.9 预安装到其中。在安装过程中阅读并按照屏幕上的说明进行操作。

使用 查看 Conda 环境的列表。激活新创建的 Conda 环境:conda env list

$ conda activate env1

在终端上输入命令以停用当前活动的环境。conda deactivate

本指南的其余部分假定 Conda 环境处于活动状态。env1

升级到最新版本:pip

$ pip install --upgrade pip

3.2.3. 安装 GPU 软件包

安装 CUDA 和 cuDNN 软件包(到当前的 Conda 环境中):

$ conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1.0

更新系统路径以反映 Conda 安装路径:

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/

创建 Conda 激活目录并向其添加系统路径。

$ mkdir -p $CONDA_PREFIX/etc/conda/activate.d



$ echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/' > $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh

这将在每个 Conda 会话开始时自动加载路径。

3.2.4. 安装 TensorFlow 和 KerasCV

Conda 存储库上的 KerasCV 版本已过时(截至 2022 年 10 月),并且不包括稳定扩散。因此,PyPI 用于安装 KerasCV 及其依赖项(到当前的 Conda 环境中)。pip

使用 安装 TensorFlow:pip

$ pip install tensorflow==2.10.0

注意:PyPI 存储库包含包、 和 。只需安装就足够了 – 从 TensorFlow v2.0 开始,这个包同时支持 CPU 和 GPU 计算。tensorflowtensorflow-gputensorflow-cputensorflow

安装 TensorFlow 数据集:

$ pip install tensorflow-datasets==4.7.0

这些数据集由深度学习库使用。

安装 KerasCV:

$ pip install keras-cv==0.3.4

安装 Matplotlib 来处理图像:

$ pip install matplotlib==3.6.1

3.2.5. 验证安装

验证软件是否已正确安装并按预期工作。打开一个 Python 终端:

$ python

导入张量流:

>>> import tensorflow as tf

运行基于 CPU 的 TensorFlow 操作:

>>> print(tf.reduce_sum(tf.random.normal([1000, 1000])))

如果上述命令运行正常,它应该返回一个张量。输出应如下所示:

tf.Tensor(-1798.1721, shape=(), dtype=float32)

运行基于 GPU 的命令:

>>> print(tf.config.list_physical_devices('GPU'))

上面的命令列出了可用的 GPU 设备。输出应如下所示:

[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

退出 Python 命令行。

3.3. 关于 TensorRT 的警告消息

在Python中导入TensorFlow可能会显示如下消息:

>>> import tensorflow as tf

...

2022-10-23 05:01:28.981482: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory

2022-10-23 05:01:28.981561: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory

2022-10-23 05:01:28.981576: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.

...

此消息是一条警告,指出安装缺少 TensorRT,这是一个专门用于深度学习推理的 SDK。深度学习模型分为两大类 – 推理和预测。稳定扩散是一种预测模型;它不需要TensorRT来运行。

3.4. 查看远端镜像

通过 SSH 查看远程服务器上的图像需要一些努力。作为生成图像之前的最后一步,创建设置以查看生成的图像。用于挂载和浏览本地文件系统上的远程目录。sshfs

检查是否在本地计算机上安装:sshfs

$ sshfs --version

安装它,如果它已经不是:

# apt install sshfs



$ brew install sshfs

在本地计算机上创建一个空目录:

$ mkdir ~/sshfs_mountpoint

在下一节中,您将生成的图像保存在服务器的主目录中。连接到服务器并挂载主目录:sshfs

$ sshfs -o follow_symlinks username@remote.server.ip.address:/home/username ~/sshfs_mountpoint

这允许您浏览(通过命令行或本地 GUI)远程目录,就好像它是本地目录一样。使用本地计算机上的查看程序查看映像,或将映像复制到本地目录。

注意:根据服务器的设置,如果在一段时间内未使用,连接可能会关闭。发生这种情况时,请重新连接(使用上述命令)并刷新 GUI 窗口。sshd_config

4. 生成图像

启动新的 Python 命令行并导入必要的模块。

Matplotlib用于保存生成的图像。

>>> import matplotlib.pyplot as plt

导入 Keras:

>>> from tensorflow import keras

将 Keras 设置为使用半精度浮点数(16 位而不是通常的 32 位):

>>> keras.mixed_precision.set_global_policy("mixed_float16")

这有助于加快 GPU 计算速度。

导入 KerasCV 模块:

>>> import keras_cv

稳定扩散被打包为KerasCV的一部分。

4.1. 默认设置

使用默认设置构建新的稳定扩散模型:

>>> model = keras_cv.models.StableDiffusion()

这将下载当前版本的文本编码器、扩散模型、解码器,并构造模型。

使用文本提示调用模型以生成图像:

>>> image = model.text_to_image(prompt='oil painting of a vulture wearing a christmas hat')

这将生成一个由单个图像组成的数组。将此映像保存到当前工作目录:

>>> plt.imsave('/home/username/vulture_pic.png', image[0])

使用(如第 3.4 节所述)查看保存的图像。sshfs

4.2. 高级设置

重新启动 Python 命令行以释放新模型的内存。导入 、 和以前一样。matplotlibkeraskeras_cv

4.2.1. 模型规格 – 图像分辨率

默认情况下, 构造一个新的稳定扩散模型来生成图像。可以使用参数和 :keras_cv.models.StableDiffusion()512x512img_heightimg_width

>>> model = keras_cv.models.StableDiffusion(img_height = 128, img_width = 128)

请注意,分辨率直接影响模型正常运行所需的 GPU 内存。

4.2.2. 图像生成

该函数接受以下参数:model.text_to_image

  • prompt:生成图像所依据的文本提示
  • batch_size:一次生成的图像数。默认值为 1。
  • num_steps:迭代次数 – 迭代次数越多,图像质量和细节越好。默认值为 25。此值越高,生成图像所需的时间就越长。此参数主要影响 CPU 使用时间。

例 1

生成低质量的单个图像:

 images = model.text_to_image(

    prompt =  'oil painting of a vulture wearing a christmas hat',

    batch_size = 1,

    num_steps = 5,

 )

例 2

生成一组 3 张高质量的图像:

 images = model.text_to_image(

    prompt =  'oil painting of a vulture wearing a christmas hat',

    batch_size = 3,

    num_steps = 50,

 )

上述示例中的输出是一个或多个图像的数组。

4.3. 保存多张图片

编写一个简单的函数,将多个生成的图像保存在一个数组中:

def save_images(images, file_name_with_path):

    for i in range(len(images)):

        plt.imsave(file_name_with_path + str(i+1) + '.png', images[i])

调用此函数为:

 save_images(images, '/home/username/christmas_vultr_')

这会将生成的图像及其文件名 、 等保存在主目录 中。用于查看保存的图像。christmas_vultr_1.pngchristmas_vultr_2.png/home/username/sshfs

4.4. 内存不足错误

由于稳定扩散依赖于 GPU,因此繁重的模型会导致系统内存不足。

内存不足错误消息如下所示:

2022-10-28 04:33:01.109327: I tensorflow/core/common_runtime/bfc_allocator.cc:1097] 1 Chunks of size 122713088 totalling 117.03MiB

2022-10-28 04:33:01.109335: I tensorflow/core/common_runtime/bfc_allocator.cc:1097] 2 Chunks of size 151781376 totalling 289.50MiB

2022-10-28 04:33:01.109344: I tensorflow/core/common_runtime/bfc_allocator.cc:1097] 2 Chunks of size 176947200 totalling 337.50MiB

...

Memory allocation details

...

2022-10-28 04:33:01.109362: I tensorflow/core/common_runtime/bfc_allocator.cc:1101] Sum Total of in-use chunks: 6.66GiB

2022-10-28 04:33:01.109370: I tensorflow/core/common_runtime/bfc_allocator.cc:1103] total_region_allocated_bytes_: 7365066752 memory_limit_: 7365066752 available bytes: 0 curr_region_allocation_bytes_: 14730133504

2022-10-28 04:33:01.109384: I tensorflow/core/common_runtime/bfc_allocator.cc:1109] Stats: 

Limit:                      7365066752

InUse:                      7151588096

MaxInUse:                   7151588352

NumAllocs:                        5650

MaxAllocSize:                176947200

Reserved:                            0

PeakReserved:                        0

LargestFreeBlock:                    0



2022-10-28 04:33:01.109467: W tensorflow/core/common_runtime/bfc_allocator.cc:491] ****************************************************************************************************

2022-10-28 04:33:01.113312: W tensorflow/core/framework/op_kernel.cc:1768] RESOURCE_EXHAUSTED: failed to allocate memory



Traceback (most recent call last):

...

Detailed stack trace

...

很难准确预测导致系统内存不足的所有参数。以下是截至 2022 年 10 月在具有 NVIDIA A100 GPU 的 10 GB GPU 内存份额的虚拟机上观察到内存不足错误的一些示例场景:

  • 在同一个 Python 会话中构造两个模型(通过调用函数两次)keras_cv.StableDiffusion
  • 尝试使用高分辨率 (1024×1024) 模型生成图像;构建模型本身不是问题
  • 尝试在单次传递中生成大量图像(使用大批量)

如果遇到内存不足错误,请降低模型的内存要求(例如,通过以较低的分辨率构造模型),或使用具有更多 GPU RAM 的 VM。

5. 许可

Stability AI 已根据 Creative ML OpenRAIL-M 许可证向公众发布了该模型。它允许商业和非商业用途。该许可证的重点是确保该模型的道德和合法使用。它还要求许可证本身包含在模型的任何分发中,包括最终用户。

赞(0)
未经允许不得转载:主机百科 » 使用 Keras 和 TensorFlow 实现稳定的扩散