本项目用于记录 LightX2V 在国产化计算平台上的运行示例,主要包括:
- 单卡和分布式推理脚本;
- 模型推理配置;
- 推理服务启动脚本;
- T2I、T2V 服务测速脚本及测试数据;
- 不同平台、模型和配置下的测速结果留档。
当前仓库收录 昇腾 NPU(Ascend)、寒武纪 MLU590 与 MetaX C500 的运行示例。
.
├── configs/ # 各平台的模型推理配置
│ ├── ascend_npu/
│ │ ├── single/ # 单卡配置
│ │ ├── dist_2/ # 两卡配置
│ │ └── dist_8/ # 八卡配置
│ ├── mlu/
│ │ ├── single/
│ │ ├── dist_2/
│ │ └── dist_8/
│ └── metax/
│ ├── single/
│ ├── dist_2/
│ └── dist_8/
├── scripts/
│ ├── lib/
│ │ └── infer_runtime.sh # 推理归档、通用预检、结果校验和进程管理
│ ├── preflight_infer.py # 入口、配置、设备及公共输入预检
│ ├── run_record.py # 生成并完成结构化 run.json
│ ├── logging.sh # 旧脚本兼容日志入口
│ ├── mlu/
│ │ ├── infer/ # MLU 单卡、双卡和八卡离线推理
│ │ ├── run_infer_suite.py
│ │ ├── run_all_detached.sh
│ │ ├── resume_detached.sh
│ │ └── auto_resume_detached.sh
│ ├── metax/
│ │ ├── infer/ # C500 单卡、双卡和八卡离线推理
│ │ ├── run_infer_suite.py
│ │ ├── run_all_detached.sh
│ │ └── resume_detached.sh
│ └── ascend/
│ ├── infer/ # 离线推理脚本
│ │ ├── single/
│ │ ├── dist_2/
│ │ └── dist_8/
│ └── server/ # 推理服务启动脚本
│ ├── single/
│ └── dist/
├── tests/ # 服务测速脚本
├── data/ # 本机测速用 JSONL、图片和音频
├── logs/ # 运行日志(不提交到 Git)
└── results/ # 推理及测速结果(不提交到 Git)
目前仓库包含 Wan2.1、Wan2.1 Self-Forcing、Wan2.2 MoE、HunyuanVideo 1.5、LTX-2.3、FLUX.2-dev、Qwen-Image、LongCat-Image 和 Z-Image-Turbo 等模型示例,覆盖 T2I(文生图)、T2V(文生视频)和 S2V 等任务。
当前单样本单卡正式测速范围是下文列出的 11 个全重 BF16 用例。Wan2.1 1.3B 仅保留官方推荐的 480p;Wan2.2 MoE 和 HunyuanVideo 1.5 分别保留 480p、720p;图像模型只保留 16:9 原生分辨率档。
MetaX 配置覆盖同一组 11 个单卡、1 个双卡和 11 个八卡用例,固定使用 /data/LightX2V-metax 与 /data/models。当前 64 GiB C500 的算子、offload、MXLink 拓扑、运行命令、分组日志/结果目录及断点恢复说明见 scripts/metax/README.md。
MLU 入口按当前测试机的固定资源编写:
| 资源 | 固定路径 |
|---|---|
| Examples 项目 | /data/Lightx2v-Platform-Run-Examples |
| LightX2V 主项目 | /data/LightX2V-mlu |
| 模型权重根目录 | /data/models |
| MLU 推理配置 | /data/Lightx2v-Platform-Run-Examples/configs/mlu |
| LTX-2.3 S2V 默认音频 | /data/LightX2V-mlu/assets/inputs/audio/seko_input.mp3 |
配置覆盖与 Ascend 相同的 11 个单卡、1 个双卡和 11 个八卡用例,模型规格、分辨率、帧数、步数、seed 及并行策略与下文两个表一致。MLU 使用本地全重 BF16,不启用量化、蒸馏或缓存;Wan2.1 与 Wan2.2 使用 mlu_sage_attn,LTX-2.3 DiT 使用 torch_sdpa 且 Gemma 使用 mlu_flash_attn,其余模型使用 mlu_flash_attn。在当前 MLU 算子版本和 Wan2.2 的真实 480p/720p attention shape 下,Sage 微测比 Flash 分别快约 11.5% 和 11.9%,因此正式配置统一选择 Sage。FLUX.2-dev 的 Mistral3 单独注册 mlu_flash_attn,避免原生 MLU SDPA 产生 NaN;在 512-token、32Q/8KV 的实际 GQA 形状下,该实现比稳定的 eager 路径快约 17.8%。
入口在加载 LightX2V base.sh 后把 PROFILING_DEBUG_LEVEL 重置为 0,避免逐算子性能统计影响正式推理速度;完整 stdout/stderr、配置和运行元数据仍会归档。
MLU590 每卡为 80 GiB,offload 策略针对当前 /data/models 权重优化:
| 用例 | MLU590 策略 |
|---|---|
| Wan2.2 单卡、CFG2×SP4、TP8 | 全部关闭 CPU offload;80 GiB 可省去 Ascend 64 GiB 配置中的 model 搬运 |
| Qwen-Image、HunyuanVideo 单卡及 CFG2×SP4 | Qwen2.5-VL 与主模型均不 offload |
| LTX-2.3 单卡及 SP8 | 约 51.3 GiB Gemma/文本投影编码后回 CPU;约 35.4 GiB DiT 采用 model offload,只在 30 步去噪首尾各搬运一次;约 1.7 GiB VAE/audio 常驻。SP8 仅切序列、不切权重,全常驻至少约 88.4 GiB,不能装入 80 GiB |
| FLUX.2-dev 单卡 | Mistral3 编码后回 CPU,DiT 采用 model offload 并在 50 步去噪期间整模常驻,VAE 常驻;约 45 GiB 文本编码器与约 60 GiB DiT 不会同时占用 MLU |
| FLUX.2-dev TP8 | DiT、Mistral3、VAE 均不 offload |
| Wan2.1、Self-Forcing、LongCat、Z-Image | 无 offload |
运行单个用例:
cd /data/Lightx2v-Platform-Run-Examples
bash scripts/mlu/infer/single/run_wan21_1_3b_t2v_480p_81f.sh
bash scripts/mlu/infer/dist_8/run_wan21_1_3b_t2v_480p_81f_cfg2_sp4.sh单独运行入口时,单卡默认使用 MLU 0,双卡默认使用 0、1,八卡默认使用 0–7;可以在启动前显式设置 MLU_VISIBLE_DEVICES 映射到其他物理卡。完整 mixed suite 为避免不同卡数组继承同一列表,会固定按 0、0,1、0,1,2,3,4,5,6,7 分配设备。
每个用例的日志和结果按卡数分开保存,失败和中断记录也会保留:
logs/mlu/infer/single|dist_2|dist_8/<case_id>/<run_id>/
├── run.log
└── run.json
results/mlu/infer/single|dist_2|dist_8/<case_id>/<run_id>/
└── output.png|mp4
顺序执行完整 23 用例并脱离当前终端或 VSCode 会话:
cd /data/Lightx2v-Platform-Run-Examples
bash scripts/mlu/run_all_detached.sh启动器会立即输出 suite ID、后台 PID、controller 日志和状态文件路径。套件日志位于 logs/mlu/infer/suites/<suite_id>/controller.log,可恢复状态位于同目录的 suite.json。套件默认在单个用例失败后继续,确保其余模型仍被执行;同样以脱离会话的方式恢复失败或未完成的用例:
bash scripts/mlu/resume_detached.sh <suite_id>如果正在运行的套件修正了失败配置,可预先挂接一次自动恢复。它会等待当前 controller 退出,再以新代码仅重跑失败或产物无效的用例:
bash scripts/mlu/auto_resume_detached.sh <suite_id> [controller_pid]等待日志保存为同一 suite 目录下的 auto_resume.log,恢复阶段的输出继续追加到 controller.log。自动恢复进程同样使用独立 session,不依赖 VS Code 或当前终端。
也可用 --scope single、--scope multi 或重复传入 --only <case_id> 运行子集。MLU 环境强制使用本地权重并设置 Hugging Face/Transformers 离线模式,因此断开编辑器或网络不影响已经启动的套件。
本仓库的昇腾推理入口按当前测试机编写,路径和设备号直接写在各入口顶部,不通过路径环境变量覆盖:
| 资源 | 本机固定路径 |
|---|---|
| Examples 项目 | /data/wushuo1/Lightx2v-Platform-Run-Examples |
| LightX2V 主项目 | /data/wushuo1/LightX2V |
| 模型权重根目录 | /data/wushuo1/models |
| 推理配置 | /data/wushuo1/Lightx2v-Platform-Run-Examples/configs/ascend_npu |
| 服务测速数据 | /data/wushuo1/Lightx2v-Platform-Run-Examples/data |
| LTX-2.3 S2V 默认音频 | /data/wushuo1/LightX2V/assets/inputs/audio/seko_input.mp3 |
运行前确认:
/data/wushuo1/LightX2V可以在当前昇腾环境正常推理。- 对应用例的权重已经位于
/data/wushuo1/models/<模型目录>。 - 配置文件和本地测试数据存在。
- 需要
ffprobe或 PyAV 之一来完整校验视频编码、分辨率和帧数;优先使用ffprobe,未安装时使用 PyAV 全量解码,两者均不可用会将产物校验记为失败。 - 单卡入口固定使用 NPU 0,Z-Image-Turbo 两卡入口固定使用 NPU 0、1,八卡入口固定使用 NPU 0–7。
每个入口都采用与 LightX2V 主项目平台脚本一致的可读结构:先声明小写路径和用例参数,显式加载 scripts/base/base.sh,并在 lightx2v_infer 函数中完整写出 python 或 torchrun 命令。模型类别、任务、prompt、seed、配置和输出规格均以入口脚本为准。
scripts/lib/infer_runtime.sh 不生成或隐藏模型命令。它只负责为入口创建本次运行目录、保存 stdout/stderr、执行公共预检、管理子进程和信号、生成 run.json,并校验最终图片或视频。
所有配置均使用当前全重 BF16,不启用量化、蒸馏或特征缓存。配置文件名使用 <case_id>.json,入口脚本使用 run_<case_id>.sh,其中 case_id 明确包含模型版本、任务、分辨率及视频帧数。
| 用例 | 目标规格 | 步数 | 首选 offload | 入口脚本 |
|---|---|---|---|---|
| Wan2.1 T2V 1.3B | 832×480,81 帧 | 50 | 无 | run_wan21_1_3b_t2v_480p_81f.sh |
| Wan2.2 MoE T2V A14B | 832×480,81 帧 | 40 | DiT model | run_wan22_moe_a14b_t2v_480p_81f.sh |
| Wan2.2 MoE T2V A14B | 1280×720,81 帧 | 40 | DiT model | run_wan22_moe_a14b_t2v_720p_81f.sh |
| Wan2.1 Self-Forcing 1.3B | 832×480,81 帧 | 4 | 无 | run_wan21_1_3b_self_forcing_t2v_480p_81f.sh |
| HunyuanVideo-1.5 T2V | 848×480,121 帧 | 50 | 仅 Qwen2.5-VL 编码器 | run_hunyuan_video_15_t2v_480p_121f.sh |
| HunyuanVideo-1.5 T2V | 1264×720,121 帧 | 50 | 仅 Qwen2.5-VL 编码器 | run_hunyuan_video_15_t2v_720p_121f.sh |
| LTX-2.3 S2V 22B dev | 768×512,241 帧 | 30 | DiT model + Gemma | run_ltx2_3_22b_dev_s2v_768x512_241f.sh |
| Qwen-Image-2512 T2I | 1664×928 | 50 | 仅 Qwen2.5-VL 编码器 | run_qwen_image_2512_t2i_1664x928.sh |
| LongCat-Image T2I | 1344×768 | 50 | 无 | run_longcat_image_t2i_1344x768.sh |
| Z-Image-Turbo T2I | 1664×928 | 9(实际 8 NFE) | 无 | run_z_image_turbo_t2i_1664x928.sh |
| FLUX.2-dev T2I | 1344×768 | 50 | block | run_flux2_dev_t2i_1344x768.sh |
在项目根目录执行对应脚本。例如,使用单张昇腾 NPU 运行 Wan2.1 T2V:
cd /data/wushuo1/Lightx2v-Platform-Run-Examples
bash scripts/ascend/infer/single/run_wan21_1_3b_t2v_480p_81f.sh每次执行会生成不会互相覆盖的 run_id,日志和结果固定归档在本项目下:
logs/ascend_npu/infer/<case_id>/<run_id>/
├── run.log # 从预检开始的完整 stdout/stderr、命令和运行结果摘要
└── run.json # 配置、版本、参数、状态、耗时指标及产物校验信息
results/ascend_npu/infer/<case_id>/<run_id>/
└── output.png|mp4
只有 LightX2V 子进程退出码为 0 且结果文件存在、非空并通过格式可读性校验时,run.json 才会标记为 succeeded。失败或中断的 run.log、run.json 和已产生的文件同样保留。run.json 通过结果路径、文件大小和 SHA-256 与产物对应。
run.json 会保留配置快照和 SHA-256、入口及主项目参考脚本、LightX2V Git commit、Python/关键依赖版本、NPU 信息、完整 prompt/seed,以及从 LightX2V [Profile] 日志提取的模型加载、文本编码、DiT、VAE、Pipeline、Total Cost。存在对应原始指标时,还会计算 DiT 单步耗时、视频生成帧吞吐或图片吞吐;缺失值保持 null,不会猜测。
多卡入口只保留能让同一个样本有效使用全部进程的配置。八卡配置统一位于 configs/ascend_npu/dist_8/,两卡 Z-Image-Turbo 配置位于 configs/ascend_npu/dist_2/;不保留四卡目录。
| 模型 | 卡数与并行策略 | 目标规格 | 首选 offload | 配置与入口 |
|---|---|---|---|---|
| Wan2.1 T2V 1.3B | 8,CFG2×SP4 | 832×480,81 帧 | 无 | wan21_1_3b_t2v_480p_81f_cfg2_sp4.json / run_wan21_1_3b_t2v_480p_81f_cfg2_sp4.sh |
| Wan2.2 MoE T2V A14B | 8,CFG2×SP4 | 832×480,81 帧 | DiT model | wan22_moe_a14b_t2v_480p_81f_cfg2_sp4.json / run_wan22_moe_a14b_t2v_480p_81f_cfg2_sp4.sh |
| Wan2.2 MoE T2V A14B | 8,TP8 | 832×480,81 帧 | 无 | wan22_moe_a14b_t2v_480p_81f_tp8.json / run_wan22_moe_a14b_t2v_480p_81f_tp8.sh |
| Wan2.2 MoE T2V A14B | 8,CFG2×SP4 | 1280×720,81 帧 | DiT model | wan22_moe_a14b_t2v_720p_81f_cfg2_sp4.json / run_wan22_moe_a14b_t2v_720p_81f_cfg2_sp4.sh |
| Wan2.2 MoE T2V A14B | 8,TP8 | 1280×720,81 帧 | 无 | wan22_moe_a14b_t2v_720p_81f_tp8.json / run_wan22_moe_a14b_t2v_720p_81f_tp8.sh |
| HunyuanVideo-1.5 T2V | 8,CFG2×SP4 | 848×480,121 帧 | Qwen2.5-VL | hunyuan_video_15_t2v_480p_121f_cfg2_sp4.json / run_hunyuan_video_15_t2v_480p_121f_cfg2_sp4.sh |
| HunyuanVideo-1.5 T2V | 8,CFG2×SP4 | 1264×720,121 帧 | Qwen2.5-VL | hunyuan_video_15_t2v_720p_121f_cfg2_sp4.json / run_hunyuan_video_15_t2v_720p_121f_cfg2_sp4.sh |
| LTX-2.3 S2V 22B dev | 8,SP8 | 768×512,241 帧 | DiT model + Gemma | ltx2_3_22b_dev_s2v_768x512_241f_sp8.json / run_ltx2_3_22b_dev_s2v_768x512_241f_sp8.sh |
| FLUX.2-dev T2I | 8,TP8 | 1344×768 | 无 | flux2_dev_t2i_1344x768_tp8.json / run_flux2_dev_t2i_1344x768_tp8.sh |
| Qwen-Image-2512 T2I | 8,CFG2×SP4 | 1664×928 | Qwen2.5-VL | qwen_image_2512_t2i_1664x928_cfg2_sp4.json / run_qwen_image_2512_t2i_1664x928_cfg2_sp4.sh |
| LongCat-Image T2I | 8,CFG2×SP4 | 1344×768 | 无 | longcat_image_t2i_1344x768_cfg2_sp4.json / run_longcat_image_t2i_1344x768_cfg2_sp4.sh |
| Z-Image-Turbo T2I | 2,SP2 | 1664×928 | 无 | z_image_turbo_t2i_1664x928_sp2.json / run_z_image_turbo_t2i_1664x928_sp2.sh |
Wan2.1 Self-Forcing 关闭了 CFG,并且 12 个 attention heads 不能被 8 整除,因此没有创建无效的八卡入口。Z-Image-Turbo 有 30 个 attention heads,同样不支持 SP8,按两卡 SP2 提供。
Wan2.2 的 TP8 与 CFG2×SP4 是两组独立对照:TP8 会切分权重,使用无 offload 速度配置;CFG2×SP4 不切分权重,因此在 64 GiB 显存上保留 model 级 CPU offload。
例如运行八卡 Wan2.1 480p:
cd /data/wushuo1/Lightx2v-Platform-Run-Examples
bash scripts/ascend/infer/dist_8/run_wan21_1_3b_t2v_480p_81f_cfg2_sp4.sh八卡入口固定使用 ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7,Z-Image-Turbo 两卡入口固定使用 0,1。所有多卡入口均在脚本中显式写出 torchrun 命令,并沿用单卡相同的 run.log、run.json 和结果文件归档格式;run.json 额外记录 benchmark.parallel_strategy。多卡日志中的规范化 Profile 指标取各 rank 的最大耗时,表示决定整次推理速度的最慢 rank。
使用单卡配置启动 FLUX.2-dev T2I 服务:
cd /data/wushuo1/Lightx2v-Platform-Run-Examples
bash scripts/ascend/server/single/start_server_flux2_dev_t2i_1344x768.sh多卡服务入口与 scripts/ascend/infer/dist_2、dist_8 的测试配置一一对应。例如启动八卡 Wan2.1 T2V 服务:
cd /data/wushuo1/Lightx2v-Platform-Run-Examples
bash scripts/ascend/server/dist/start_server_wan21_1_3b_t2v_480p_81f_cfg2_sp4.sh服务默认监听 8000 端口,Prometheus 指标端口为 8001。可通过 PORT、METRIC_PORT 和 MASTER_PORT 覆盖。
测速数据为 JSONL 格式。T2I/T2V 每行包含 prompt 和 seed;S2V 额外包含 audio_path:
{"prompt": "A cat running on the grass.", "seed": 42}
{"prompt": "A woman speaking.", "seed": 42, "audio_path": "audios/01.mp3"}推荐先用 dry-run 校验当前 12 个分布式服务、配置、数据和命令:
cd /data/wushuo1/Lightx2v-Platform-Run-Examples
python scripts/run_service_suite.py --dry-run执行完整服务测速:
python scripts/run_service_suite.py默认对每个服务执行一次不计入统计的 warm-up,再以并发 1 测量 10 个样本。T2I 使用同步 PNG 接口;T2V 和 LTX2.3 S2V 使用异步任务接口。只执行指定 case:
python scripts/run_service_suite.py \
--only wan21_1_3b_t2v_480p_81f_cfg2_sp4日志写入 logs/ascend_npu/server/<suite_id>/,结果写入 results/ascend_npu/server/<suite_id>/,两边使用相同的 suite_id。每个 case 保留:
- 服务、warm-up 和正式客户端日志;
- 测试前后的 Prometheus 指标及 NPU 状态;
- p50、p90、平均/最小/最大端到端延迟、吞吐量和成功率;
- 每个请求的 task ID、耗时、错误、结果路径、文件大小和 SHA256;
- 生成的 PNG/MP4、Git 状态、配置和数据文件校验值。
任何正式样本失败都会使该 case 失败。统计中不包含 p95 和 p99。
也可在已经启动服务时单独运行通用 benchmark:
python bench_t2i_service.py --help
python bench_t2v_service.py --helpsuite 只会终止自己创建的进程组。若测试前发现无法确认归属的 NPU 进程或端口占用,会停止测试而不会直接清理外部进程。
为了便于横向对比,每次测速建议至少记录以下信息:
- 芯片型号、设备数量及驱动/CANN 版本;
- LightX2V 版本或 Git commit;
- 模型、任务类型和配置文件;
- 输入分辨率、生成长度、推理步数及精度;
- 并发数、请求数、延迟、吞吐量和峰值显存。
新增平台时,建议沿用 configs/<platform>/{single,dist_<卡数>} 和 scripts/<platform>/infer/{single,dist_<卡数>} 的目录约定。