
# Wan2.1-VACE-1.3B模型基于ModelArts轻量算力节点适配NPU推理指导（6.5.911）
#### 方案概览
在视频内容创作领域，随着消费者对视频质量要求的提高，视频生成与编辑的需求日益增长。然而，现有的视频生成模型往往需要高性能的计算资源，这使得许多创作者难以负担。Wan2.1-VACE-1.3B是开源的通义万相视频生成与编辑模型的轻量版本，专为消费级显卡设计，具备强大的多任务视频处理能力。它突破了视频生成的界限，是一个能够生成中英文文本的视频模型，具有强大的视频生成功能，可增强其实际应用。
如何在有限的计算资源下实现高效、高质量的视频生成与编辑？本文主要介绍如何在ModelArts的轻量算力节点环境中，使用NPU卡对Wan2.1-VACE-1.3B模型进行推理适配，以解决这一问题。
#### 资源规格要求
ModelArts 轻量算力节点的Snt9b单机或Snt9b23单机资源。
表1Ascend Snt9B 环境要求 
| 名称      | 版本            |
|:---|:---|
| driver  | 24.1.0.6      |
| PyTorch | pytorch_2.5.1 |
   
表2Ascend Snt9B23 环境要求 
| 名称      | 版本            |
|:---|:---|
| driver  | 25.2.1        |
| PyTorch | pytorch_2.5.1 |
   
#### 获取软件和镜像
 表3获取镜像 
| 分类    | 名称                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 获取路径                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|
| 插件代码包 | AscendCloud-AIGC-6.5.911-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版本，请参考[表3]获取配套版本的软件包和镜像，请严格遵照版本配套关系使用本文档。
- 确保容器可以访问公网。
 
#### 步骤一：准备环境
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}参见[表3]。
```
docker pull {image_url}
```
#### 步骤三：启动容器镜像（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
   ```
   **参数说明：**
   - -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}：容器镜像的名称。
    
2. Snt9b23需要使用root权限进入容器中。
   ```
   docker exec -itu root ${container_name} bash
   ```
   
 
#### 步骤三：启动容器镜像（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. 拉取代码，在容器的/home/ma-user/目录下进行操作。
   ```
   git config --global http.sslVerify false
   git clone https://github.com/Wan-Video/Wan2.1.git
   cd Wan2.1
   git checkout 261ca43e67ccaf68dbb5c0d8d1f971efde267573
   sed -i 's/^flash_attn$/mercurial\npeft==0.17.0/' requirements.txt
   sed -i 's/^gradio>=5.0.0$/gradio==5.33.0/' requirements.txt
   pip install -r requirements.txt
   ```
   
2. 将获取到的插件代码包AscendCloud-AIGC-xxx.zip文件上传到容器的/home/ma-user/目录下，并解压。
   ```
   cd /home/ma-user/
   unzip AscendCloud-AIGC-*.zip #解压
   cp aigc_inference/torch_npu/Wanx/Wan2.1-VACE/generate.py /home/ma-user/Wan2.1/
   cp aigc_inference/torch_npu/Wanx/Wan2.1-VACE/vace.py /home/ma-user/Wan2.1/wan/
   cp aigc_inference/torch_npu/Wanx/Wan2.1-VACE/attention.py /home/ma-user/Wan2.1/wan/modules/
   cp aigc_inference/torch_npu/Wanx/Wan2.1-VACE/model.py /home/ma-user/Wan2.1/wan/modules/
   ```
   
3. 安装依赖Decord。
   确保服务器网络正常，确保git可以正常clone。
   ```
   cd /home/ma-user/Wan2.1/
   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. [下载模型权重](https://huggingface.co/Wan-AI/Wan2.1-VACE-1.3B/tree/main)。如下图所示，下载文生视频1.3B权重下所有文件，保存在Wan2.1-VACE-1.3B目录下，并上传Wan2.1-VACE-1.3B目录到容器/home/ma-user路径下。
   图1下载Wan2.1-VACE-1.3B模型权重   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002497774513.png "点击放大") 
 
