文档首页/ AI开发平台ModelArts/ 最佳实践/ 视频生成模型训练推理/ Wan2.1系列文/图生视频模型基于ModelArts Lite Server适配PyTorch NPU训练指导(6.5.906)
更新时间:2025-09-08 GMT+08:00
分享

Wan2.1系列文/图生视频模型基于ModelArts Lite Server适配PyTorch NPU训练指导(6.5.906)

方案概览

Wan2.1是一套全面而开放的视频基础模型,它突破了视频生成的界限,是一个能够生成中英文文本的视频模型,具有强大的视频生成功能,可增强其实际应用。

本文主要介绍如何在ModelArts的Lite Server环境中,使用NPU卡对Wan2.1模型进行文/图生视频训练。完成本方案的部署,需要先联系您所在企业的华为方技术支持购买Server资源。

本方案支持的模型包含Wan2.1-T2V-14B-Diffusers、Wan2.1-T2V-1.3B-Diffusers、Wan2.1-I2V-14B-480P-Diffusers和Wan2.1-I2V-14B-720P-Diffusers。

资源规格要求

推荐使用“西南-贵阳一”Region上的Server资源Ascend Snt9B单机或Ascend Snt9B23单机资源。

表1 Ascend Snt9B 环境要求

名称

版本

driver

24.1.0.6

PyTorch

pytorch_2.5.1

表2 Ascend Snt9B23 环境要求

名称

版本

driver

24.1.RC3.7

PyTorch

pytorch_2.5.1

获取软件和镜像

表3 获取镜像

分类

名称

获取路径

插件代码包

AscendCloud-AIGC-6.5.906-xxx.zip

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

获取路径:Support-E,在此路径中查找下载ModelArts 6.5.906版本。

说明:

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

基础镜像

Snt9B:西南-贵阳一:

swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.2.rc1-py_3.11-hce_2.0.2503-aarch64-snt9b-20250729103313-3a25129

Snt9B23:西南-贵阳一:

swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.2.rc1-py_3.11-hce_2.0.2503-aarch64-snt9b23-20250729103313-3a25129

从SWR拉取。

约束限制

  • 本文档适配昇腾云ModelArts 6.5.906版本,请参考表3获取配套版本的软件包和镜像,请严格遵照版本配套关系使用本文档。
  • 确保容器可以访问公网。

步骤一:准备环境

  1. 请参考Lite Server资源开通,购买Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。

    当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据

  2. SSH登录机器后,检查NPU设备状态。运行如下命令,返回NPU设备信息。
    npu-smi info                    # 在每个实例节点上运行此命令可以看到NPU卡状态
    npu-smi info -l | grep Total    # 在每个实例节点上运行此命令可以看到总卡数

    如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。

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

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

    yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
  4. 配置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

因训练过程中使用磁盘空间大,建议挂载1T以上磁盘。

步骤二:获取基础镜像

建议使用官方提供的镜像部署服务。镜像地址{image_url}参见表3

docker pull {image_url}

步骤三:启动容器镜像

  1. Snt9B23启动容器镜像。启动前请先按照参数说明修改${}中的参数。
    export work_dir="自定义挂载的工作目录"
    export container_work_dir="自定义挂载到容器内的工作目录"
    export container_name="自定义容器名称"
    export image_name="镜像名称或ID"
    // 启动一个容器去运行镜像 
    docker run -itd \
        --network=host \
        --privileged \
        --device=/dev/davinci_manager \
        --device=/dev/devmm_svm \
        --device=/dev/hisi_hdc \
        --shm-size=256g \
        -v /usr/local/dcmi:/usr/local/dcmi \
        -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
        -v /var/log/npu/:/usr/slog \
        -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
        -v ${work_dir}:${container_work_dir} \
        --name ${container_name} \
        ${image_name} \
        /bin/bash
  2. Snt9B启动容器镜像。启动前请先按照参数说明修改${}中的参数。
    export work_dir="自定义挂载的工作目录"
    export container_work_dir="自定义挂载到容器内的工作目录"
    export container_name="自定义容器名称"
    export image_name="镜像名称或ID"
    // 启动一个容器去运行镜像 
    docker run -itd \
        --network=host \
        --device=/dev/davinci0 \
        --device=/dev/davinci1 \
        --device=/dev/davinci2 \
        --device=/dev/davinci3 \
        --device=/dev/davinci4 \
        --device=/dev/davinci5 \
        --device=/dev/davinci6 \
        --device=/dev/davinci7 \
        --device=/dev/davinci_manager \
        --device=/dev/devmm_svm \
        --device=/dev/hisi_hdc \
        --shm-size=256g \
        -v /usr/local/dcmi:/usr/local/dcmi \
        -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
        -v /var/log/npu/:/usr/slog \
        -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
        -v ${work_dir}:${container_work_dir} \
        --name ${container_name} \
        ${image_name} \
        /bin/bash

    参数说明:

    • -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下可存放项目所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。
      • 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。
      • driver及npu-smi需同时挂载至容器。
    • --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。
    • ${image_name}:容器镜像的名称。
    • --device=/dev/davinci0 :挂载对应卡到容器,当需要挂载多卡,请依次添加多项该配置。
  3. Snt9B通过容器名称进入容器中。默认使用ma-user用户,后续所有操作步骤都在ma-user用户下执行。
    docker exec -it ${container_name} bash
  4. Snt9B23需要使用root权限进入容器中。
    docker exec -itu root ${container_name} bash

