Open-Sora-Plan V1.2 量化使用说明

Open-Sora-Plan V1.2的推理量化依赖于推理工程仓:MindIE/open_sora_planv1_2,根据该工程仓完成配置后,使用以下示例代码进行量化。

支持的模型版本与量化策略

模型系列 模型版本 HuggingFace链接 W8A8 W8A16 W4A16 W4A4 稀疏量化 KV Cache Attention 时间步量化 FA3量化 异常值抑制量化 量化命令
Open-Sora-Plan Open-Sora-Plan v1.2 Open-Sora-Plan v1.2 W8A8静态量化

说明:

  • ✅ 表示该量化策略已通过msModelSlim官方验证,功能完整、性能稳定,建议优先采用。
  • 空格表示该量化策略暂未通过msModelSlim官方验证,用户可根据实际需求进行配置尝试,但量化效果和功能稳定性无法得到官方保证。
  • 点击量化命令列中的链接可跳转到对应的具体量化命令

Open-Sora-Plan V1.2 W8A8静态量化

量化命令和示例代码

量化启动命令

我们提供了完整的量化启动脚本示例:OpenSoraPlanV1_2/inference.py,其启动命令可参考(请提前确保calib_prompts.txt权限不大于'0o640'):

# 根据使用卡数进行配置多卡环境变量和nproc_per_node,以下使用8卡为例
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export PYTORCH_NPU_ALLOC_CONF="expandable_segments:False"
export TASK_QUEUE_ENABLE=2
export HCCL_OP_EXPANSION_MODE="AIV"
torchrun --nnodes=1 --nproc_per_node 8  --master_port 29503 \
    /the/absolute/path/of/example/multimodal_sd/OpenSoraPlanV1_2/inference.py \
    --model_path /path/to/checkpoint-xxx/model_ema \
    --num_frames 93 \
    --height 720 \
    --width 1280 \
    --cache_dir "../cache_dir" \
    --text_encoder_name google/mt5-xxl \
    --text_prompt "example/multimodal_sd/OpenSoraPlanV1_2/calib_prompts.txt" \
    --ae CausalVAEModel_D4_4x8x8 \
    --ae_path "/path/to/causalvideovae" \
    --fps 24 \
    --guidance_scale 7.5 \
    --num_sampling_steps 100 \
    --tile_overlap_factor 0.125 \
    --max_sequence_length 512 \
    --dtype bf16 \
    --use_cfg_parallel \
    --algorithm "dit_cache" \
    --save_img_path "./results/quant/images" \
    --do_quant \
    --quant_weight_save_folder "./results/quant/safetensors" \
    --quant_dump_calib_folder "./results/quant/cache" \
    --quant_type "w8a8"

校准数据Dump和量化的示例代码

import os
import torch

from ascend_utils.common.security.pytorch import safe_torch_load
from msmodelslim.quant import quant_model, SessionConfig
from msmodelslim.quant import W8A8ProcessorConfig, W8A8QuantConfig, SaveProcessorConfig
from example.multimodal_sd.utils import get_disable_layer_names, get_rank, DumperManager, get_rank_suffix_file

DUMP_CALIB_FOLDER = './results/quant/cache'  # 用于存放校准数据的文件夹
SAFE_TENSOR_FOLDER = './results/quant/safe_tensor'  # 用于存放量化模型的文件夹

rank = get_rank()
is_distributed = rank >= 0  # 标记是否为分布式环境

dump_data_path = os.path.join(DUMP_CALIB_FOLDER, get_rank_suffix_file(base_name="calib_data", ext="pth",
                                                                      is_distributed=is_distributed, rank=rank))

############################ 加载模型 ############################
def load_t2v_checkpoint():
    pass


pipeline = load_t2v_checkpoint(model_path)  # 加载模型

model = pipeline.transformer

############################ dump 校准数据 ############################
if not os.path.exists(dump_data_path):  # 检查校准数据是否已存在,不存在则dump
    # 添加forward hook用于dump model的forward输入
    dumper_manager = DumperManager(model, capture_mode='args')

    # 执行浮点模型推理
    run_model_and_save_images(
        pipeline,
        ...
    )
    # 保存校准数据
    dumper_manager.save(dump_data_path)

############################ 启动量化 ############################
# 加载校准数据,校准数据需要提前dump生成
calib_dataset = safe_torch_load(dump_data_path, map_location=f'npu:{rank if is_distributed else 0}')
safetensors_name = get_rank_suffix_file(base_name='quant_model_weight_w8a8', ext='safetensors',
                                        is_distributed=is_distributed, rank=rank)
json_name = get_rank_suffix_file(base_name='quant_model_description_w8a8', ext='json',
                                 is_distributed=is_distributed, rank=rank)
