## 一、项目概述
本次测试目标是在海光 DCU K100-AI 单卡环境下,使用 ComfyUI 跑通 Wan2.2 图生视频工作流,并验证 INT8 权重加载、LightX2V LoRA 加速、以及第二轮热启动后的生成耗时。
**单卡 797 秒**流程,对应日志中的结果为:
```
Prompt executed in 00:13:17
```
也就是约797秒
这条路线是:
```
ComfyUI 原生 Wan 节点
+ wan_offline_int8_loader
+ Wan2.2 INT8 high/low noise 权重
+ LightX2V 4-step LoRA
+ 单卡 K100-AI
```
## 二、测试环境
### 2.1 机器与容器
| 项目 | 配置 |
| ------------ | ------------------------------ |
| 节点 | `192.168.217.66` |
| 容器 ID | `9b4637fb8077` |
| 加速卡 | 海光 DCU K100-AI |
| 测试卡数 | 单卡 |
| 使用设备 | `cuda:0 K100_AI : native` |
| 显存 | `65520 MB` |
| 主机内存 | `193093 MB` |
| PyTorch | `2.9.0` |
| ROCm | `(6, 3)` |
| ComfyUI | `0.3.56` |
| ComfyUI 路径 | `/root/ComfyUI_DEMO/ComfyUI` |
| 数据路径 | `/data` |
| 日志路径 | `/data/profiles` |
日志中确认的信息:
```
Total VRAM 65520 MB, total RAM 193093 MB
pytorch version: 2.9.0
AMD arch: gfx928:sramecc+:xnack-
ROCm version: (6, 3)
Device: cuda:0 K100_AI : native
ComfyUI version: 0.3.56
```
## 三、使用的工作流
本次 797 秒对应的 UI 工作流是:
```
/data/图生视频(video_wan2_2_14B_i2v)_modi_int8_optim.json
```
实际 API prompt 记录文件是:
```
/data/profiles/wan22_int8_optim_r2_prompt.json
```
对应运行日志:
```
/data/profiles/comfy_8189_int8_optim_timing.log
```
对应运行记录:
```
/data/profiles/wan22_int8_optim_r2_run.json
```
## 四、模型文件准备
### 4.1 INT8 high / low noise 权重
本次使用两份 Wan2.2 INT8 权重:
```
wan2.2_i2v_high_noise_14B_int8_lightx2v.safetensors
wan2.2_i2v_low_noise_14B_int8_lightx2v.safetensors
```
容器中的路径为:
```
/root/ComfyUI_DEMO/ComfyUI/models/diffusion_models/wan2.2_i2v_high_noise_14B_int8_lightx2v.safetensors
/root/ComfyUI_DEMO/ComfyUI/models/diffusion_models/wan2.2_i2v_low_noise_14B_int8_lightx2v.safetensors
```
这两个文件实际是 `/data` 下权重的软链接:
```
/root/ComfyUI_DEMO/ComfyUI/models/diffusion_models/wan2.2_i2v_high_noise_14B_int8_lightx2v.safetensors -> /data/wan2.2_i2v_high_noise_14B_int8_lightx2v.safetensors
/root/ComfyUI_DEMO/ComfyUI/models/diffusion_models/wan2.2_i2v_low_noise_14B_int8_lightx2v.safetensors -> /data/wan2.2_i2v_low_noise_14B_int8_lightx2v.safetensors
```
如果需要重新创建软链接,可以执行:
```
ln -sf /data/wan2.2_i2v_high_noise_14B_int8_lightx2v.safetensors \
/root/ComfyUI_DEMO/ComfyUI/models/diffusion_models/wan2.2_i2v_high_noise_14B_int8_lightx2v.safetensors
ln -sf /data/wan2.2_i2v_low_noise_14B_int8_lightx2v.safetensors \
/root/ComfyUI_DEMO/ComfyUI/models/diffusion_models/wan2.2_i2v_low_noise_14B_int8_lightx2v.safetensors
```
### 4.2 LightX2V 4-step LoRA
本次工作流还使用了 high / low noise 两个 LoRA:
```
/root/ComfyUI_DEMO/ComfyUI/models/loras/wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors
/root/ComfyUI_DEMO/ComfyUI/models/loras/wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors
```
工作流中 LoRA 强度为:
```
strength_model = 1.0
```
### 4.3 VAE
使用 VAE:
```
wan_2.1_vae.safetensors
```
节点配置:
```
"vae_name": "wan_2.1_vae.safetensors"
```
### 4.4 文本编码器
使用文本编码器:
```
umt5_xxl_fp8_e4m3fn_scaled.safetensors
```
节点配置:
```
"clip_name": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
"type": "wan",
"device": "default"
```
## 五、INT8 Loader 安装
这条路线依赖:
```
wan_offline_int8_loader
```
自定义节点安装位置:
```
/root/ComfyUI_DEMO/ComfyUI/custom_nodes/wan_offline_int8_loader
```
启动日志里可以看到:
```
Wan offline INT8 loader custom node installed.
```
在运行时,loader 成功替换了 Wan 模型里的 Linear 层:
```
Wan offline INT8 loader: replaced 400 Linear layers.
```
这是这条单卡 INT8 路线的关键点。
## 六、启动 ComfyUI 服务
进入容器后,建议先加载环境:
```
source /opt/dtk/env.sh
```
如果只跑单卡,可以指定:
```
export HIP_VISIBLE_DEVICES=0
```
然后启动 ComfyUI:
```
cd /root/ComfyUI_DEMO
python ComfyUI/main.py \
--disable-cuda-malloc \
--use-pytorch-cross-attention \
--port 8189 \
--listen 0.0.0.0 \
> /data/profiles/comfy_8189_int8_optim_timing.log 2>&1
```
如果要后台启动:
```
cd /root/ComfyUI_DEMO
nohup python ComfyUI/main.py \
--disable-cuda-malloc \
--use-pytorch-cross-attention \
--port 8189 \
--listen 0.0.0.0 \
> /data/profiles/comfy_8189_int8_optim_timing.log 2>&1 &
```
服务启动后检查:
```
curl http://127.0.0.1:8189/system_stats
```
浏览器访问:
```
http://服务器IP:8189
```
## 七、工作流关键参数
### 7.1 基础图生视频参数
工作流中图生视频节点:
```
"width": 640,
"height": 640,
"batch_size": 1
```
帧数由表达式计算:
```
"expression": "floor (a * b + 1)"
```
其中:
```
a = 5
b = 16
```
所以:
```
floor(5 * 16 + 1) = 81 帧
```
也就是说本次是:
```
640 x 640
81 帧
16 FPS
```
### 7.2 采样参数
工作流里使用两个 `KSamplerAdvanced`,分别对应 high noise 和 low noise 阶段。
总 steps:
```
20
```
切分点:
```
10
```
所以实际表现为两段采样:
```
high noise:0 -> 10
low noise:10 -> 20
```
日志中能看到两段进度条,每段都是 `10/10`。
采样器:
```
euler
```
调度器:
```
simple
```
CFG:
```
3.5
```
shift:
```
5.0
```
seed:
```
766384517380855
```
### 7.3 high noise 模型节点
```
"unet_name": "wan2.2_i2v_high_noise_14B_int8_lightx2v.safetensors",
"weight_dtype": "default"
```
对应 LoRA:
```
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors",
"strength_model": 1.0
```
### 7.4 low noise 模型节点
```
"unet_name": "wan2.2_i2v_low_noise_14B_int8_lightx2v.safetensors",
"weight_dtype": "default"
```
对应 LoRA:
```
"lora_name": "wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors",
"strength_model": 1.0
```
## 八、提交工作流
如果通过 Web UI 操作,可以在 ComfyUI 页面里导入:
```
/data/图生视频(video_wan2_2_14B_i2v)_modi_int8_optim.json
```
然后点击运行。
如果通过 API 提交,可以使用导出的 API prompt:
```
/data/profiles/wan22_int8_optim_r2_prompt.json
```
提交方式大致如下:
```
curl -X POST http://127.0.0.1:8189/prompt \
-H "Content-Type: application/json" \
-d @/data/profiles/wan22_int8_optim_r2_prompt.json
```
如果需要标准 ComfyUI API 格式,可以包装成:
```
{
"prompt": {
"...": "这里是 workflow prompt 内容"
},
"client_id": "your-client-id"
}
```
## 九、实测结果
### 9.1 第一轮结果
第一轮日志:
```
Prompt executed in 00:14:32
```
也就是:
```
872 秒
```
第一轮里包含较多加载和初始化开销,例如:
```
VAE load device: cuda:0, offload device: cpu, dtype: torch.bfloat16
CLIP/text encoder model load device: cuda:0, offload device: cpu, current: cpu, dtype: torch.float16
Wan offline INT8 loader: replaced 400 Linear layers.
```
第一轮采样日志中能看到两段 10 step:
```
100%|██████████| 10/10 [06:36<00:00, 39.67s/it]
100%|██████████| 10/10 [05:53<00:00, 35.39s/it]
Prompt executed in 00:14:32
```
### 9.2 第二轮结果,也就是 797 秒
第二轮在不关闭服务的情况下继续提交。模型、VAE、文本编码器已经热起来,因此总耗时下降。
日志结果:
```
Prompt executed in 00:13:17
```
换算为:
```
797 秒
```
第二轮采样日志:
```
100%|██████████| 10/10 [05:54<00:00, 35.47s/it]
100%|██████████| 10/10 [05:53<00:00, 35.39s/it]
Prompt executed in 00:13:17
```
可以看到第二轮两段采样都稳定在 35 秒左右一段平均 step 时间。
### 9.3 结果汇总
| 轮次 | 状态 | 耗时 |
| ------ | ---- | --------------------------- |
| 第一轮 | 成功 | `00:14:32`,约 `872 秒` |
| 第二轮 | 成功 | `00:13:17`,约 `797 秒` |
对应日志:
```
/data/profiles/comfy_8189_int8_optim_timing.log
```
对应第二轮 prompt:
```
/data/profiles/wan22_int8_optim_r2_prompt.json
```
对应第二轮 run 记录:
```
/data/profiles/wan22_int8_optim_r2_run.json
```
## 十、关键日志说明
### 10.1 单卡确认
日志里显示:
```
Device: cuda:0 K100_AI : native
```
说明本次是单卡。
### 10.2 INT8 loader 生效
日志里显示:
```
Wan offline INT8 loader custom node installed.
Wan offline INT8 loader: replaced 400 Linear layers.
```
说明 INT8 权重加载和 Linear 替换生效。
### 10.3 注意 Flash Attention 日志
日志里有:
```
Warning: sdpa adopt the new interface of flash-attn
```
以及:
```
Using pytorch attention
```
说明这条路线里 attention 相关实现和当时安装的 FA 包有关,但本次 797 秒结果主要对应的是 INT8 optim 工作流本身。
## 十一、常见问题
### 11.1 这条路线用了几张卡?
单卡。
日志中设备是:
```
cuda:0 K100_AI
```
如果要强制单卡,启动前设置:
```
export HIP_VISIBLE_DEVICES=0
```
### 11.2 为什么第二轮更快?
第一轮会加载 VAE、CLIP、模型权重,并执行 INT8 Linear 替换。第二轮复用已加载的模型与缓存,所以总耗时更低。
### 11.3 为什么进度条是两段 10/10?
Wan2.2 I2V 有 high noise 和 low noise 两个模型阶段。工作流里总 steps 是 20,切分点是 10,所以日志上表现为两段:
```
high noise: 10 steps
low noise: 10 steps
```
## 十二、结论
本次在海光 DCU K100-AI 单卡上,使用 ComfyUI 原生 Wan2.2 图生视频工作流,加载 INT8 high/low noise 权重,并通过 `wan_offline_int8_loader` 替换 400 个 Linear 层,成功完成 640x640、81 帧、20 steps 的图生视频生成。
最终单卡第二轮热启动耗时:
```
00:13:17
```
整体流程稳定,适合作为单卡 INT8 路线的部署参考。