
# Wan2.1系列文/图生视频模型基于ModelArts 轻量算力节点适配NPU训练指导（6.5.911）
#### 方案概览
在视频内容创作领域，创作者们常常面临视频生成技术的限制，难以高效地生成高质量的视频内容。Wan2.1是一套全面而开放的视频基础模型，它突破了视频生成的界限，是一个能够生成中英文文本的视频模型，具有强大的视频生成功能，可增强其实际应用。
本方案介如何在ModelArts的轻量算力节点环境中，使用NPU卡对Wan2.1系列模型进行训练。本方案支持的模型列表如下[表1]所示。
 表1支持的模型 
| 分类     | 模型                            | 应用场景 |
|:---|:---|:---|
| Wan2.1 | Wan2.1-T2V-14B-Diffusers      | 文生视频 |
| Wan2.1 | Wan2.1-T2V-1.3B-Diffusers     | 文生视频 |
| Wan2.1 | Wan2.1-I2V-14B-480P-Diffusers | 图生视频 |
| Wan2.1 | Wan2.1-I2V-14B-720P-Diffusers | 图生视频 |
   
#### 资源规格要求
使用轻量算力节点的Snt9b单机或Snt9b23单机资源。
表2Snt9b环境要求 
| 名称      | 版本            |
|:---|:---|
| driver  | 24.1.0.6      |
| PyTorch | pytorch_2.5.1 |
   
表3Snt9b23环境要求 
| 名称      | 版本            |
|:---|:---|
| driver  | 25.2.1        |
| PyTorch | pytorch_2.5.1 |
   
#### 获取软件和镜像
 表4获取镜像 
