扩散模型能够根据文本提示生成逼真的图像,这种能力促进了生成式人工智能的普及。人们已经开始把这些模型用在包括数据合成及内容创建在内的多个应用领域。 Hugging Face Hub 包含超过 5 千个预训练的文生图 模型。这些模型与 Diffusers 库 结合使用,使得构建图像生成工作流或者对不同的图像生成工作流进行实验变得无比简单。
和 transformer 模型一样,你可以微调扩散模型以让它们生成更符合特定业务需求的内容。起初,大家只能用 GPU 进行微调,但情况正在发生变化!几个月前,英特尔 推出 了代号为 Sapphire Rapids 的第四代至强 CPU。Sapphire Rapids 中包含了英特尔先进矩阵扩展 (Advanced Matrix eXtension,AMX),它是一种用于深度学习工作负载的新型硬件加速器。在之前的几篇博文中,我们已经展示了 AMX 的优势: 微调 NLP transformers 模型、对 NLP transformers 模型进行推理,以及 对 Stable Diffusion 模型进行推理。
本文将展示如何在英特尔第四代至强 CPU 集群上微调 Stable Diffusion 模型。我们用于微调的是 文本逆向 (Textual Inversion) 技术,该技术仅需少量训练样本即可对模型进行有效微调。在本文中,我们仅用 5 个样本就行了!
我们开始吧。
英特尔 的小伙伴给我们提供了 4 台托管在 英特尔开发者云 (Intel Developer Cloud,IDC) 上的服务器。IDC 作为一个云服务平台,提供了一个英特尔深度优化的、集成了最新英特尔处理器及 最优性能软件栈 的部署环境,用户可以很容易地在此环境上开发、运行其工作负载。
我们得到的每台服务器均配备两颗英特尔第四代至强 CPU,每颗 CPU 有 56 个物理核和 112 个线程。以下是其 lscpu
的输出:
我们把四台服务器的 IP 地址写到 nodefile
文件中,其中,第一行是主服务器。
分布式训练要求主节点和其他节点之间实现无密码 ssh
通信。如果你对此不是很熟悉,可以参考这篇 文章,并跟着它一步步设置好无密码 ssh
。
接下来,我们在每个节点上搭建运行环境并安装所需软件。我们特别安装了两个英特尔优化库: 用于管理分布式通信的 oneCCL 以及 Intel Extension for PyTorch (IPEX),IPEX 中包含了能充分利用 Sapphire Rapids 中的硬件加速功能的软件优化。我们还安装了 libtcmalloc
,它是一个高性能内存分配库,及其软件依赖项 gperftools
。
下面,我们在每个节点上克隆 diffusers 代码库并进行源码安装。
紧接着,我们需要使用 IPEX 对 diffusers/examples/textual_inversion
中的微调脚本进行一些优化,以将 IPEX 对推理模型的优化包含在内 (译者注: diffusers
的设计中,其 pipeline
与 transformers 的 pipeline
虽然名称相似,但无继承关系,所以其子模型的推理优化无法在库内完成,只能在脚本代码内完成。而 Clip-Text 模型的微调由于使用了 accelerate
,所以其优化可由 accelerate
完成)。我们导入 IPEX 并对 U-Net 和变分自编码器 (VAE) 模型进行推理优化。最后,不要忘了这个改动对每个节点的代码都要做。
最后一步是下载 训练图像。一般我们会使用共享 NFS 文件夹,但为了简单起见,这里我们选择在每个节点上下载图像。请确保训练图像的目录在所有节点上的路径都相同 ( /home/devcloud/dicoo
)。
下面展示了我们使用的训练图像:
至此,系统配置就完成了。下面,我们开始配置训练任务。
使用 accelerate 库让分布式训练更容易。我们需要在每个节点上运行 acclerate config
并回答一些简单问题。
下面是主节点的屏幕截图。在其他节点上,你需要将 rank
设置为 1、2 和 3,其他答案保持不变即可。
最后,我们需要在主节点上设置一些环境变量。微调任务启动时,这些环境变量会传播到其他节点。第一行设置连接到所有节点运行的本地网络的网络接口的名称。你可能需要使用 ifconfig
来设置适合你的网络接口名称。
好了,现在我们可以启动微调了。
我们使用 mpirun
启动微调,它会自动在 nodefile
中列出的节点之间建立分布式通信。这里,我们运行 16 个进程 ( -n
),其中每个节点运行 4 个进程 ( -ppn
)。 Accelerate
库会自动在所有进程间建立分布式的训练。
我们启动下面的命令训练 200 步,仅需约 5 分钟。
下面的截图显示了训练过程中集群的状态:
分布式训练有时候会出现一些棘手的问题,尤其是当你新涉足于此。单节点上的小的配置错误是最可能出现的问题: 缺少依赖项、图像存储在不同位置等。
你可以登录各个节点并在本地进行训练来快速定位问题。首先,设置与主节点相同的环境,然后运行:
如果训练成功启动,就停止它并移至下一个节点。如果在所有节点上训练都成功启动了,请返回主节点并仔细检查 nodefile
、环境以及 mpirun
命令是否有问题。不用担心,最终你会找到问题的 :)。
经过 5 分钟的训练,训得的模型就保存在本地了,我们可以直接用 diffusers
的 pipeline
加载该模型并进行图像生成。但这里,我们要使用 Optimum Intel 和 OpenVINO 以进一步对模型进行推理优化。正如 上一篇文章 中所讨论的,优化后,仅用单颗 CPU 就能让你在不到 5 秒的时间内生成一幅图像!
我们用下面的代码来加载模型,并对其针对固定输出形状进行优化,最后保存优化后的模型:
然后,我们加载优化后的模型,生成 5 张不同的图像并保存下来:
下面是其生成的图像。令人惊艳的是,模型只需要五张图像就知道 dicoo
是戴眼镜的!
你还可以对模型进行更多的微调,以期获得更好的效果。下面是一个经 3 千步 (大约一个小时) 微调而得的模型生成的图像,效果相当不错。
得益于 Hugging Face 和英特尔的深度合作,现在大家可以用至强 CPU 服务器来生成满足各自业务需求的高质量图像。而 CPU 通常比 GPU 等专用硬件更便宜且更易得,同时至强 CPU 还是个多面手,它可以轻松地用于其他生产任务,如 Web 服务器、数据库等等不一而足。因此,CPU 理所当然地成为了 IT 基础设施的一个功能全面且灵活的备选方案。
以下资源可供入门,你可按需使用:
Diffusers 文档
Optimum Intel 文档
GitHub 上的 英特尔 IPEX
英特尔和 Hugging Face 的 开发者资源
IDC、AWS 、GCP 以及 阿里云 上的第四代至强 CPU 实例
如果你有任何疑问或反馈,欢迎到 Hugging Face 论坛 留言。
感谢垂阅!
英文原文: https://hf.co/blog/stable-diffusion-finetuning-intel
原文作者: Julien Simon
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。
审校/排版: zhongdongy (阿东)