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

SDXL基于Standard适配PyTorch NPU的Finetune训练指导(6.3.905)

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

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

获取软件和镜像

表1 获取软件和镜像

分类

名称

获取路径

插件代码包

AscendCloud-3rdAIGC-6.3.905-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-20240528150158-b521cc0

SWR上拉取

表2 模型镜像版本

模型

版本

CANN

cann_8.0.rc2

PyTorch

2.1.0

约束限制

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

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 准备代码

获取软件和镜像中,下载并解压代码包。本文档主要使用ascendcloud-aigc-poc-sdxl-finetune文件夹中的文件,请利用OBS Browser+工具将文件夹中内容上传至OBS的代码文件夹code中。

obs://<bucket_name>/code
├── attention_processor.py
├── config.yaml
├── diffusers_finetune_train.sh
├── train_text_to_image_sdxl-0212.py

Step4 下载模型依赖包

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

Step5 下载数据集

本案例使用Huggingface提供的pokemon-blip-captions数据集,官网下载地址:https://huggingface.co/datasets/lambdalabs/pokemon-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_finetune_train.sh /home/ma-user/sdxl-train/user-job-dir/code/diffusers_finetune_train.sh
    COPY --chown=ma-user:ma-group train_text_to_image_sdxl-0212.py /home/ma-user/sdxl-train/user-job-dir/code/train_text_to_image_sdxl-0212.py
    COPY --chown=ma-user:ma-group config.yaml /home/ma-user/sdxl-train/user-job-dir/code/config.yaml
    
    COPY --chown=ma-user:ma-group stable-diffusion-xl-base-1.0 /home/ma-user/sdxl-train/stable-diffusion-xl-base-1.0
    COPY --chown=ma-user:ma-group vae-fp16-fix /home/ma-user/sdxl-train/vae-fp16-fix
    COPY --chown=ma-user:ma-group datasets /home/ma-user/sdxl-train/datasets
    
    RUN pip install  accelerate datasets transformers diffusers
    RUN source /etc/bashrc && pip install  deepspeed
    COPY --chown=ma-user:ma-group attention_processor.py /home/ma-user/anaconda3/envs/PyTorch-2.1.0/lib/python3.9/site-packages/diffusers/models/attention_processor.py

    把ascendcloud-aigc-poc-sdxl-finetune代码文件夹文件、模型依赖包、数据集、Dockerfile文件都上传至ECS,上传步骤可参考本地Windows主机使用WinSCP上传文件到Linux云服务器

    文件上传后目录如下:

    <ECS_folder>
    ├── attention_processor.py               #  ascendcloud-aigc-poc-sdxl-finetune代码文件夹文件
    ├── config.yaml                          #  ascendcloud-aigc-poc-sdxl-finetune代码文件夹文件
    ├── diffusers_finetune_train.sh          #  ascendcloud-aigc-poc-sdxl-finetune代码文件夹文件
    ├── train_text_to_image_sdxl-0212.py     #  ascendcloud-aigc-poc-sdxl-finetune代码文件夹文件
    ├── Dockerfile                           #  Dockerfile文件
    ├── vae-fp16-fix                         #  模型依赖包vae-fp16-fix
    ├── stable-diffusion-xl-base-1.0x        #  模型依赖包stable-diffusion-xl-base-1.0x
    ├── datasets                             #  新建datasets文件夹,pokemon-blip-captions数据集放在该目录下
          ├── lambdalabs___pokemon-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_finetune_train.sh。
    sh /home/ma-user/sdxl-train/user-job-dir/code/diffusers_finetune_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: 8*ascend-snt9b。如果需要多机训练,增加计算节点个数即可,启动脚本文件diffusers_finetune_train.sh支持多机训练。
    图5 选择资源池规格
  • 作业日志路径:选择输出日志到OBS的指定目录。
    图6 选择作业日志路径

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

图7 训练完成

相关文档