跳到正文
阿里雲開發者社區 AI·· 3 小時前AI 評分55

Wan2.2 本地文生影片 ComfyUI 工作流部署、顯存調校與批次 API 實戰

Wan2.2 本地文生视频 ComfyUI 工作流部署、显存调优与批量 API 实战

AI 導讀

作者分享在 RTX4060 8G 上部署 Wan2.2 文生影片 ComfyUI 工作流的實測方案,涵蓋顯存調校及批次 API 任務處理。方案採用 FP8 量化、模型分片載入及 gpu_offload,並提供 832×480、20~30 幀的工作流設定。另附批次提交、超時重試及 MP4 下載腳本,並整理 OOM、閃爍和編碼問題的排查方法。

正文

2026-11-01 13

版权

版权声明:

本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

简介: 本文为RTX 4060 8G显卡实测落地的Wan2.2文生视频方案:详解FP8量化、模型分片加载、offload策略及API批量生成脚本,覆盖环境配置、节点安装、工作流JSON、异常重试与高频排坑,专为AI短剧/漫剧动态素材高效生产而优化。(239字)

前言:之前一直在跑 SDXL 图片工作流做漫剧配图,最近换到 Wan2.2 做短视频素材,踩了一堆网上很少细说的坑:FP16/FP8 精度混用爆显存、视频编码出错、长片段时序崩坏、API 异步任务丢帧。很多分享包只给成品工作流,不讲模型分片加载、offload 策略、批量生成的异常重试逻辑。本文是我在 RTX4060 8G 机器上真机调试两周沉淀下来的落地方案,全部代码、参数、排错步骤都实测可用,适合 AI 短剧、漫剧动态素材批量生产。

一、本机硬件 & 环境清单(和上一篇绘图环境保持统一)

  • 显卡:RTX4060 8G(重点,Wan2.2 对显存远比 SDXL 苛刻,8G 属于勉强可用,必须 FP8 量化)
  • CPU:i5-13400F
  • 系统:Windows11 24H2
  • Python:3.11.10(不要 3.12,Wan2 自定义节点依赖未完全适配)
  • CUDA:12.1
  • ComfyUI:原版 git 稳定版,和之前 SDXL 环境共用一套,不新开环境,避免依赖冲突
  • 核心模型:Wan2.2-T2V-14B FP8 量化版(原版 FP16 14B 直接 OOM,8G 卡跑不动)

⚠️ 重要前置:不要直接用官方原版 FP16 权重,8G 显存必崩;优先选用社区 FP8 量化 safetensors,同时全程开启模型分片加载。 AMD 显卡 Windows 端不推荐,ROCm 视频扩散节点 bug 多,帧率极低。

二、依赖与自定义节点安装(Wan2.2 专属)

在之前已经装好的 ComfyUI 虚拟环境里面继续装依赖,不需要重建 venv。 先激活环境,CMD 执行:

cd ComfyUI
venv\Scripts\activate
pip install transformers accelerate sentencepiece av opencv-python

需要的自定义节点(放到ComfyUI/custom_nodes,git clone)

  1. ComfyUI-WanVideo(Wan2.2 核心加载、采样节点)
  2. ComfyUI-VideoHelperSuite(视频拼接、编码、保存 mp4,必备)
  3. ComfyUI_FizzNodes(循环、种子控制,批量脚本配套)

安装完节点完全关闭 ComfyUI 进程再重启,单纯刷新网页不会加载视频节点,很多人红节点就是这里踩坑。

启动 bat,新增视频显存优化参数,修改start_comfy.bat

@echo off
venv\Scripts\activate
python main.py --listen 0.0.0.0 --enable-cors-header --vram low --cuda-malloc --disable-xformers
pause

--disable-xformers 是针对 WanVideo 节点的特殊适配,部分 xformers 版本会导致视频画面闪烁、花屏。

三、Wan2.2 文生视频基础工作流 JSON(8G 显存 FP8 适配,直接导入)

保存为 wan22_t2v_base.json,ComfyUI Load 加载。