# 量化配置
session_cfg = SessionConfig(
    processor_cfg_map={
        "w8a8": W8A8ProcessorConfig(
            cfg=W8A8QuantConfig(
                act_method='minmax'
            ),
            disable_names=get_disable_layer_names(model, layer_include=None,
                                                    layer_exclude=('*net.2*', '*adaln_single*'))
        ),
        "save": SaveProcessorConfig(
            output_path=SAFE_TENSOR_FOLDER,
            safetensors_name=safetensors_name,
            json_name=json_name,
            save_type=['safe_tensor'],
            part_file_size=None
        )
    },
    calib_data=calib_dataset,
    device='npu'
)

# pydantic库自带的数据类型校验
session_cfg.model_validate(session_cfg)

# 量化模型
quant_model(model, session_cfg)

运行参数说明

以下是使用OpenSoraPlanV1_2/inference.py进行Open-Sora-Plan V1.2模型推理量化时的参数说明。量化启动命令未涉及参数对应的说明请见Open-Sora-Plan V1.2推理工程仓MindIE/open_sora_planv1_2

参数名 含义 使用限制
model_path Open-Sora-Plan V1.2原始浮点模型路径 必选。
数据类型:字符串。无默认值。
num_frames 设置生成的总帧数 可选。
数据类型:整型。默认值93。
height 指定生成视频的高度 可选。
数据类型:整型。默认值720。
width 指定生成视频的宽度 可选。
数据类型:整型。默认值1280。
dtype 指定用于推理的数据类型 可选。
数据类型:字符串。默认值'bf16'。
可选值:'bf16'或'fp16'。
cache_dir 指定缓存目录,用于存储临时文件 可选。
数据类型:字符串。默认值'./cache_dir'。
ae VAE的对视频的压缩规格 可选。
数据类型:字符串。默认值'CausalVAEModel_4x8x8'。
ae_path 指定VAE模型权重配置路径 可选。
数据类型:字符串。默认值'CausalVAEModel_4x8x8'。
text_encoder_name 指定text_encoder权重配置路径 可选。
数据类型:字符串。默认值'google/mt5-xxl'。
save_img_path 指定生成视频的保存路径 可选。
数据类型:字符串。默认值"./sample_videos/t2v"。
guidance_scale 指定引导比例,用于控制negative文本对视频生成的影响程度 可选。
数据类型:浮点型。默认值7.5。
num_sampling_steps 指定采样步骤的数量,用于控制生成视频的多样性 可选。
数据类型:整型。默认值50。
fps 指定生成视频的帧率 可选。
数据类型:整型。默认值24。
batch_size 指定批处理大小,用于控制一次生成视频的数量 可选。
数据类型:整型。默认值1。
max_sequence_length 指定最大序列长度,用于控制文本编码器的输入长度 可选。
数据类型:整型。默认值512。
text_prompt 指定文本提示,可以是单个字符串或包含多个字符串的列表,也可以是包含多个字符串的文本文件路径 必选。
数据类型:字符串或字符串列表、txt文件。无默认值。
tile_overlap_factor VAE tiling decode时重叠比例,用于控制生成视频的细节 可选。
数据类型:浮点型。默认值0.25。
algorithm 指定使用的算法 可选。
数据类型:字符串。默认值None。
可选值:None、'dit_cache'或'sampling_optimize'。
use_cfg_parallel 是否使用cfg并行,用于控制模型的并行计算方式 可选。
数据类型:布尔型。默认值False。只有显式传入 --use_cfg_parallel 则变为True。
test_time 是否开启性能测试 可选。
数据类型:布尔型。默认值False。只有显式传入 --test_time 则变为True。
seed 控制随机种子 可选。
数据类型:整型。默认值1234。
vae_parallel 是否启用VAE并行计算 可选。
数据类型:布尔型。默认值False。只有显式传入 --vae_parallel 则变为True。
do_quant 是否进行量化 必选。
数据类型:布尔型。默认False,即不启动量化。只有显式传入 --do_quant 则变为True,在进行Open-Sora-Plan v1.2模型推理量化时,必须使能该参数。
quant_type 指定量化类型 可选。
数据类型:字符串。默认值"w8a8"。
可选值:"w8a8"。
quant_weight_save_folder 指定量化模型权重保存路径 必选。
数据类型:字符串。无默认值。
quant_dump_calib_folder 指定量化校准数据保存路径 必选。
数据类型:字符串。无默认值。
do_save_video 是否进行推理视频保存 可选。
数据类型:布尔型。默认False,即不启动推理视频保存。只有显式传入 --do_save_video 则变为True,启动视频保存。