ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ComfyUI 量化完全指南:从 FP8/FP4 原理到 Quantized Checkpoint 实战(ComfyUI-Zluda)

ComfyUI 量化完全指南:从 FP8/FP4 原理到 Quantized Checkpoint 实战(ComfyUI-Zluda) 人工智能大模型媒体生成计算机视觉后端【免费下载链接】ComfyUI-ZludaThe most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface. Now ZLUDA enhanced for better AMD GPU performance.项目地址https://gitcode.com/gh_mirrors/co/ComfyUI-Zluda点击查看免费下载导读本文以仓库根目录下的 QUANTIZATION.md 为核心骨架系统讲解 ComfyUI 的量化Quantization实现从 FP16→FP8 的数值映射原理出发深入QuantizedTensor派生子类与两级注册表的分发架构剖析MixedPrecisionOps的逐层混合精度加载机制并完整给出量化 checkpoint 的文件格式、缩放参数表、元数据规范以及创建量化模型的实操路径含权重量化、PTQ 激活量化校准与 diffusion attention 偏好配置。读完本文你将掌握如何阅读量化 checkpoint、如何编写兼容的量化 Layout、如何利用layer_quant_config做逐层精度取舍以及如何制作和验证 FP8/FP4 量化模型。一、量化是如何工作的数值映射、动态范围与缩放因子量化的目标是把高精度数值x_f以尽量小的精度损失映射到低精度格式从而用更小的内存占用承载模型并借助专用硬件如支持 FP8 张量核的 GPU提升吞吐。如果直接用 round-nearest 把 FP16 数值转成 FP8通常会遇到两个问题动态范围不匹配FP16 的动态范围约为 (-65,504, 65,504)而 FP8 的 E4M3 格式只有 (-448, 448)E5M2 也只有 (-57,344, 57,344)。超出低精度格式上限的数值会被直接截断clip引入显著误差。有效位被浪费真实权重通常集中在小范围例如 -1 到 1直接映射会让 FP8 的大量 bit 处于闲置状态量化分辨率白白损失。因此需要引入一个缩放因子scale把原始数值映射到量化 dtype 的完整动态范围内。最常用也最简单的做法是按张量绝对最大值per-tensor absmax缩放absmax max(abs(tensor)) scale amax / max_dynamic_range_low_precision # 量化Quantization tensor_q (tensor / scale).to(low_precision_dtype) # 反量化De-Quantization tensor_dq tensor_q.to(fp16) * scale tensor_dq ~ tensor由于反量化时还需要 scale 这个附加信息才能解释量化后的数值文档中把这些类型统称为派生数据类型derived datatypes——量化值本身 必要的解释参数二者共同构成一个完整的量化张量表示。源码佐证comfy/quant_ops.py中_TensorCoreFP8LayoutBase.quantize()的recalculate分支正是该 absmax 公式的实现——scale torch.amax(tensor.abs()).to(dtypetorch.float32) / torch.finfo(cls.FP8_DTYPE).max并对 FP32/BF16 之外的低精度输入做了防 scale 过小的 clampcomfy/quant_ops.py。二、Comfy 中的量化架构QuantizedTensor 与两级注册表在 ComfyUI 中量化不是简单的 dtype 替换而是一整套运行时分发机制。文档给出的整体架构如下QuantizedTensor (torch.Tensor subclass) ↓ __torch_dispatch__ Two-Level Registry (generic layout handlers) ↓ MixedPrecisionOps Metadata Detection2.1 表示层QuantizedTensor 与 Layout为了表示派生数据类型ComfyUI 使用一个torch.Tensor的子类QuantizedTensor来承载量化数据。在 comfy/quant_ops.py 中QuantizedTensor与QuantizedLayout等基础类由comfy_kitchen库提供并重新导出若comfy_kitchen不可用会以空类降级并记录日志FP8/FP4 支持随之不可用。一个Layout类定义了某种具体量化格式的完整行为必需参数如 scale、block_size、orig_dtype 等Quantize 方法普通浮点张量 → 量化表示De-Quantize 方法量化表示 → 原始精度张量自定义 Layout 的骨架如下摘自文档与comfy/quant_ops.py中的_TensorCoreFP8LayoutBase结构一致from comfy.quant_ops import QuantizedLayout class MyLayout(QuantizedLayout): classmethod def quantize(cls, tensor, **kwargs): # Convert to quantized format qdata ... params {scale: ..., orig_dtype: tensor.dtype} return qdata, params staticmethod def dequantize(qdata, scale, orig_dtype, **kwargs): return qdata.to(orig_dtype) * scale仓库中已内置的具体 Layout 包括comfy/quant_ops.pyLayout 类存储 dtype说明TensorCoreFP8E4M3Layoutfloat8_e4m3fn默认 FP8向后兼容别名TensorCoreFP8LayoutTensorCoreFP8E5M2Layoutfloat8_e5m2FP8 E5M2 变体TensorCoreMXFP8Layoutfloat8_e4m3fn 块缩放MXFP8要求 2D 张量按 32 的倍数 padTensorCoreNVFP4Layoutuint8NVFP4要求 2D 张量按 16 的倍数 padgroup_size16TensorWiseINT8Layoutint8张量级 INT8TensorCoreConvRotW4A4Layoutint8W4A4 卷积旋转布局AsymW4A8Int8Layoutint8W4A8 非对称 INT82.2 两级注册表通用操作 布局专属 fast-path用QuantizedTensor执行算子时需要两套注册表来决定这个操作怎么跑通用注册表generic registry处理所有量化格式共有的操作例如.to()、.clone()、.reshape()等张量基础设施操作。布局专属注册表layout-specific registry允许为特定 Layout 注册针对性的 fast-path典型例子是nn.Linearfrom comfy.quant_ops import register_layout_op register_layout_op(torch.ops.aten.linear.default, MyLayout) def my_linear(func, args, kwargs): # Extract tensors, call optimized kernel ...当torch.nn.functional.linear()收到QuantizedTensor参数时__torch_dispatch__会自动把该算子路由到已注册的实现对于任何未注册的操作QuantizedTensor会回退到先dequantize再走高精度实现——这保证了量化系统与既有算子生态的兼容性。说明当前仓库的comfy/quant_ops.py通过register_layout_class(...)将上述 Layout 全部注册进comfy_kitchen的名称空间如TensorCoreFP8Layout、TensorCoreNVFP4Layout、AsymW4A8Int8Layout等并在导入comfy_kitchen时按设备能力禁用不支持的加速后端CUDA 版本低于 cu130 会被禁用并给出升级警告HIP 后端用于 AMDTriton 为默认关闭的可选后端。从源码结构看运行时算子注册发生在comfy_kitchen内部ComfyUI 侧通过register_layout_op/register_layout_class与其对接。三、混合精度MixedPrecisionOps 与 layer_quant_config不是所有层对量化的耐受度都一样。例如最终的投影层final projections往往对精度更敏感而计算密集的 matmul 则非常适合量化。为此ComfyUI 提供MixedPrecisionOps文档标注位于 comfy/ops.py当前源码中类定义在 comfy/ops.py 附近让同一模型内的不同层可以使用不同精度。3.1 触发条件与架构当模型配置model config包含layer_quant_config字典指定哪些层被量化、用什么格式时量化即被激活。其类骨架class MixedPrecisionOps(disable_weight_init): _layer_quant_config {} # Maps layer names to quantization configs _compute_dtype torch.bfloat16 # Default compute / dequantize precision注当前源码中_layer_quant_config已演进为_quant_configclass MixedPrecisionOps(manual_cast): _quant_config quant_config语义一致即层名 → 量化配置的映射comfy/ops.py。3.2 加载机制Linear._load_from_state_dict关键机制在于自定义Linear._load_from_state_dict()当前实现为共享函数_load_quantized_modulecomfy/ops.py在模型加载时逐层检查若层名不在量化配置中以普通张量加载精度为_compute_dtype若层名在量化配置中权重以QuantizedTensor加载并使用指定 Layout如TensorCoreFP8Layout同时加载关联的量化参数weight_scale、input_scale、pre_quant_scale、块大小等。加载流程的实际实现为从 state_dict 弹出weight与各缩放参数读取该层的comfy_quantJSON 配置{format: float8_e4m3fn, ...}依据QUANT_ALGOS[format]查表确定storage_t与comfy_tensor_layout再调用get_layout_class()实例化 Layout若层被标记为full_precision_matrix_mult或格式被当前设备禁用则回退为全精度矩阵乘。3.3 为什么需要它不是所有层都能平等地容忍量化。敏感操作如最终投影可以保持高精度而计算密集的 matmul 可以被量化——这样既获得大部分性能收益又守住生成质量。3.4 系统如何被选中pick_operations在 comfy/ops.py 的pick_operations()中当model_config携带quant_config时量化系统以最高优先级被选中def pick_operations(weight_dtype, compute_dtype, load_deviceNone, disable_fast_fp8False, fp8_optimizationsFalse, model_configNone): if model_config and hasattr(model_config, quant_config) and model_config.quant_config: logging.info(Using mixed precision operations) disabled get_disabled_quant_formats(load_device) return mixed_precision_ops(model_config.quant_config, compute_dtype, disableddisabled) # ... 其后依次尝试 fp8_ops、cublas_ops、disable_weight_init、manual_castget_disabled_quant_formats()comfy/ops.py会按设备能力自动禁用不支持的格式不支持 NVFP4 时禁用nvfp4不支持 MXFP8 时禁用mxfp8不支持 FP8 时禁用float8_e4m3fn/float8_e5m2不支持 INT8 时禁用int8_tensorwise/convrot_w4a4及分组 INT8 格式。四、量化 Checkpoint 格式量化后的 checkpoint 仍然是标准的safetensors 文件包含量化权重张量、关联缩放参数外加一个描述量化方案的_quantization_metadataJSON 条目。与原始 checkpoint 相比量化 checkpoint 具有以下特点层结构与原 checkpoint 一致但权重以量化值存储且存储 dtype 可能不同例如 FP8 权重用uint8容器承载每个量化权重旁会按 recipe 附带若干额外的缩放参数在最终 safetensor 的 metadata 中存放_quantization_metadata描述哪些层被量化、使用了什么 Layout。4.1 缩放参数Scaling Parameters详解文档定义了 4 种缩放参数用于覆盖近期大多数量化 recipeweight_scale权重的量化缩放因子weight_scale_2双重缩放double scaling场景下的全局缩放因子pre_quant_scale用于平滑smoothing显著权重salient weights的缩放因子input_scale激活值activations的量化缩放因子。以 FP8 E4M3 为例的参数布局FormatStorage dtypeweight_scaleweight_scale_2pre_quant_scaleinput_scalefloat8_e4m3fnfloat32float32 (scalar)--float32 (scalar)4.2 QUANT_ALGOS格式的权威定义表文档指出格式定义见comfy/quant_ops.py的QUANT_ALGOS。核对源码comfy/quant_ops.py该表实际上定义了比文档表格更完整的信息QUANT_ALGOS { float8_e4m3fn: { storage_t: torch.float8_e4m3fn, parameters: {weight_scale, input_scale}, comfy_tensor_layout: TensorCoreFP8E4M3Layout, }, float8_e5m2: { storage_t: torch.float8_e5m2, parameters: {weight_scale, input_scale}, comfy_tensor_layout: TensorCoreFP8E5M2Layout, }, nvfp4: { storage_t: torch.uint8, parameters: {weight_scale, weight_scale_2, input_scale, pre_quant_scale}, comfy_tensor_layout: TensorCoreNVFP4Layout, group_size: 16, }, mxfp8: { # 仅当 comfy_kitchen 支持时注册 storage_t: torch.float8_e4m3fn, parameters: {weight_scale, input_scale}, comfy_tensor_layout: TensorCoreMXFP8Layout, group_size: 32, }, int8_tensorwise: { storage_t: torch.int8, parameters: {weight_scale}, comfy_tensor_layout: TensorWiseINT8Layout, quantize_input: False, }, convrot_w4a4: { storage_t: torch.int8, parameters: {weight_scale}, comfy_tensor_layout: TensorCoreConvRotW4A4Layout, quantize_input: False, }, asym_w4a8_int8: { storage_t: torch.int8, parameters: {weight_scale}, comfy_tensor_layout: AsymW4A8Int8Layout, quantize_input: False, }, w6a8_int8: { # 6-bit 均匀码权重为 int8 [N, 3K/4]无码本 storage_t: torch.int8, parameters: {weight_scale}, comfy_tensor_layout: AsymW4A8Int8Layout, quantize_input: False, }, }每个条目都定义了storage_t磁盘/内存存储 dtype、parameters随权重保存的缩放参数集合需与 checkpoint 中实际保存的参数一一对应、comfy_tensor_layout映射到 2.1 节中的 Layout 类名、以及可选的group_sizeNVFP416、MXFP832与quantize_input是否量化输入激活默认 True。nvfp4是当前唯一用到全部 4 种缩放参数的格式。4.3 量化元数据Quantization Metadata与 checkpoint 一同存储的元数据包含format_version标准版本的字符串标识layers层名 → 量化格式的字典格式字符串对应QUANT_ALGOS中的定义。文档给出的完整示例{ _quantization_metadata: { format_version: 1.0, layers: { model.layers.0.mlp.up_proj: {format: float8_e4m3fn}, model.layers.0.mlp.down_proj: {format: float8_e4m3fn}, model.layers.1.mlp.up_proj: {format: float8_e4m3fn} } } }源码佐证加载时 comfy/utils.py 的convert_old_quants()会读取 safetensors metadata 中的_quantization_metadata旧式scaled_fp8权重也会被自动转换为新格式然后为每个被量化层注入{layer}.comfy_quant键值为 UTF-8 JSON 的 uint8 张量detect_layer_quantization()comfy/utils.py则在 state_dict 中扫描.comfy_quant后缀来判定量化模型打印 Found quantization metadata version 1 并返回{mixed_ops: True}。MixedPrecisionOps.Linear._load_from_state_dict正是读取这个comfy_quant配置来决定该层是否走量化路径。五、创建量化 Checkpoint要生成兼容的量化 checkpoint可以使用任何量化工具只要输出符合上文描述的 checkpoint 格式、且使用的 Layout 定义在QUANT_ALGOS中。5.1 Diffusion Attention 偏好comfy_attention.config扩散模型的 attention 模块可以携带module path.comfy_attention.config条目其值为包含 UTF-8 JSON 的 uint8 张量{attention: comfy_kitchen_int8}将配置放在执行 attention 的模块上例如 Qwen Image 2.1 的transformer_blocks.0.attn或 MiniMax H3 的blocks.0.attn。行为约束依据 comfy/ldm/modules/attention.py 的ComfyAttention实现目前仅支持comfy_kitchen_int8无效目标或其他方法名在加载时被忽略并给出 warning回落到常规 attention 选择Kitchen INT8 支持会在每个偏好加载时按主设备检查comfy_kitchen.int8_attention_is_available(model_management.get_torch_device())设备不支持则保持常规 attention显式的 attention override用户强制指定仍然优先级最高ComfyAttention子模块通过常规的 state-dict 保存/加载机制维护自己的元数据_save_to_state_dict会把config以 UTF-8 JSON 的 uint8 张量写回该偏好不会启用权重量化文本编码器text encoder和 VAE 加载器不应用这些偏好。5.2 权重量化Weight Quantization权重量化很直接——用前文介绍的 absmax 方法直接从权重张量计算缩放因子每个层的权重独立量化与对应的weight_scale参数一起存储。5.3 激活量化的校准Calibration / PTQ激活量化例如 FP8 Tensor Core 运算所需的input_scale无法仅从静态权重推导——因为激活值取决于实际输入。因此采用训练后量化PTQ, Post-Training Quantization收集统计量在 N 个代表性样本上执行推理追踪激活记录每个量化层输入的绝对最大值amax计算缩放由收集到的统计量推导input_scale存入 checkpoint将input_scale参数与权重一同保存。校准数据集应当代表你的目标用例。对于扩散模型通常意味着覆盖多样的提示词prompts与生成参数组合。实战提示加载含input_scale的量化模型时MixedPrecisionOps.Linear.forward()会把input_scale搬到输入所在设备并在量化输入前用其对激活做缩放comfy/ops.py。若某层设置了pre_quant_scale如 ModelOpt AWQ 风格的 smoothing前向会先对输入做input * pre_quant_scale再进入量化路径这与 4.1 节中pre_quant_scale的平滑显著权重语义完全对应。六、运行时行为与兼容性要点6.1 设备能力自动降级量化 checkpoint 并非在任何硬件上都能跑满血。pick_operations()与get_disabled_quant_formats()会在加载时按设备能力做自动降级不支持 NVFP4 的设备 →nvfp4格式回退为全精度矩阵乘_full_precision_mm True不支持 FP8 的设备 →float8_e4m3fn/float8_e5m2被禁用不支持 INT8 的设备 →int8_tensorwise/convrot_w4a4/分组 INT8 被禁用。对于 ZLUDA 驱动的 AMD GPU 场景comfy/quant_ops.py在导入时会根据 CUDA 版本与平台禁用不支持的comfy_kitchen后端CUDA 需 cu130HIP 后端在支持的 AMD 设备上自动注册并取得分发优先级加载器日志会打印 Found comfy_kitchen backend ... 与 Native ops / emulated ops 列表方便排查当前硬件实际启用了哪些格式。6.2 旧格式自动迁移老式scaled_fp8checkpoint键名为scaled_fp8 每层.scale_weight/.scale_input在加载时会被convert_old_quants()自动转换为新格式scale_weight→weight_scalescale_input→input_scale值为 1.0 的输入缩放会被跳过以省空间并生成对应的layers元数据comfy/utils.py。因此旧量化模型在现行 ComfyUI 版本中仍可直接加载。6.3 已注册的格式清单速查当前仓库可通过QUANT_ALGOS直接查询支持的全部格式名称float8_e4m3fn、float8_e5m2、nvfp4、mxfp8条件注册、int8_tensorwise、convrot_w4a4、asym_w4a8_int8、w6a8_int8。自定义 Layout 只要通过register_layout_class注册进该体系并确保 checkpoint 元数据中格式名与参数集对齐即可被加载器识别。七、总结与实践建议原理层面量化的核心是数值映射 缩放因子派生数据类型由量化值与解释参数共同构成两级注册表保证了通用操作与布局专属 fast-path 的共存未注册操作自动回退反量化执行。架构层面QuantizedTensor承载数据Layout定义格式行为MixedPrecisionOps通过layer_quant_config即当前源码中的_quant_config实现逐层精度决策pick_operations()在检测到量化配置时以最高优先级启用整套机制。格式层面量化 checkpoint 标准 safetensors 量化权重 缩放参数weight_scale/weight_scale_2/pre_quant_scale/input_scale_quantization_metadata元数据权威格式定义见QUANT_ALGOS。制作层面权重量化直接计算 absmax scale 即可激活量化必须走 PTQ 校准收集amax统计量attention 偏好通过module.comfy_attention.config声明comfy_kitchen_int8但不会启用权重量化。如需深入实现细节可继续阅读仓库中的 comfy/quant_ops.pyLayout 与QUANT_ALGOS、comfy/ops.pyMixedPrecisionOps、_load_quantized_module、pick_operations、get_disabled_quant_formats、comfy/utils.pyconvert_old_quants、detect_layer_quantization以及 comfy/ldm/modules/attention.pyComfyAttention与comfy_kitchen_int8偏好加载。赞分享人工智能大模型媒体生成计算机视觉后端【免费下载链接】ComfyUI-ZludaThe most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface. Now ZLUDA enhanced for better AMD GPU performance.项目地址https://gitcode.com/gh_mirrors/co/ComfyUI-Zluda点击查看免费下载相关推荐ComfyUI 量化完全指南从量化原理到 FP8/INT8 量化检查点制作与加载ComfyUI 量化完全指南从量化原理到 FP8/INT8 量化检查点制作与加载 本篇技术指南以仓库 QUANTIZATION.md https://link人工智能大模型媒体生成本地部署ComfyUI模型管理实战Checkpoint、LoRA、VAE完整指南ComfyUI模型管理实战Checkpoint、LoRA、VAE完整指南 在使用ComfyUI进行AI图像生成时模型管理是提升创作效率和质量的关键环节。本文人工智能大模型媒体生成本地部署Model-Optimizer PTQ 量化交付实战从 Recipe 到经过校验的 Quantized CheckpointModel Optimizer PTQ 量化交付实战从 Recipe 到经过校验的 Quantized Checkpoint 本篇技术指南以 Model Op人工智能大模型模型优化模型量化模型压缩上一篇Alert Analyzer下一篇Carbon 语言分号提案解析语句必须以分号或右花括号终结创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表