文档首页/ AI开发平台ModelArts/ 最佳实践/ AIGC模型训练推理/ SDXL基于Standard适配PyTorch NPU的LoRA训练指导(6.3.907)
更新时间:2024-10-22 GMT+08:00
分享

SDXL基于Standard适配PyTorch NPU的LoRA训练指导(6.3.907)

Stable Diffusion(简称SD)是一种基于扩散过程的图像生成模型,应用于文生图场景,能够帮助生成图像。SDXL LoRA是指在已经训练好的SDXL模型基础上,使用新的数据集进行LoRA微调。

本文档主要介绍如何在ModelArts Standard上,利用训练框架PyTorch_npu+华为自研Ascend Snt9B硬件,完成SDXL LoRA训练。

获取软件和镜像

表1 获取软件和镜像

分类

名称

获取路径

插件代码包

AscendCloud-6.3.907软件包中的AscendCloud-AIGC-6.3.907-xxx.zip

文件名中的xxx表示具体的时间戳,以包名发布的实际时间为准。

获取路径:Support-E

说明:

如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。

基础镜像包

swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240727152329-0f2c29a

SWR上拉取。

表2 模型镜像版本

模型

版本

CANN

cann_8.0.rc2

驱动

23.0.6

PyTorch

2.1.0

约束限制

  • 本文档适配昇腾云ModelArts 6.3.907版本,请参考获取软件和镜像获取配套版本的软件包和镜像,请严格遵照版本配套关系使用本文档。
  • 训练作业使用单机单卡资源。
  • 确保容器可以访问公网。
  • 本案例仅支持在专属资源池上运行。

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 下载模型依赖包

请在如下链接中下载好模型依赖包。

Step5 下载数据集

本案例使用Huggingface提供的naruto-blip-captions数据集,官网下载地址:https://huggingface.co/datasets/lambdalabs/naruto-blip-captions/tree/main

Step6 准备镜像

  1. 创建ECS。

    参考ECS文档购买弹性云服务器。网络配置、高级配置等后续步骤,可根据默认选择,或进行自定义。创建完成后,单击“远程登录”,并在控制台发送后续步骤中的远程命令。

    注意:创建的ECS虚拟机使用ARM镜像创建。

    图1 购买ECS

  2. 安装Docker。

    1. 检查docker是否安装。
      docker -v   #检查docker是否安装

      如尚未安装,运行以下命令安装docker。

      yum install -y docker
    2. 配置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

  3. 构建自定义镜像。

    基于官方提供的基础镜像构建自定义镜像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 .

  4. 在SWR服务页面创建镜像组织。

    图2 创建镜像组织

  5. 在SWR中单击右上角的“登录指令”,然后在跳出的登录指定窗口,单击复制临时登录指令。在创建的ECS中复制临时登录指令,即可完成登录。

    图3 复制登录指令

  6. 修改并上传镜像。

    在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 选择作业日志路径

填写参数完成后,提交创建训练任务,训练完成后,作业状态会显示为已完成。

图7 训练启动成功

Step8 断点续训

查看训练日志,在训练任务启动后,当训练超过500步后开始保存checkpoint文件,保存成功后,手动终止训练任务。

图8 保存checkpoint文件

然后单击重建后提交。

图9 重建训练作业

提交新的任务时,注意将预下载到本地目录勾上。

图10 勾选预下载到本地目录

观察启动日志,启动会读取最新的checkpoint模型文件,接着上次保存的step位置开始训练。

图11 读取最新的checkpoint模型文件

相关文档