Quark 是一个全面的跨平台工具包,旨在简化和增强深度学习模型的量化。 Quark 支持 PyTorch 和 ONNX 模型,使开发人员能够优化其模型,以便在各种硬件后端上部署,在不影响准确性的情况下实现显著的性能提升。
Quark for PyTorch: 灵活高效的 PyTorch 模型量化
Quark for PyTorch 为开发人员提供了一个灵活、高效、易用的工具包,用于量化 PyTorch 的深度学习模型。 当前的量化方法基于 PyTorch 的就地算子替换。 具体而言,该工具提供了以下主要功能和经过验证的模型:
主要功能
- 全面的量化支持:
- 急切模式训练后量化 (PTQ): 量化预训练模型,无需重新训练数据。
- FX 图形模式 PTQ 和量化感知训练 (QAT): 在训练过程中优化模型,从而在量化硬件上获得更高的准确性。
- 优化的 QAT 方法: 支持深度神经网络精确高效定点推理的训练量化阈值(TQT)、学习步长量化(LSQ),以获得更好的 QAT 效果。
- 灵活的量化策略: 可选择对称/非对称、仅加权/静态/动态量化,以及各种量化级别(每个张量/通道),以微调性能和精度权衡。
- 广泛的数据类型支持 使用多种数据类型量化模型,包括 float16、bfloat16、int4、uint4、int8、fp8(e4m3fn 和 e5m2)、具有多级缩放功能的共享微指数(MX6、MX9`),以及具有 int8、fp8_e4m3fn、fp8_e5m2、fp4、fp6_e3m2 和 fp6_e2m3 元素的微缩放 (MX) 数据类型。
- 可配置的校准方法: 使用 MinMax、Percentile 和 MSE 校准方法优化量化精度。
- 高级功能:
- 大型语言模型优化: 通过 kv 缓存量化,为量化大型语言模型提供专门支持。
- 尖端算法: 利用最先进的算法,如 SmoothQuant、AWQ 和 GPTQ,在 GPU 上实现 uint4 量化,为要求苛刻的任务提供最佳性能。
- 无缝集成和部署:
- 导出为多种格式: 将量化模型导出为 ONNX、JSON-safetensors 和 GGUF 格式,以便在各种平台上部署。
- APL 集成: 与 AMD Pytorch-light (APL) 无缝集成,优化 AMD 硬件性能,提供 INT-K、BFP16 和 BRECQ 支持。
- Brevitas 整合实验: 探索与 Brevitas 的无缝集成,以量化 Stable Diffusion 和 ImageNet 分类模型。
- 包含示例: 从 LLM 模型、SDXL 模型(Eager 模式)和 CNN 模型(FX Graph 模式)的实用示例中获益,加速您的量化之旅。
- 跨平台支持: 在 Linux(CPU 和 GPU)和 Windows(CPU 模式)操作系统上进行开发和部署。
Quark for ONNX:ONNX 模型的简化量化
Quark for ONNX 利用 ONNX Runtime Quantization 工具的强大功能,为量化 ONNX 模型提供了强大而灵活的解决方案。
主要功能
- 全面量化支持
- 训练后量化 (PTQ): 量化预训练模型,无需重新训练数据。
- 灵活的量化策略: 可选择对称/非对称、仅加权/静态/动态量化,以及各种量化级别(每个张量/通道),以微调性能和精度权衡。
- 广泛的数据类型支持 使用多种数据类型量化模型,包括 uint32、int32、float16、bfloat16、int16、uint16、int8、uint8 和 bfp。
- 可配置的校准方法: 使用 MinMax、Entropy、Percentile、NonOverflow 和 MinMSE 校准方法优化量化精度。
- 高级功能:
- 多种部署目标: 针对各种硬件平台,包括 NPU_CNN、NPU_Transformer 和 CPU。
- 尖端算法: 利用最先进的算法,如 SmoothQuant、CLE、BiasCorrection、AdaQuant 和 AdaRound,为要求苛刻的任务实现最佳性能。
- 灵活的缩放类型: 支持使用浮点缩放、int16 缩放和 2 次幂缩放选项进行量化。
- 自动混合精度: 通过自动混合精度,实现精度和性能之间的最佳平衡。
有关夸克特性和功能的更多详细信息,请参阅 📖Documentation 和 💡Examples 页面。
PyTorch Quark 入门
如果用户想使用 int8 数据类型对 opt-125m 模型进行只对称张量权重量化,可以编写如下所示的 Python 脚本。 每个步骤的详细说明将在《用户指南》的其他章节中提供。
# 1. Set model
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
model.eval()
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m")
# 2. Set quantization configuration
from quark.torch.quantization.config.type import Dtype, ScaleType, RoundType, QSchemeType
from quark.torch.quantization.config.config import Config, QuantizationSpec, QuantizationConfig
from quark.torch.quantization.observer.observer import PerTensorMinMaxObserver
DEFAULT_INT8_PER_TENSOR_SYM_SPEC = QuantizationSpec(dtype=Dtype.int8,
qscheme=QSchemeType.per_tensor,
observer_cls=PerTensorMinMaxObserver,
symmetric=True,
scale_type=ScaleType.float,
round_method=RoundType.half_even,
is_dynamic=False)
DEFAULT_W_INT8_PER_TENSOR_CONFIG = QuantizationConfig(weight=DEFAULT_INT8_PER_TENSOR_SYM_SPEC)
quant_config = Config(global_quant_config=DEFAULT_W_INT8_PER_TENSOR_CONFIG)
# 3. Define calibration dataloader (still need this step for weight only and dynamic quantization)
from torch.utils.data import DataLoader
text = "Hello, how are you?"
tokenized_outputs = tokenizer(text, return_tensors="pt")
calib_dataloader = DataLoader(tokenized_outputs['input_ids'])
# 4. In-place replacement with quantized modules in model
from quark.torch import ModelQuantizer
quantizer = ModelQuantizer(quant_config)
quant_model = quantizer.quantize_model(model, calib_dataloader)
# # 5. (Optional) Export onnx
# # If user want to export the quantized model, please freeze the quantized model first
# freezed_quantized_model = quantizer.freeze(quant_model)
# from quark.torch import ModelExporter
# # Get dummy input
# for data in calib_dataloader:
# input_args = data
# break
# quant_model = quant_model.to('cuda')
# input_args = input_args.to('cuda')
# exporter = ModelExporter('export_path')
# exporter.export_onnx_model(quant_model, input_args)
Huggingface
感谢大家花时间阅读我的文章,你们的支持是我不断前进的动力。期望未来能为大家带来更多有价值的内容,请多多关注我的动态!