#### 步骤五：Wan2.1-VACE-1.3B推理
调用推理服务有2种方式：一种是在服务器端通过命令行调用，一种是通过Web端调用。
- **方式一：** 通过命令行在服务器端调用推理服务。
  ```
  cd /home/ma-user/Wan2.1/
  # txt2vid txt2vid
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --prompt "狂风巨浪的大海，镜头缓缓推进，一艘渺小的帆船在汹涌的波涛中挣扎漂荡。海面上白沫翻滚，帆船时隐时现，仿佛随时可能被巨浪吞噬。天空乌云密布，雷声轰鸣，海鸥在空中盘旋尖叫。帆船上的人们紧紧抓住缆绳，努力保持平衡。画面风格写实，充满紧张和动感。近景特写，强调风浪的冲击力和帆船的摇晃"
  # extension firstframe
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --src_mask "/xxx/src_mask.mp4" --prompt "纪实摄影风格，前景是一位中国越野爱好者坐在越野车上，手持车载电台正在进行通联。他五官清晰，表情专注，眼神坚定地望向前方。越野车停在户外，车身略显脏污，显示出经历过的艰难路况。镜头从车外缓缓拉近，最后定格在人物的面部特写上，展现出他的，动态镜头运镜。"
  # repainting inpainting
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --src_mask "/xxx/src_mask.mp4" --prompt "一只巨大的金色凤凰从繁华的城市上空展翅飞过，羽毛如火焰般璀璨，闪烁着温暖的光辉，翅膀雄伟地展开。凤凰高昂着头，目光炯炯，轻轻扇动翅膀，散发出淡淡的光芒。下方是熙熙攘攘的市中心，人群惊叹，车水马龙，红蓝两色的霓虹灯在夜空下闪烁。镜头俯视城市街道，捕捉这一壮丽的景象，营造出既神秘又辉煌的氛围。"
  # repainting outpainting
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --src_mask "/xxx/src_mask.mp4" --prompt "赛博朋克风格，无人机俯瞰视角下的现代西安城墙，镜头穿过永宁门时泛起金色涟漪，城墙砖块化作数据流重组为唐代长安城。周围的街道上流动的人群和飞驰的机械交通工具交织在一起，现代与古代的交融，城墙上的灯光闪烁，形成时空隧道的效果。全息投影技术展现历史变迁，粒子重组特效细腻逼真。大远景逐渐过渡到特写，聚焦于城门特效。"
  # control depth
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --prompt "一群年轻人在天空之城拍摄集体照。画面中，一对年轻情侣手牵手，轻声细语，相视而笑，周围是飞翔的彩色热气球和闪烁的星星，营造出浪漫的氛围。天空中，暖阳透过飘浮的云朵，洒下斑驳的光影。镜头以近景特写开始，随着情侣间的亲密互动，缓缓拉远。"
  # control flow
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --prompt "纪实摄影风格，一颗鲜红的小番茄缓缓落入盛着牛奶的玻璃杯中，溅起晶莹的水花。画面以慢镜头捕捉这一瞬间，水花在空中绽放，形成美丽的弧线。玻璃杯中的牛奶纯白，番茄的鲜红与之形成鲜明对比。背景简洁，突出主体。近景特写，垂直俯视视角，展现细节之美。"
  # control gray
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --prompt "镜头缓缓向右平移，身穿淡黄色坎肩长裙的长发女孩面对镜头露出灿烂的漏齿微笑。她的长发随风轻扬，眼神明亮而充满活力。背景是秋天红色和黄色的树叶，阳光透过树叶的缝隙洒下斑驳光影，营造出温馨自然的氛围。画面风格清新自然，仿佛夏日午后的一抹清凉。中景人像，强调自然光效和细腻的皮肤质感。"
  # control pose
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --prompt "在一个热带的庆祝派对上，一家人围坐在椰子树下的长桌旁。桌上摆满了异国风味的美食。长辈们愉悦地交谈，年轻人兴奋地举杯碰撞，孩子们在沙滩上欢乐奔跑。背景中是湛蓝的海洋和明亮的阳光，营造出轻松的气氛。镜头以动态中景捕捉每个开心的瞬间，温暖的阳光映照着他们幸福的面庞。"
  # control scribble
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --prompt "画面中荧光色彩的无人机从极低空高速掠过超现实主义风格的西安古城墙，尘埃反射着阳光。镜头快速切换至城墙上的砖石特写，阳光温暖地洒落，勾勒出每一块砖块的细腻纹理。整体画质清晰华丽，运镜流畅如水。"
  # control layout
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --prompt "视频展示了一只成鸟在树枝上的巢中喂养它的幼鸟。成鸟在喂食的过程中，幼鸟张开嘴巴等待食物。随后，成鸟飞走，幼鸟继续等待。成鸟再次飞回，带回食物喂养幼鸟。整个视频的拍摄角度固定，聚焦于巢穴和鸟类的互动，背景是模糊的绿色植被，强调了鸟类的自然行为和生态环境。"
  # reference face
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_ref_images "/xxx/src_ref_image_1.png" --prompt "视频展示了一位长着尖耳朵的老人，他有一头银白色的长发和小胡子，穿着一件色彩斑斓的长袍，内搭金色衬衫，散发出神秘与智慧的气息。背景为一个华丽宫殿的内部，金碧辉煌。灯光明亮，照亮他脸上的神采奕奕。摄像机旋转动态拍摄，捕捉老人轻松挥手的动作。"
  # reference object
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_ref_images "/xxx/src_ref_image_1.png" --prompt "经典游戏角色马里奥在绿松石色水下世界中，四周环绕着珊瑚和各种各样的热带鱼。马里奥兴奋地向上跳起，摆出经典的欢快姿势，身穿鲜明的蓝色潜水服，红色的潜水面罩上印有“M”标志，脚上是一双潜水靴。背景中，水泡随波逐流，浮现出一个巨大而友好的海星。摄像机从水底向上快速移动，捕捉他跃出水面的瞬间，灯光明亮而流动。该场景融合了动画与幻想元素，令人惊叹。"
  # composition reference_anything
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_ref_images "/xxx/src_ref_image_1.png,/xxx/src_ref_image_2.png" --prompt "一名打扮成超人的男子自信地站着，面对镜头，肩头有一只充满活力的毛绒黄色鸭子。他留着整齐的短发和浅色胡须，鸭子有橙色的喙和脚，它的翅膀稍微展开，脚分开以保持稳定。他的表情严肃而坚定。他穿着标志性的蓝红超人服装，胸前有黄色“S”标志。斗篷在他身后飘逸。背景有行人。相机位于视线水平，捕捉角色的整个上半身。灯光均匀明亮。"
  # composition swap_anything
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --src_mask "/xxx/src_mask.mp4" --src_ref_images "/xxx/src_ref_image_1.png" --prompt "视频展示了一个人在宽阔的草原上骑马。他有淡紫色长发，穿着传统服饰白上衣黑裤子，动画建模画风，看起来像是在进行某种户外活动或者是在进行某种表演。背景是壮观的山脉云的天空，给人一种宁静而广阔的感觉。整个视频的拍摄角度是固定的，重点展示了骑手和他的马。"
  # composition expand_anything
  python generate.py --task vace-1.3B --size 832*480 --ckpt_dir /home/ma-user/Wan2.1-VACE-1.3B/ --src_video "/xxx/src_video.mp4" --src_mask "/xxx/src_mask.mp4" --src_ref_images "/xxx/src_ref_image_1.png" --prompt "古典油画风格，背景是一条河边，画面中央一位成熟优雅的女人，穿着长裙坐在椅子上。她双手从怀里取出打开的红色心形墨镜戴上。固定机位。"
  ```
  参数解释如下：
  - task：目前只支持vace-1.3B
  
  - size：目前支持832\*480、480\*832或720\*1280
  
  - ckpt_dir：模型权重路径
  
  - prompt：提示词
  
  - src_video：输入视频
  
  - src_mask：输入掩码
  
  - src_ref_images：输入图片
   
- **方式二：** 在Web端启动推理服务并调用。进入容器的/home/ma-user/目录下，执行如下命令。
  ```
  cd /home/ma-user/Wan2.1/
  sed -i '12i import torch_npu' gradio/vace.py
  sed -i '13i from torch_npu.contrib import transfer_to_npu' gradio/vace.py
  python gradio/vace.py --ckpt_dir ../Wan2.1-VACE-1.3B/ --server_name SERVER_IP --server_port 7860
  ```
  ckpt_dir为模型权重路径文件夹地址，server_name 为当前IP地址，server_port为开放端口号。
  在Web页面上进行相应操作。
  图2web端页面   
  ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002464615144.png "点击放大") 
 