模型路径提醒:把 wan2.2-t2v-14b-fp8.safetensors 放到 models/diffusion_models;VAE 放到models/vae;文本编码器放到models/text_encoders,文件名必须和节点内一致,否则红节点。

{
  "1": {
    "class_type": "WanVideoModelLoader",
    "inputs": {
      "model_name": "wan2.2-t2v-14b-fp8.safetensors",
      "precision": "fp8",
      "gpu_offload": true
    }
  },
  "2": {
    "class_type": "CLIPTextEncode",
    "inputs": {
      "text": "A girl walking slowly in old alley, soft sunset, smooth motion, realistic, cinematic, no flicker",
      "clip": ["1", 1]
    }
  },
  "3": {
    "class_type": "CLIPTextEncode",
    "inputs": {
      "text": "flicker, jitter, distorted face, blurry, extra limbs, watermark, text, bad motion",
      "clip": ["1", 1]
    }
  },
  "4": {
    "class_type": "EmptyLatentVideo",
    "inputs": {
      "width": 832,
      "height": 480,
      "length": 25,
      "batch_size": 1
    }
  },
  "5": {
    "class_type": "WanVideoSampler",
    "inputs": {
      "seed": 98765432,
      "steps": 28,
      "cfg": 6.5,
      "sampler": "dpmpp_2m_sde",
      "scheduler": "karras",
      "denoise": 1.0,
      "model": ["1", 0],
      "positive": ["2", 0],
      "negative": ["3", 0],
      "latent": ["4", 0]
    }
  },
  "6": {
    "class_type": "VAELoader",
    "inputs": {
      "vae_name": "wan_video_vae.safetensors"
    }
  },
  "7": {
    "class_type": "VAEDecodeVideo",
    "inputs": {
      "samples": ["5", 0],
      "vae": ["6", 0]
    }
  },
  "8": {
    "class_type": "VideoHelperSuite_SaveVideo",
    "inputs": {
      "images": ["7", 0],
      "filename_prefix": "wan22_out",
      "fps": 8,
      "codec": "libx264",
      "crf": 23
    }
  }
}

【8G 显存硬性限制,不要乱改】

  1. 分辨率上限 832×480,视频帧数 length 控制 20~30 帧(30 帧≈3.75s@8fps);
  2. 必须开启 gpu_offload,模型分层加载到显存 + 内存;
  3. 不要叠加 ControlNet、IP-Adapter 一起跑,显存直接溢出;
  4. 采样步数 25-30,cfg 不要超过 7。

补充:如果是 12G 及以上显卡,可以改成 1024×576,length 开到 49 帧,精度可以尝试 FP16。

四、进阶 API 脚本:批量提交 Wan2.2 视频任务,自动下载 MP4,带失败重试

这个脚本是在之前 SDXL 图片 API 版本上改造而来,适配视频工作流,增加:任务超时重试、mp4 文件识别、日志写入、跳过重复任务,适合短剧素材批量出片。 文件名 wan22_batch_api.py

import requests
import json
import os
import time
import logging
# 日志配置
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    filename="wan_batch_log.log",
    encoding="utf-8"
)
COMFYUI_URL = "http://127.0.0.1:8188"
WORKFLOW_FILE = "wan22_t2v_base.json"
PROMPT_LIST_FILE = "video_prompts.txt"
OUTPUT_FOLDER = "./wan_video_out"
MAX_RETRY = 2
TASK_TIMEOUT = 300
os.makedirs(OUTPUT_FOLDER, exist_ok=True)
def load_workflow(path: str):
    with open(path, "r", encoding="utf-8") as f:
        return json.load(f)
def submit_prompt(prompt_data):
    try:
        resp = requests.post(f"{COMFYUI_URL}/prompt", json={"prompt": prompt_data}, timeout=20)
        resp.raise_for_status()
        return resp.json()
    except Exception as e:
        logging.error(f"提交任务失败:{str(e)}")
        return None