| 分类    | 名称                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 获取路径                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|
| 插件代码包 | AscendCloud-AIGC-xxx.zip 文件名中的xxx表示具体的时间戳，以包名发布的实际时间为准。                                                                                                                                                                                                                                                                                                                                                                                                                                    | 获取路径：[Support-E](https://support.huawei.com/enterprise/zh/cloud-computing/modelarts-pid-23404305/software/)，在此路径中查找下载ModelArts 6.5.911.3版本。 说明： 如果上述软件获取路径打开后未显示相应的软件信息，说明您没有下载权限，请联系您所在企业的华为方技术支持下载获取。 |
| 基础镜像  | Snt9b：西南-贵阳一： swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.2.rc2-py_3.11-hce_2.0.2509-aarch64-snt9b-20251105194139-a70c13c Snt9b23：西南-贵阳一： swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.2.rc2-py_3.11-hce_2.0.2509-aarch64-snt9b23-20251106111344-87d9583 | 从SWR拉取。                                                                                                                                                                                                                                                                                                                                                                                     |
   
#### 约束限制
- 本文档适配ModelArts 6.5.911版本，请参考[表4]获取配套版本的软件包和镜像，请严格遵照版本配套关系使用本文档。
- 确保容器可以访问公网。
 
#### 步骤一：准备环境
1. 请参考[轻量算力节点资源开通](https://support.huaweicloud.com/resmgmt-modelarts/usermanual-server-0005.html)，购买资源，并确保机器已开通，密码已获取，能通过SSH登录，不同机器之间网络互通。
   ![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
   当容器需要提供服务给多个用户，或者多个用户共享使用该容器时，应限制容器访问Openstack的管理地址（169.254.169.254），以防止容器获取宿主机的元数据。具体操作请参见[禁止容器获取宿主机元数据](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0318.html#section4)。
   
2. SSH登录机器后，检查NPU设备状态。运行如下命令，返回NPU设备信息。
   ```
   npu-smi info                    # 在每个实例节点上运行此命令可以看到NPU卡状态
   npu-smi info -l | grep Total    # 在每个实例节点上运行此命令可以看到总卡数
   ```
   如出现错误，可能是机器上的NPU设备没有正常安装，或者NPU镜像被其他容器挂载。请先正常[安装固件和驱动](https://support.huaweicloud.com/resmgmt-modelarts/usermanual-server-0011.html#section4)，或释放被挂载的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}参见[表4]。
```
docker pull {image_url}
```
#### 步骤三：启动容器镜像（Snt9b）
1. 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为要挂载到的容器中的目录。为方便两个地址可以相同。
     ![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
     - 容器不能挂载到/home/ma-user目录，此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下，拉起容器时会与基础镜像冲突，导致基础镜像不可用。
     
     
     
     - driver及npu-smi需同时挂载至容器。
       
   
   - --name ${container_name}：容器名称，进入容器时会用到，此处可以自己定义一个容器名称。
   
   - ${image_name}：容器镜像的名称，即docker pull拉取镜像的名称或者IMAGE ID。
   
   - --device=/dev/davinci0 ：挂载对应卡到容器，当需要挂载多卡，请依次添加多项该配置。
    
2. Snt9b通过容器名称进入容器中。默认使用ma-user用户，后续所有操作步骤都在ma-user用户下执行。
   ```
   docker exec -it ${container_name} bash
   ```
   
 
#### 步骤三：启动容器镜像（Snt9b23）
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. 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，修改后的内容如下图所示。
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002484822688.png)
   
2. 安装加速库。
   ```
   git clone https://gitee.com/ascend/MindSpeed.git 
   cd MindSpeed 
   git checkout 4d9041071da5214e038ebf9f76e8574a60c89c2e
   pip install -r requirements.txt  
   pip install setuptools==78.1.1
   pip install -e .
   cd ..  
   pip install -e .  
   pip install diffusers==0.33.1
   ```
   
3. 安装依赖Decord。
   确保服务器网络正常，确保git可以正常clone。
   ```
   cd /home/ma-user/MindSpeed_Dir
   git config --global http.sslVerify "false"
   git clone https://github.com/dmlc/decord.git
   cd decord
   git checkout d2e5619
   rm -rf 3rdparty/*
   cd 3rdparty
   git clone -b v0.3 https://github.com/dmlc/dlpack.git
   git clone https://github.com/dmlc/dmlc-core.git
   git clone https://github.com/UnickSoft/FFMpeg-decode-example.git
   cd ..
   sed -i "33a include_directories(\"3rdparty/ffmpegDecoder/FFmpegDecoder\")" CMakeLists.txt
   mkdir build && cd build
   cmake ..  -DCMAKE_BUILD_TYPE=Release -DFFMPEG_DIR:PATH="/usr/local/ffmpeg/"
   make
   cd ../python
   pwd=$PWD
   echo "PYTHONPATH=$PYTHONPATH:$pwd" >> ~/.bashrc
   source ~/.bashrc
   python setup.py install --user
   cd ..
   # 执行如下指令不报错，证明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
   ```
   
 
#### 步骤五：准备模型权重
1. 下载模型权重。
   1. [下载文生视频训练权重](https://huggingface.co/Wan-AI/Wan2.1-T2V-14B-Diffusers)。如下图所示，下载文生视频14B预训练权重的所有文件，保存在Wan2.1-T2V-14B-Diffusers目录下，并上传Wan2.1-T2V-14B目录到容器/home/ma-user路径下。
      图1下载Wan2.1-T2V-14B-Diffusers训练权重   
      ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002516862627.png "点击放大") 
   
   2. [下载文生视频训练权重](https://huggingface.co/Wan-AI/Wan2.1-T2V-1.3B-Diffusers/tree/main)。如下图所示，下载文生视频1.3B预训练权重的所有文件，保存在Wan2.1-T2V-1.3B-Diffusers目录下，并上传Wan2.1-T2V-1.3B-Diffusers目录到容器/home/ma-user路径下。
      图2下载Wan2.1-T2V-1.3B-Diffusers训练权重   
      ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002484662710.png "点击放大") 
   
   3. [下载图生视频训练权重](https://huggingface.co/Wan-AI/Wan2.1-I2V-14B-720P-Diffusers)。如下图所示，下载图生视频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训练权重   
      ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002516982617.png "点击放大") 
   
   4. [下载图生视频训练权重](https://huggingface.co/Wan-AI/Wan2.1-I2V-14B-480P-Diffusers)。如下图所示，下载图生视频14B-480p预训练权重的所有文件，保存在Wan2.1-I2V-14B-480P-Diffusers目录下，并上传Wan2.1-I2V-14B-480P-Diffusers目录到容器/home/ma-user路径下。
      图4下载Wan2.1-I2V-14B-480P-Diffusers训练权重   
      ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002484822690.png "点击放大") 
    
2. 模型与权重转换：下载的权重为hf格式（记为原始权重），要将其转换为MindSpeed-MM（记为mm权重）。 依次将上述步骤下载的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：转换或切分后权重保存路径。
    
 
#### 步骤六：准备数据集
1. 请自行准备训练数据集，上传到容器/home/ma-user路径下。数据集处理成如下格式。 ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002516862629.png)
   其中，videos/下存放视频，data.json中包含该数据集中所有的视频-文本对信息，具体示例如下：
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002484662712.png "点击放大")
   修改/home/ma-user/MindSpeed_Dir/MindSpeed-MM/examples/wan2.1/feature_extract/data.txt文件，其中每一行表示一个数据集，第一个参数表示数据文件夹的路径，第二个参数表示data.json文件的路径，用英文逗号分隔 , 示例如下。
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002516982621.png "点击放大")
   
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，不用写。
   图5model.json文件参数修改   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002484822692.png "点击放大")
   tools.json文件中修改如下两个参数：
   - --save_path：提取特征的保存路径，用户自定义，不同的任务保存的路径不同。
   
   - --task：i2v任务写 i2v ; t2v任务写t2v
   
   
   图6tools.json文件参数修改   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002516862631.png "点击放大")
   修改完上述三个文件后，开始提取特征：
   ```
   cd /home/ma-user/MindSpeed_Dir/MindSpeed-MM
   bash examples/wan2.1/feature_extract/feature_extraction.sh
   ```
   
 
 #### 步骤七：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。
1. 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路径。
   
   
   图7feature_data.json文件修改内容   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002484662714.png "点击放大") 
2. pretrain.sh文件修改内容如下：
   图8pretrain.sh文件修改内容   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002516982623.png)
   图9pretrain.sh文件修改内容   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002484822696.png "点击放大")
   - 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：训练的迭代步数
    
3. 修改完成后执行如下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
   ```
   
 
#### 步骤八：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文件的修改内容同[步骤七：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  不要进入带A3字样的文件夹
```
