SDXL基于Standard适配PyTorch NPU的LoRA训练指导(6.3.908)
Stable Diffusion(简称SD)是一种基于扩散过程的图像生成模型,应用于文生图场景,能够帮助用户生成图像。SDXL LoRA是指在已经训练好的SDXL模型基础上,使用新的数据集进行LoRA微调。
本文档主要介绍如何在ModelArts Standard上,利用训练框架PyTorch_npu+华为自研Ascend Snt9B硬件,完成SDXL LoRA训练。
获取软件和镜像
分类 |
名称 |
获取路径 |
---|---|---|
插件代码包 |
AscendCloud-6.3.908软件包中的AscendCloud-AIGC-6.3.908-xxx.zip 文件名中的xxx表示具体的时间戳,以包名发布的实际时间为准。 |
获取路径:Support-E
说明:
如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。 |
基础镜像包 |
swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc3-py_3.9-hce_2.0.2312-aarch64-snt9b-20240824153350-cebb080 |
SWR上拉取。 |
模型 |
版本 |
---|---|
CANN |
cann_8.0.rc3 |
驱动 |
23.0.6 |
PyTorch |
2.1.0 |
约束限制
- 本文档适配昇腾云ModelArts 6.3.908版本,请参考获取软件和镜像获取配套版本的软件包和镜像,请严格遵照版本配套关系使用本文档。
- 训练作业使用单机单卡资源。
- 确保容器可以访问公网。
- 本案例仅支持在专属资源池上运行。
Step1 创建专属资源池
本文档中的模型运行环境是ModelArts Standard,用户需要购买专属资源池,具体步骤请参考创建资源池。
资源规格要求:
- 硬盘空间:至少200GB。
- 昇腾资源规格:Ascend: 8*ascend-snt9b表示昇腾8卡规格。
- 推荐使用“西南-贵阳一”Region上的昇腾资源。
Step2 创建OBS桶
ModelArts使用对象存储服务(Object Storage Service,简称OBS)进行数据存储以及模型的备份和快照,实现安全、高可靠和低成本的存储需求。因此,在使用ModelArts之前通常先创建一个OBS桶,然后在OBS桶中创建文件夹用于存放数据。
本文档需要将运行代码以及输入输出数据存放OBS,请提前创建OBS(参考创建OBS桶),例如桶名:sdxl-train。并在该桶下创建文件夹目录用于后续存储代码使用,例如:code。
Step3 准备代码
在获取软件和镜像中,下载并解压代码包。本文档主要使用aigc_train->torch_npu->diffusers下的部分文件,请利用OBS Browser+工具将文件夹中内容上传至OBS的代码文件夹code中。
obs://<bucket_name>/code ├── diffusers-train.patch ├── prepare.sh ├── diffusers_sdxl_lora_train.sh
Step4 下载模型依赖包
请在如下链接中下载好模型依赖包。
- 下载stable-diffusion-xl-base-1.0,官网下载地址:https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main
- 下载vae-fp16-fix,官网下载地址:https://huggingface.co/madebyollin/sdxl-vae-fp16-fix/tree/main
Step5 下载数据集
本案例使用Huggingface提供的naruto-blip-captions数据集,官网下载地址:https://huggingface.co/datasets/lambdalabs/naruto-blip-captions/tree/main
Step6 准备镜像
- 创建ECS。
参考ECS文档购买弹性云服务器。网络配置、高级配置等后续步骤,可根据默认选择,或进行自定义。创建完成后,单击“远程登录”,并在控制台发送后续步骤中的远程命令。
注意:创建的ECS虚拟机使用ARM镜像创建。
图1 购买ECS
- 安装Docker。
- 检查docker是否安装。
docker -v #检查docker是否安装
如尚未安装,运行以下命令安装docker。
yum install -y docker
- 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。
sysctl -p | grep net.ipv4.ip_forward
如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
- 检查docker是否安装。
- 构建自定义镜像。
基于官方提供的基础镜像构建自定义镜像sdxl-train:0.0.1。参考如下命令编写Dockerfile文件。镜像地址{image_url}请参见获取软件和镜像。
FROM {image_url} RUN mkdir /home/ma-user/sdxl-train && mkdir /home/ma-user/sdxl-train/user-job-dir && mkdir /home/ma-user/sdxl-train/user-job-dir/code COPY --chown=ma-user:ma-group diffusers_sdxl_lora_train.sh /home/ma-user/sdxl-train/user-job-dir/code/diffusers_sdxl_lora_train.sh COPY --chown=ma-user:ma-group diffusers-train.patch /home/ma-user/sdxl-train/diffusers-train.patch COPY --chown=ma-user:ma-group prepare.sh /home/ma-user/sdxl-train/prepare.sh RUN cd /home/ma-user/sdxl-train && sh prepare.sh COPY --chown=ma-user:ma-group stable-diffusion-xl-base-1.0 /home/ma-user/stable-diffusion-xl-base-1.0 COPY --chown=ma-user:ma-group vae-fp16-fix /home/ma-user/vae-fp16-fix COPY --chown=ma-user:ma-group datasets /home/ma-user/datasets
把上述代码文件、模型依赖包、数据集、Dockerfile文件都上传至ECS,上传步骤可参考本地Windows主机使用WinSCP上传文件到Linux云服务器。
文件上传后目录如下:
<ECS_folder> ├── diffusers_sdxl_lora_train.sh # 华为侧提供的代码文件 ├── diffusers-train.patch # 华为侧提供的代码文件 ├── prepare.sh # 华为侧提供的代码文件 ├── Dockerfile # Dockerfile文件 ├── vae-fp16-fix # 模型依赖包vae-fp16-fix ├── stable-diffusion-xl-base-1.0 # 模型依赖包stable-diffusion-xl-base-1.0 ├── datasets # 新建datasets文件夹,naruto-blip-captions数据集放在该目录下 ├── naruto-blip-captions
在该目录下执行命令构建自定义镜像:
docker build -t sdxl-train:0.0.1 .
- 在SWR服务页面创建镜像组织。
图2 创建镜像组织
- 在SWR中单击右上角的“登录指令”,然后在跳出的登录指定窗口,单击复制临时登录指令。在创建的ECS中复制临时登录指令,即可完成登录。
图3 复制登录指令
- 修改并上传镜像。
在ECS中输入上一步的登录指令后,使用下列示例命令:
docker tag {image_url} swr.myhuaweicloud.com/<组织名称>/<镜像名称>:<tag> docker push swr.myhuaweicloud.com/<组织名称>/<镜像名称>:<tag>
参数说明:
<组织名称>:步骤4中创建的组织名称。
<镜像名称>:<tag>:定义镜像名称。示例:sdxl-train:0.0.1。
Step7 创建训练作业
创建训练作业,填下如下参数。
- 创建方式:选择自定义算法,启动方式选择自定义,然后选择上传到SWR的自定义镜像。
- 代码目录:选择上传到OBS的代码文件夹,例如/sdxl-train/code。若用户需要修改代码文件,可修改OBS桶中代码文件,创建训练作业时,会将OBS的code目录复制到训练容器的/home/ma-user/sdxl-train/user-job-dir/目录下,覆盖容器中原有的code目录。
- 启动命令:将华为侧优化后代码文件复制到工作目录后,运行启动脚本文件diffusers_sdxl_lora_train.sh。
cd /home/ma-user/sdxl-train/user-job-dir/code && cp /home/ma-user/sdxl-train/train_text_to_image_lora_sdxl.py ./ && sh diffusers_sdxl_lora_train.sh
- 本地代码目录:保持默认即可。
- 工作目录:选择代码文件目录,例如/home/ma-user/sdxl-train/user-job-dir/code/。
- 输出:单击“增加训练输出”,将模型保存到OBS中。参数名称为output,数据存储位置选择OBS桶中制定文件夹,例如sdxl-train/checkpoint,获取方式选择环境变量,/home/ma-user/modelarts/outputs/output_0下的模型文件会保存到OBS中。
图4 选择镜像
- 资源池:选择专属资源池,规格选择Ascend: 1*ascend-snt9b。
图5 选择资源池规格
- 作业日志路径:选择输出日志到OBS的指定目录。
图6 选择作业日志路径
填写参数完成后,提交创建训练任务,训练完成后,作业状态会显示为已完成。
Step8 断点续训
查看训练日志,在训练任务启动后,当训练超过500步后开始保存checkpoint文件,保存成功后,手动终止训练任务。
然后单击重建后提交。
提交新的任务时,注意将预下载到本地目录勾上。
观察启动日志,启动会读取最新的checkpoint模型文件,接着上次保存的step位置开始训练。