使用 Hugging Face Diffusers 在 Intel Sapphire Rapids CPU 上微调 Stable Diffusion

Hugging Face 展示了如何仅使用五张示例图像,通过文本反转(textual inversion)在 Intel Sapphire Rapids CPU 上微调 Stable Diffusion 模型,演示了通过 Intel Extension for PyTorch 和 oneCCL 实现的基于 CPU 的微调。

集群设置

四台 Intel Xeon Platinum 8480+ 服务器,每台配备两颗 Sapphire Rapids CPU,为分布式微调提供 224 个逻辑核心(每个插槽 56 个物理核心和 112 个线程)。lscpu 输出确认了架构、核心数、线程数以及 AMX 指令集的存在。服务器通过 IP 地址 192.168.20.2、192.168.21.2、192.168.22.2 和 192.168.23.2 进行访问,这些地址已列在 MPI 的 nodefile 中。

软件环境与依赖项

该环境使用 Python 3.9、PyTorch CPU 版本、Transformers、Accelerate 版本 0.19.0、oneCCL for PyTorch 绑定、Intel Extension for PyTorch (IPEX) 以及用于 tcmalloc 的 gperftools。在创建名为 diffuser 的 conda 环境后,使用 pip 和 conda 安装依赖项。Diffusers 仓库从 GitHub 克隆并在每个节点上从源码安装。

准备数据和模型代码

sd-concepts-library/dicoo 数据集中下载五张示例图像,并放置在每个节点的 /home/devcloud/dicoo 中。需要编辑文本反转脚本 (examples/textual_inversion/textual_inversion.py),导入 intel_extension_for_pytorch 并对 U-Net 和 VAE 模型应用 ipex.optimize,使用训练数据类型 (bf16)。在启动作业之前,必须在所有节点上应用此修改。

配置分布式作业

在主节点上设置环境变量并传播到工作节点:I_MPI_HYDRA_IFACE 选择网络接口,oneccl_bindings_for_pytorch_path 定位 oneCCL 绑定,LD_PRELOAD 包含 OpenMP 和 tcmalloc 库,CCL_ATL_TRANSPORT 设置为 ofiCCL_WORKER_COUNT 设置为 1。模型名称定义为 runwayml/stable-diffusion-v1-5,数据目录为 /home/devcloud/dicoo

运行微调

使用 mpirun -f nodefile -n 16 -ppn 4 启动微调作业,这会启动 16 个 MPI 进程(每个节点 4 个)。accelerate launch 命令运行修改后的文本反转脚本,参数如下:--pretrained_model_name_or_path=$MODEL_NAME --train_data_dir=$DATA_DIR --learnable_property="object" --placeholder_token="<dicoo>" --initializer_token="toy" --resolution=512 --train_batch_size=1 --seed=7 --gradient_accumulation_steps=1 --max_train_steps=200 --learning_rate=2.0e-03 --scale_lr --lr_scheduler="constant" --lr_warmup_steps=0 --output_dir=./textual_inversion_output --mixed_precision bf16 --save_as_full_pipeline。如繁忙集群截图所示,200 步的训练大约在五分钟内完成。

分布式训练故障排除

如果分布式作业失败,建议的方法是登录每个节点,复制主节点的环境,并使用相同的参数在本地运行训练脚本。本地运行成功表明节点的依赖项和数据路径正确;否则,会暴露缺失的依赖项或错误的图像位置。在确认所有节点都能在本地工作后,返回主节点重新检查 nodefile、环境变量和 mpirun 命令。

使用微调后的模型生成图像

训练完成后,使用 Optimum Intel 和 OpenVINO 对模型进行导出和优化:OVStableDiffusionPipeline.from_pretrained(model_id, export=True),随后执行 ov_pipe.reshape(batch_size=5, height=512, width=512, num_images_per_prompt=1)ov_pipe.save_pretrained。如前文所述,加载优化后的流水线 (OVStableDiffusionPipeline.from_pretrained(model_id, num_inference_steps=20)) 并使用提示词 ["a yellow <dicoo> robot at the beach, high quality" * 5],在单个 CPU 上不到五秒内即可生成五张图像。生成的图像表明,模型仅通过五张训练图像就学习到了新概念——具体来说是 dicoos 戴着眼镜。运行 3,000 步(约一小时)会产生更高质量的结果。

结论

Xeon Sapphire Rapids CPU 为 Stable Diffusion 模型的微调和推理提供了一种经济实惠、广泛可用且可重复使用的 GPU 替代方案。由于相同的 CPU 可以服务于 Web 服务器或数据库等其他工作负载,因此对于希望在不投资专用硬件的情况下采用生成式 AI 的企业来说,它们提供了一个灵活的选择。

Sources