步骤四:安装依赖和软件包

  1. 拉取代码。
    mkdir MindSpeed_Dir
    cd MindSpeed_Dir
    git config --global http.sslVerify false
    git clone https://gitee.com/ascend/MindSpeed-MM.git
    cd MindSpeed-MM
    git checkout de390d902b57621cd900fa343ea62168bd578bc9
    cd ..  
    git clone https://github.com/NVIDIA/Megatron-LM.git 
    cd Megatron-LM 
    git checkout core_r0.8.0 
    cp -r megatron ../MindSpeed-MM/ 
    cd ../MindSpeed-MM

    修改/home/ma-user/MindSpeed_Dir/MindSpeed-MM/pyproject.toml文件中20行torch的版本为2.5.1,修改后的内容如下图所示。

  2. 安装加速库。
    git clone https://gitee.com/ascend/MindSpeed.git 
    cd MindSpeed 
    git checkout 4d9041071da5214e038ebf9f76e8574a60c89c2e
    pip install -r requirements.txt  
    pip install -e .
    cd ..  
    pip install -e .  
    pip install diffusers==0.33.1
  3. 安装依赖Decord。
    确保服务器网络正常,确保yum可以正常使用,确保git可以正常clone。
    export BUILD_ROOT_PATH=/home/ma-user/MindSpeed_Dir # 改成实际需要安装的根目录
    
    cd /home/ma-user/MindSpeed_Dir
    sudo yum install -y autoconf automake bzip2 bzip2-devel freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel
     
    curl -O -L -k https://github.com/Kitware/CMake/releases/download/v3.19.3/cmake-3.19.3-Linux-aarch64.sh
    chmod +x cmake-3.19.3-Linux-aarch64.sh
    sudo ./cmake-3.19.3-Linux-aarch64.sh --skip-license --prefix=/usr/local
    sudo /usr/local/bin/cmake -version
    
    mkdir ./ffmpeg_sources
    cd ./ffmpeg_sources
    sudo yum install nasm
    
    cd ../
    curl -O -L -k https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
    tar xzf yasm-1.3.0.tar.gz
    cd yasm-1.3.0
    sudo ./configure --prefix="$BUILD_ROOT_PATH/ffmpeg_build" --bindir="$HOME/bin"
    sudo make -j$(nproc)
    sudo make install
    
    cd ../
    git clone --depth 1 https://code.videolan.org/videolan/x264.git
    cd x264
    export PATH="$HOME/bin:$PATH"
    sudo PKG_CONFIG_PATH="$BUILD_ROOT_PATH/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$BUILD_ROOT_PATH/ffmpeg_build" --bindir="$HOME/bin" --enable-shared --enable-pic
    sudo make -j$(nproc)
    sudo make install
    
    cd ../
    git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
    cd libvpx
    export PATH="$HOME/bin:$PATH"
    sudo ./configure --prefix="$BUILD_ROOT_PATH/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm --enable-shared --enable-pic
    sudo make -j$(nproc)
    sudo make install
    
    cd ../
    curl -O -L -k https://ffmpeg.org/releases/ffmpeg-4.1.6.tar.bz2
    tar xjf ffmpeg-4.1.6.tar.bz2
    cd ffmpeg-4.1.6
    export PATH="$HOME/bin:$PATH"
    sudo PKG_CONFIG_PATH="$BUILD_ROOT_PATH/ffmpeg_build/lib/pkgconfig" ./configure \
      --prefix="/$BUILD_ROOT_PATH/ffmpeg_build" \
      --extra-cflags="-I$BUILD_ROOT_PATH/ffmpeg_build/include" \
      --extra-ldflags="-L$BUILD_ROOT_PATH/ffmpeg_build/lib" \
      --extra-libs=-lpthread \
      --extra-libs=-lm \
      --bindir="$HOME/bin" \
      --enable-gpl \
      --enable-libvpx \
      --enable-libx264 \
      --enable-nonfree \
      --disable-static \
      --enable-shared \
      --enable-pic
    sudo make -j$(nproc)
    sudo make install
    
    cd $BUILD_ROOT_PATH
    git clone https://github.com/dmlc/decord.git
    cd decord
    git submodule update --init --recursive
    
    sudo mkdir -p build
    
    sudo /usr/local/bin/cmake . -DUSE_CUDA=0 -DFFMPEG_DIR=$BUILD_ROOT_PATH/ffmpeg_build
    sudo make -j$(nproc)
    sudo cp libdecord.so /usr/local/lib/
    sudo cp libdecord.so ./python/decord/libdecord.so
    
    cd python
    pip install numpy
    
    sudo chown ma-user:ma-group decord/libdecord.so
    python setup.py install
    
    # 执行如下指令不报错,证明decord安装成功
    python -c "import decord; from decord import VideoReader"
  4. 安装加速库APEX。
    cd /home/ma-user/MindSpeed_Dir
    git clone -b master https://gitee.com/ascend/apex.git
    cd apex/
    bash scripts/build.sh --python=3.11
    cd apex/dist/
    pip install --upgrade *.whl
  5. 下载模型权重https://huggingface.co/Wan-AI。
    1. 下载文生视频训练权重,如下图所示,下载文生视频14B预训练权重的所有文件,保存在Wan2.1-T2V-14B-Diffusers目录下,并上传Wan2.1-T2V-14B目录到容器/home/ma-user路径下。
      图1 下载Wan2.1-T2V-14B-Diffusers训练权重
    2. 下载文生视频训练权重,如下图所示,下载文生视频1.3B预训练权重的所有文件,保存在Wan2.1-T2V-1.3B-Diffusers目录下,并上传Wan2.1-T2V-1.3B-Diffusers目录到容器/home/ma-user路径下。
      图2 下载Wan2.1-T2V-1.3B-Diffusers训练权重
    3. 下载图生视频训练权重,如下图所示,下载图生视频14B-720p预训练权重的所有文件,保存在Wan-AI/Wan2.1-I2V-14B-720P-Diffusers目录下,并上传Wan2.1-I2V-14B-720P-Diffusers目录到容器/home/ma-user路径下。
      图3 下载Wan2.1-I2V-14B-720P-Diffusers训练权重
    4. 下载图生视频训练权重,如下图所示,下载图生视频14B-480p预训练权重的所有文件,保存在Wan2.1-I2V-14B-480P-Diffusers目录下,并上传Wan2.1-I2V-14B-480P-Diffusers目录到容器/home/ma-user路径下。
      图4 下载Wan2.1-I2V-14B-480P-Diffusers训练权重
  6. 请自行准备训练数据集,上传到容器/home/ma-user路径下。数据集处理成如下格式。

    其中,videos/下存放视频,data.json中包含该数据集中所有的视频-文本对信息,具体示例如下:

    修改/home/ma-user/MindSpeed_Dir/MindSpeed-MM/examples/wan2.1/feature_extract/data.txt文件,其中每一行表示一个数据集,第一个参数表示数据文件夹的路径,第二个参数表示data.json文件的路径,用,分隔 , 示例如下