def wait_task_finish(prompt_id: str):
    start_time = time.time()
    while True:
        if time.time() - start_time > TASK_TIMEOUT:
            logging.warning(f"任务 {prompt_id} 超时")
            return None
        try:
            r = requests.get(f"{COMFYUI_URL}/history/{prompt_id}", timeout=15)
            r.raise_for_status()
            hist = r.json()
            if prompt_id in hist:
                return hist[prompt_id]
        except Exception as e:
            logging.warning(f"轮询任务异常: {e}")
        time.sleep(2)
def download_video(filename: str):
    dl_url = f"{COMFYUI_URL}/view?filename={filename}"
    save_path = os.path.join(OUTPUT_FOLDER, filename)
    if os.path.exists(save_path):
        logging.info(f"文件已存在,跳过: {filename}")
        return True
    try:
        r = requests.get(dl_url, timeout=60)
        r.raise_for_status()
        with open(save_path, "wb") as f:
            f.write(r.content)
        logging.info(f"视频保存成功: {filename}")
        return True
    except Exception as e:
        logging.error(f"下载失败 {filename}: {e}")
        return False
if __name__ == "__main__":
    base_wf = load_workflow(WORKFLOW_FILE)
    with open(PROMPT_LIST_FILE, "r", encoding="utf-8") as f:
        prompt_lines = [p.strip() for p in f if p.strip()]
    for idx, prompt_text in enumerate(prompt_lines):
        logging.info(f"===== 第 {idx+1} 条提示词:{prompt_text} =====")
        base_wf["2"]["inputs"]["text"] = prompt_text
        base_wf["5"]["inputs"]["seed"] = int(time.time() * 1000) % 99999999
        retry_cnt = 0
        success = False
        while retry_cnt < MAX_RETRY and not success:
            task_info = submit_prompt(base_wf)
            if not task_info:
                retry_cnt += 1
                time.sleep(3)
                continue
            pid = task_info["prompt_id"]
            logging.info(f"提交任务ID: {pid}")
            result = wait_task_finish(pid)
            if not result:
                retry_cnt +=1
                continue
            # VideoHelperSuite输出结构
            out_nodes = result["outputs"]
            for node_out in out_nodes.values():
                if "videos" in node_out:
                    for v_item in node_out["videos"]:
                        download_video(v_item["filename"])
            success = True
        if not success:
            logging.error(f"第{idx+1}条任务多次重试失败:{prompt_text}")
        time.sleep(4)

配套 video_prompts.txt(一行一条,适合漫剧动态镜头)

masterpiece,best quality,young woman standing at seaside,wind blows hair,slow movement,soft golden hour,smooth video
masterpiece,best quality,old bookstore interior,light floating dust,slow camera pan,quiet atmosphere,no flicker
masterpiece,best quality,rain drop falling on window,blurred street background,cinematic,stable motion

运行方式:

venv\Scripts\activate
python wan22_batch_api.py

脚本会自动记录日志到 wan_batch_log.log,方便晚上挂机批量跑素材,第二天统一整理视频。

五、高频问题 & 排坑(真人挂机踩坑汇总)

  1. 采样中途爆显存 OOM优先降低视频长度 length,降低分辨率;确认模型是 FP8 量化;开启gpu_offload;不要后台同时跑 SDXL 绘图任务抢占显存。
  2. 生成视频画面持续闪烁、抖动关闭 xformers,加上启动参数--disable-xformers;把 CFG 降到 6-6.5,太高容易时序崩坏;提示词加上no flicker,stable motion。
  3. API 返回成功,但是没有 mp4 输出大概率 VideoHelperSuite 节点编码依赖 ffmpeg 缺失;或者 av 包版本不对,重装:pip install av==12.0.0。
  4. 加载 Wan 模型直接红节点节点版本和模型不匹配;检查模型后缀,部分节点只支持 safetensors,不支持 bin;路径大小写、文件名必须严格一致。
  5. 视频很短,帧率看着卡顿修改 SaveVideo 节点 fps,8fps 是显存友好值;想要流畅可以拉到 12fps,但显存占用上涨明显。

來源:阿里雲開發者社區 AI · developer.aliyun.com