Wan2.2 部署
本文档介绍如何基于 xLLM 在 Ascend NPU 环境中部署 Wan2.2 视频生成服务。
1.拉取镜像环境
Section titled “1.拉取镜像环境”首先下载xLLM提供的镜像:
# A2 x86docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-x86-cann9-20260801# A2 armdocker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-arm-cann9-20260801# A3 armdocker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a3-arm-cann9-20260801然后创建对应的容器
sudo docker run -it --ipc=host -u 0 --privileged --name mydocker --network=host \ -v /var/queue_schedule:/var/queue_schedule \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf \ -v /var/log/npu/slog/:/var/log/npu/slog \ -v ~/.ssh:/root/.ssh \ -v /var/log/npu/profiling/:/var/log/npu/profiling \ -v /var/log/npu/dump/:/var/log/npu/dump \ -v /runtime/:/runtime/ -v /etc/hccn.conf:/etc/hccn.conf \ -v /export/home:/export/home \ -v /home/:/home/ \ -w /export/home \ quay.io/jd_xllm/xllm-ai:xllm-dev-a3-arm-cann9-202608012.拉取源码并编译
Section titled “2.拉取源码并编译”下载官方仓库与模块依赖:
git clone https://github.com/xLLM-AI/xllm.gitcd xllmgit submodule update --init --update下载安装依赖:
pip install --upgrade pre-commit执行编译,在build/下生成可执行文件build/xllm/core/server/xllm:
python setup.py build --device npu3. 权重准备
Section titled “3. 权重准备”模型根目录需要包含 DiT 服务加载所需的组件目录。典型目录结构如下:
Wan2.2-I2V/├── model_index.json├── processor/├── text_encoder/├── tokenizer/├── transformer/├── transformer_2/└── vae/4.启动模型,对外提供 /v1/video/generation 接口。
Section titled “4.启动模型,对外提供 /v1/video/generation 接口。”杀掉之前的xllm服务化进程
Section titled “杀掉之前的xllm服务化进程”pkill -9 xllm# 0. 加载 Ascend 环境(必须先于 python3 调用)source /usr/local/Ascend/ascend-toolkit/set_env.shsource /usr/local/Ascend/nnal/atb/set_env.shexport LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64/driver:$LD_LIBRARY_PATH
# 1. 环境变量设置export PYTHON_INCLUDE_PATH="$(python3 -c 'from sysconfig import get_paths; print(get_paths()["include"])')"export PYTHON_LIB_PATH="$(python3 -c 'from sysconfig import get_paths; print(get_paths()["include"])')"export PYTORCH_NPU_INSTALL_PATH=/usr/local/libtorch_npu/export PYTORCH_INSTALL_PATH="$(python3 -c 'import torch, os; print(os.path.dirname(os.path.abspath(torch.__file__)))')"export LIBTORCH_ROOT="$PYTORCH_INSTALL_PATH"export LD_LIBRARY_PATH=/usr/local/libtorch_npu/lib:$LD_LIBRARY_PATH
# 2. NPU-device 环境变量export ASDOPS_LOG_TO_STDOUT=1export ASDOPS_LOG_LEVEL=ERRORexport ASDOPS_LOG_TO_FILE=1export PYTORCH_NPU_ALLOC_CONF=expandable_segments:Trueexport NPU_MEMORY_FRACTION=0.98export ATB_WORKSPACE_MEM_ALLOC_ALG_TYPE=3export ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1export OMP_NUM_THREADS=12export HCCL_CONNECT_TIMEOUT=7200export INF_NAN_MODE_ENABLE=0export INF_NAN_MODE_FORCE_DISABLE=1export HCCL_IF_BASE_PORT=41433
# 3. 清理旧日志\rm -rf core.*\rm -rf log/node_*.log启动命令 - 单机拉起样例
Section titled “启动命令 - 单机拉起样例”# 4. 推理配置XLLM_PATH="./build/xllm/core/server/xllm"MODEL_PATH="/export/home/models/wan2_2"MASTER_NODE_ADDR="127.0.0.1:17372"START_PORT=18013START_DEVICE=8LOG_DIR="log"NNODES=8LAST_DEVICE=$((START_DEVICE + NNODES - 1))# 向每个 rank 暴露从 START_DEVICE 到 LAST_DEVICE 的设备。export ASCEND_RT_VISIBLE_DEVICES="$(seq -s, "$START_DEVICE" "$LAST_DEVICE")"
for (( i=0; i<$NNODES; i++ ))do PORT=$((START_PORT + i)) LOG_FILE="$LOG_DIR/node_$i.log"
${XLLM_PATH} \ --model="$MODEL_PATH" \ --max_memory_utilization=0.98 \ --backend="dit" \ --tp_size=1 \ --cfg_size=2 \ --sp_size=4 \ --vae_size=4 \ --output_shm_size=1024 \ --master_node_addr=$MASTER_NODE_ADDR \ --nnodes=$NNODES \ --port $PORT \ --communication_backend="hccl" \ --enable_prefix_cache=false \ --enable_chunked_prefill=false \ --enable_schedule_overlap=false \ --use_contiguous_input_buffer=false \ --enable_rolling_load=true \ --rolling_load_num_rolling_slots=2 \ --dit_laser_attention_enabled=true \ --dit_sparse_attention_enabled=false \ --dit_sparse_attention_sparsity=0.8 \ --dit_sparse_attention_sparse_start_step=15 \ --enable-shm=true \ --node_rank=$i > $LOG_FILE 2>&1 &done
日志出现"Brpc Server Started"表示服务成功拉起。
## DiT 参数说明
| 参数 | 说明 | 默认值 | 取值 || ---- | ---- | ------ | ---- || `--sp_size` | Sequence Parallel 并行度 | `1` | 正整数,如 `1`、`2`、`4`、`8` || `--cfg_size` | Classifier-Free Guidance 并行度 | `1` | `1` 或 `2` || `--vae_size` | Vae Sparital Parallel 并行度 | `1` | 正整数, 如 `1`、`2`、`4`, 可以与sp_size保持一致|| `--tp_size` | Tensor Parallel 并行度 | `1` | 正整数, 如 `2`、`4`, 建议不开启,使用动态权重加载|| `--enable_rolling_load` | 是否启动动态权重加载 | `false` | bool值, true 或者 false|| `--rolling_load_num_rolling_slots` | 动态权重加载分配槽数 | `2` | 正整数, , 如 `2`、`3`|| `--dit_laser_attention_enable` | 是否使能laser_attention | `false` | bool值, 如 true,false|| `--dit_distill_enable` | 是否使能蒸馏模型| `false` | bool值, 如 true,false|| `--dit_sparse_attention_enabled` | 是否使能稀疏attention| `false` | bool值, 如 true,false;与laser_attention互斥|| `--dit_sparse_attention_sparsity` | 稀疏attention的稀疏度| `0.5` | float, 如 0.5,0.6;依赖dit_sparse_attention_enabled|| `--dit_sparse_attention_sparse_start_step` | 开始稀疏的step| `0` | int, 如 5, 10;依赖dit_sparse_attention_enabled|| `--dit_sparse_attention_version` | 稀疏attention的版本| `rain_fusion` | string, rain_fusion, sparse_attention;依赖dit_sparse_attention_enabled|
`NNODES` 必须等于 `sp_size * cfg_size * tp_size`。
| `sp_size` | `cfg_size` | `vae_size` |`tp_size` |`NNODES` | 说明 || --------- | ---------- | -------- | -------- | -------- | ---- || `1` | `1` | `1` | `1` |`1` | 单卡部署 || `2` | `1` | `1` | `1` | `2` | 仅开启 SP || `1` | `2` | `1` | `1` | `2` | 仅开启 CFG 并行 || `2` | `2` | `2` | `1` |`4` | 同时开启 SP 和 CFG和vae并行 | `4` | `2` | `2` | `1` |`8` | 8 卡部署 |