步骤五:Wan2.1文/图生视频训练

  1. 模型与权重转换:下载的权重为hf格式(记为原始权重),要将其转换为MindSpeed-MM(记为mm权重)。

    依次将上述5下载的4个权重转换为mm格式。

    cd /home/ma-user/MindSpeed_Dir/MindSpeed-MM
    
    1.3B T2V 480P权重转化
    mm-convert WanConverter hf_to_mm \
    --cfg.source_path /home/ma-user/Wan2.1-T2V-1.3B-Diffusers/transformer/ \
    --cfg.target_path /home/ma-user/Wan2.1-T2V-1.3B-Diffusers_mm/transformer/
    
    14B T2V 480P/720P权重转化
    mm-convert WanConverter hf_to_mm \
    --cfg.source_path /home/ma-user/Wan2.1-T2V-14B-Diffusers/transformer/ \
    --cfg.target_path /home/ma-user/Wan2.1-T2V-14B-Diffusers_mm/transformer/
    
    14B I2V 480P权重转化
    mm-convert WanConverter hf_to_mm \
    --cfg.source_path /home/ma-user/Wan2.1-I2V-14B-480P-Diffusers/transformer/ \
    --cfg.target_path /home/ma-user/Wan2.1-I2V-14B-480P-Diffusers_mm/transformer/
    
    14B I2V 720P权重转化
    mm-convert WanConverter hf_to_mm \
    --cfg.source_path /home/ma-user/Wan2.1-I2V-14B-720P-Diffusers/transformer/ \
    --cfg.target_path /home/ma-user/Wan2.1-I2V-14B-720P-Diffusers_mm/transformer/

    权重转换命令中的参数解释如下:

    • cfg.source_path:原始权重路径。
    • cfg.target_path:转换或切分后权重保存路径。
  2. 数据集特征提取。

    用上述下载的4份原始权重,分别对数据集的特征进行提取,提取5份特征(其中Wan2.1-T2V-14B-Diffusers 要提取480p和720p的特征),用在不同的训练任务中。

    每次提取不同的特征,需要修改/home/ma-user/MindSpeed_Dir/MindSpeed-MM/examples/wan2.1/feature_extract/ 路径下的data.json, model.json, tools.json 这三个文件。

    data.json文件中需要修改的参数如下:

    "max_height": 720,          # 480p为480, 720p为720
    "max_width": 1280,          # 480p为832, 720p为1280
    "max_hxw": 921600,          # 480p为399360,720p为921600
    "force_resolution": true,   # 一直设为true
    "from_pretrained": "/home/ma-user/Wan2.1-T2V-14B-Diffusers/tokenizer"  对应的原始权重中tokenier的路径

    model.json文件中修改的参数如下图所示,共三个参数,分别为对应的原始权重中vae,image_encoder, text_encoder 路径。T2V无image_encoder,不用写。

    图5 model.json文件参数修改

    tools.json文件中修改如下两个参数:

    • --save_path:提取特征的保存路径,用户自定义,不同的任务保存的路径不同。
    • --task:i2v任务写 i2v ; t2v任务写t2v
    图6 tools.json文件参数修改
    修改完上述三个文件后,开始提取特征:
    cd /home/ma-user/MindSpeed_Dir/MindSpeed-MM
    bash examples/wan2.1/feature_extract/feature_extraction.sh
  3. SFT训练。

    SFT训练修改两个文件,分别是MindSpeed-MM路径下的examples/wan2.1/{model_size}/{task}/feature_data.json文件和examples/wan2.1/{model_size}/{task}/pretrain.sh文件,model_size为模型大小14b/1.3b,task为i2v/t2v。

    • feature_data.json修改内容如下:
      • data_path: 数据集提取特征的保存路径中的data.jsonl文件路径
      • data_folder: 数据集提取特征的保存路径
      • "max_height": 720, # 480p为480, 720p为720
      • "max_width": 1280, # 480p为832, 720p为1280
      • "max_hxw": 921600, # 480p为399360,720p为921600
      • "force_resolution": true, # 一直设为true。
      • "from_pretrained": , # 原始权重的tokenizer路径。
      图7 feature_data.json文件修改内容
    • pretrain.sh文件修改内容如下:
      图8 pretrain.sh文件修改内容
      图9 pretrain.sh文件修改内容
    • NPUS_PER_NODE:Snt9B设置为8,Snt9B23设置为16。
    • CP:序列并行

      Wan2.1-T2V-1.3B-Diffusers 480P SFT/LoRA 训练支持CP =1,4

      Wan2.1-T2V-14B-Diffusers 480P SFT/LoRA 训练支持CP =1,4,8

      Wan2.1-T2V-14B-Diffusers 720P SFT/LoRA 训练支持CP = 4,8

      Wan2.1-I2V-14B-480P-Diffusers SFT/LoRA 训练支持CP =1,4,8

      Wan2.1-I2V-14B-720P-Diffusers SFT/LoRA 训练支持CP = 4,8

    • LOAD_PATH:转换为mm格式权重路径下的transformer路径。
    • SAVE_PATH:自定义保存权重的路径
    • train-iters:训练的迭代步数

    修改完成后执行如下SFT训练命令。

    cd /home/ma-user/MindSpeed_Dir/MindSpeed-MM
    sed -i 's/^chmod -R 640 \$SAVE_PATH$/#&/' examples/wan2.1/{model_size}/{task}/pretrain.sh
    bash examples/wan2.1/{model_size}/{task}/pretrain.sh
    # model_size为14b/1.3b, task为i2v,t2v
  4. LoRA训练。

    LoRA训练修改两个文件,分别是MindSpeed-MM路径下的examples/wan2.1/{model_size}/{task}/feature_data.json文件和examples/wan2.1/{model_size}/{task}/finetune_lora.sh文件。

    feature_data.json,finetune_lora.sh文件的修改内容同3.SFT训练。修改完成后执行如下LoRA训练命令。
    cd /home/ma-user/MindSpeed_Dir/MindSpeed-MM
    sed -i 's/^chmod -R 640 \$SAVE_PATH$/#&/' examples/wan2.1/{model_size}/{task}/finetune_lora.sh
    bash examples/wan2.1/{model_size}/{task}/finetune_lora.sh
    # model_size为14b/1.3b, task为i2v,t2v

相关文档