
# Wan系列视频生成模型基于轻量算力节点的本地服务化部署(6.5.910)
#### 方案概览
在AI视频生成领域，越来越多的企业开始探索使用先进的视频生成模型来提升内容创作效率。然而，由于计算资源的限制，很多企业难以在本地环境中高效运行这些模型。如何解决计算资源限制，高效运行这些模型，通过使用ModelArts的轻量算力节点环境和NPU卡，企业可以轻松本地化部署和运行这些模型，从而加速内容创作过程。
本文主要介绍如何在ModelArts的轻量算力节点环境中，利用NPU卡实现Wan2.2视频生成模型（Wan2.2-I2V-A14B-Diffusers和Wan2.2-T2V-A14B-Diffusers）的本地化部署，使用户能够通过API形式直观调用模型服务。
#### 资源规格要求
使用轻量算力节点的Snt9b单机资源。
表1Snt9b环境要求 
| 名称      | 版本            |
|:---|:---|
| driver  | 24.1.0.6      |
| PyTorch | pytorch_2.5.1 |
   
 #### 获取软件和镜像
 表2获取镜像 
| 分类    | 名称                                                                                                                                                                                                                                         | 获取路径                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|
| 插件代码包 | AscendCloud-AIGC-xxx.zip 文件名中的xxx表示具体的时间戳，以包名发布的实际时间为准。                                                                                                         | 获取路径：[Support-E](https://support.huawei.com/enterprise/zh/cloud-computing/modelarts-pid-23404305/software/)，在此路径中查找下载ModelArts 6.5.910.6版本。 说明： 如果上述软件获取路径打开后未显示相应的软件信息，说明您没有下载权限，请联系您所在企业的华为方技术支持下载获取。 |
| 基础镜像  | 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 | 从SWR拉取。                                                                                                                                                                                                                                                                                                                                                                                     |
   
#### 约束限制
- 本文档适配ModelArts 6.5.910版本，请参考[表2]获取配套版本的软件包和镜像，请严格遵照版本配套关系使用本文档。
- 确保容器可以访问公网。
 
#### 步骤一：准备环境
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
   ```
   
 
#### 步骤二：获取基础镜像
建议使用官方提供的镜像部署服务。镜像地址{image_url}参见[表2]。
```
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}：容器镜像的名称。
   
   - --device=/dev/davinci0 ：挂载对应卡到容器，当需要挂载多卡，请依次添加多项该配置。
    
2. Snt9b通过容器名称进入容器中。默认使用ma-user用户，后续所有操作步骤都在ma-user用户下执行。
   ```
   docker exec -it ${container_name} bash
   ```
   
 
#### 步骤四：安装依赖和软件包
1. git clone和git lfs下载大模型可以参考如下操作。
   1. 在浏览器中输入如下地址下载git-lfs压缩包并上传到容器的/home/ma-user目录下。
      ```
      https://github.com/git-lfs/git-lfs/releases/download/v3.2.0/git-lfs-linux-arm64-v3.2.0.tar.gz
      ```
      或直接下载到容器，这样在容器中可以直接使用。
      ```
      cd /home/ma-user
      wget https://github.com/git-lfs/git-lfs/releases/download/v3.2.0/git-lfs-linux-arm64-v3.2.0.tar.gz
      ```
      
   
   2. 进入容器，执行安装git lfs命令。
      ```
      cd /home/ma-user
      tar -zxvf git-lfs-linux-arm64-v3.2.0.tar.gz 
      cd git-lfs-3.2.0 
      sudo sh install.sh
      ```
      
   
   3. 设置git配置去掉ssl校验。
      ```
      git config --global http.sslVerify false
      ```
      
    
2. 安装AscendX_Video软件包。
   1. 将获取到的AscendX_Video软件包AscendCloud-AIGC-\*.zip文件上传到容器的/home/ma-user目录下。获取路径参见[获取软件和镜像]。
   
   2. 解压AscendCloud-AIGC-\*.zip文件，解压后按照步骤安装Python依赖，执行以下命令即可。
      ```
      cd /home/ma-user
      unzip AscendCloud-AIGC-*.zip -d ./AscendCloud
      cp -r /home/ma-user/AscendCloud/aigc_inference/torch_npu/ascendx_video ./
      cd /home/ma-user/ascendx_video
      pip install seal-*-linux_aarch64.whl
      pip install check_device-*-linux_aarch64.whl
      pip install ascendx_video-*-none-any.whl
      ```
      
   
   3. 安装算子。
      ```
      cd /home/ma-user/AscendCloud/opp/A2
      unzip AscendCloud-OPP-*.zip
      unzip AscendCloud-OPP-*-torch-2.5.1-py311-*.zip -d ./AscendCloud_OPP
      cd AscendCloud_OPP
      pip install *.whl
      mkdir -p /home/ma-user/operate
      bash ./ascend_cloud_ops_ascend_turbo-*_linux_aarch64.run --install-path=/home/ma-user/operate
      bash ./ascend_cloud_ops_custom_opp-*_linux_aarch64_ascend910b_ascend910_93.run --install-path=/home/ma-user/operate
      cd ..
      unzip AscendCloud-OPS-ADV-*.zip -d ./AscendCloud_OPS-ADV
      cd AscendCloud_OPS-ADV
      bash ./CANN-custom_ops-*-linux.aarch64.run --install-path=/home/ma-user/operate
      ```
      
    

3. 初始化环境变量。注意每次进入容器需要重新初始化环境。
   ```
   source /home/ma-user/operate/AscendTurbo/set_env.bash
   source /home/ma-user/operate/vendors/customize/bin/set_env.bash
   source /home/ma-user/operate/vendors/customize_cloud/bin/set_env.bash
   ```
   
4. 安装服务运行依赖。
   ```
   cd /home/ma-user/AscendCloud/aigc_server
   pip install -r requirements.txt
   ```
   
 
#### 步骤五：下载权重文件
下载权重文件至容器目录，需要用到的模型地址如下。
Wan-AI/Wan2.2-I2V-A14B-Diffusers，地址：[Wan-AI/Wan2.2-I2V-A14B-Diffusers · Hugging Face](https://huggingface.co/Wan-AI/Wan2.2-I2V-A14B-Diffusers)
Wan-AI/Wan2.2-T2V-A14B-Diffusers，地址：[Wan-AI/Wan2.2-T2V-A14B-Diffusers · Hugging Face](https://huggingface.co/Wan-AI/Wan2.2-T2V-A14B-Diffusers)
将权重文件放到 /home/ma-user/ascendx_video/weights目录下，例如：
```
weights
└──Wan-AI
    ├──Wan2.2-I2V-A14B-Diffusers
    ├──Wan2.2-T2V-A14B-Diffusers
```
#### 步骤六：启动推理服务
```
cd /home/ma-user/AscendCloud/aigc_server
bash run.sh
```
run.sh：表示视频模型服务启动脚本。
- ASCEND_RT_VISIBLE_DEVICES：使用的卡号。
- SP_NUM： 使用卡数量。支持2卡、4卡、8卡推理，需要与run.sh脚本里nproc_per_node的值保持一致。
- LOAD_MODEL：支持的推理模型，目前支持: Wan2.2-T2V-A14B/Wan2.2-I2V-A14B。
- MODEL_WEIGHT_PATH：对应模型的权重地址。
- TASK_TYPE：任务类型，目前支持: t2v/i2v。
- START_TYPE：启动类型，本地部署使用api。
- NUM_INFERENCE_STEPS：推理步数。
- ENCRYPTION_WEIGHT：权重是否加解密。

- VIDEOS_STORAGE_PATH：生成视频成功后的视频存储路径。
- IMAGES_STORAGE_PATH：当输入input.img_url参数以Base64编码形式传入时，需要将其解码并保存为图片文件，最终返回该图片的存储路径。
 
#### 步骤七：调用接口
**接口1：新建单次视频生成任务**
```
POST  /api/v1/video/generate
```
请求样例：
```
curl -X POST -H "Content-Type: application/json"   -d '{"model": "Wan2.2-T2V-A14B","input": {"prompt": "一个小猫"},"parameters": {"size": "720x1280","seed": 41}}'  http://127.0.0.1:8000/api/v1/video/generate
```
返回响应：
```
{     "task_id": "b984cd67-1555-4d60-92d5-adb15660357f",     "status": "waiting",     "error": {},     "content": {},     "usage": {},     "created_at": 1760323094,     "updated_at": 0 }
```
| 参数名                 | 示例值               | 参数类型    | 是否必填        | 参数描述                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|:---|
| model               | Wan2.2-T2V-A14B   | string  | 是           | 模型名称, 当前支持：Wan2.2-T2V-A14B/Wan2.2-I2V-A14B                                                                                                                                                                                                |
| input               | {}                | object  | 是           | 输入的基本信息                                                                                                                                                                                                                                   |
| input.prompt        | 聪明的小猫             | string  | 否           | 文本提示词，支持中英文，最大长度为1000字符。示例值：一只小猫在月光下奔跑。                                                                                                                                                                                                   |
| input.img_url       | base64编码内容/本地图片路径 | string  | I2V必填,T2V不填 | 输入图片内容，填写图片的base64编码或者本地图片路径，支持jpg、jpeg、png、tiff、webp，图片需保持与parameters.size输入一致，否则会自适应宽高比。                                                                                                                                                |
| parameters          | {}                | object  | 否           | 视频处理参数。                                                                                                                                                                                                                                   |
| parameters.size     | 720x1280          | string  | 否           | 生成视频的分辨率档位，当前支持，480P档位：不同视频宽高比对应的分辨率如下：16:9：832x*480；9:16：480x* 832；720P档位：不同视频宽高比对应的分辨率如下：16:9：1280x720；*9:16：720x1280* size 参数应直接设置为目标分辨率的具体数值（如 1280x720） |
| parameters.fps      | 16                | integer | 否           | 生成视频每秒的帧数，默认16，当前只支持8，16。                                                                                                                                                                                                                 |
| parameters.duration | 5                 | integer | 否           | 生成视频时长，单位秒；默认5，当前只支持3s和5s。                                                                                                                                                                                                                |
| parameters.seed     | 0                 | integer | 否           | 随机种子，整数，用于控制生成内容的随机性。取值范围：\[0，2147483648\]；默认为取值范围内的随机数。                                                                                                                                                                                  |
   
返回响应
| 参数         | 参数类型      | 描述                                                                                                                                                                         |
|:---|:---|:---|
| task_id    | String    | 任务ID。                                                                                                                                                                      |
| status     | String    | 枚举值，表示任务的状态，取值范围为：waiting、running、succeeded、failed。                                                                                                                        |
| error      | Error结构   | 结构内容为json结构体，例如：{ "code": 400（参数校验错误）/ 500（服务内部错误）, "msg": "xxx" }                                                                                                         |
| content    | Content结构 | 结构内容为json结构体，内容为产物下载地址：{ "result_url": "tmp_xxx.mp4" }                                                                                                                     |
| usage      | Usage结构   | 结构内容为json结构体，kv可自定义，例如：{ "model_latency：6000， "completion_tokens": 1024, "total_tokens": 1024 } |
| created_at | Int64     | 任务创建时间，时间戳，单位毫秒。                                                                                                                                                           |
| updated_at | Int64     | 任务更新时间，时间戳，单位毫秒。                                                                                                                                                           |
   
**接口2：批量新建视频生成任务**
```
POST  /api/v1/video/batch_generate
```
批量新建任务每次最多支持300个，且发送任务数与服务端等待任务数之和不能超过300。
请求样例：
```
curl -X POST -H "Content-Type: application/json"   -d '[{"model": "Wan2.2-T2V-A14B","input": {"prompt": "一个小猫"},"parameters": {"size": "720x1280","seed": 41}},{"model": "Wan2.2-T2V-A14B","input": {"prompt": "一个小狗"},"parameters": {"size": "720x1280","seed": 41}}]'   http://127.0.0.1:8000/api/v1/video/batch_generate
```
返回响应：
```
[{     "task_id": "b984cd67-1555-4d60-92d5-adb15660357f",     "status": "waiting",     "error": {},     "content": {},     "usage": {},     "created_at": 1760323094,     "updated_at": 0 },{     "task_id": "8a782eef-a453-41e5-9f2f-d92d1d399792",     "status": "waiting",     "error": {},     "content": {},     "usage": {},     "created_at": 1760323094,     "updated_at": 0 }]
```
**接口3：** **查询视频生成任务接口**
```
GET  /api/v1/video/progress/{task_id}
```
根据返回的task_id查询任务状态，请求样例如下：
```
curl  http://127.0.0.1:8000/api/v1/video/progress/c3536141-2b93-4417-81d0-d235367b8251
```
返回响应：
```
{
    "task_id": "c3536141-2b93-4417-81d0-d235367b8251",
    "status": "succeeded",
    "error": {},
    "content": {
        "result_url": "tmp_c3536141-2b93-4417-81d0-d235367b8251.mp4"
    },
    "usage": {
        "model_latency": 117168,
        "completion_tokens": 288000,
        "total_tokens": 288000
    },
    "created_at": 1760605954,
    "updated_at": 1760606071
}
```
**接口4：** **下载视频接口**
```
GET  /api/v1/video/download/{result_url}
```
根据返回的content.result_url下载视频，请求样例如下：
```
curl  http://127.0.0.1:8000/api/v1/video/download/tmp_c3536141-2b93-4417-81d0-d235367b8251.mp4  -o tmp_c3536141-2b93-4417-81d0-d235367b8251.mp4
```
