Optimum 文档

Ryzen AI 的量化

您正在查看 main 版本,该版本需要从源代码安装. 如果您想要常规 pip 安装,请查看最新的稳定版本 (v1.24.0)。
Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Ryzen AI 的量化

Ryzen AI IPU 的最佳性能是通过使用 量化模型实现的。 有两种不同的方法可以为 Ryzen AI IPU 量化模型

  • 通过 Vitis AI Quantizer,在 Optimum 的 RyzenAIOnnxQuantizer 中使用,它专为 ONNX 模型量化而设计。 目前支持使用动态和静态量化方法量化 timm 模型。
  • 通过 Brevitas 库,在 Optimum 的 BrevitasQuantizer 中使用。 Brevitas 允许直接量化 PyTorch 模型,可以选择将其导出到 ONNX。 建议使用此方法量化其他模型。

使用 RyzenAIOnnxQuantizer 进行量化

🤗 Optimum AMD 提供了一个 Ryzen AI 量化器,使您可以使用 AMD Vitis AI Quantizer 对 Hugging Face Hub 上托管的许多模型应用量化。

RyzenAI 量化器在以 ONNX 格式保存的预训练模型上提供易于使用的训练后量化 (PTQ) 流程。 它生成一个量化的 ONNX 模型,可以随时部署到 Ryzen AI 上。

量化器支持各种配置和功能,以量化目标部署在 IPU_CNN、IPU_Transformer 和 CPU 上的模型。

可以使用 from_pretrained 方法初始化 RyzenAIOnnxQuantizer,可以从本地模型文件夹或 Hugging Face Hub 上托管的模型初始化

>>> from optimum.amd.ryzenai import RyzenAIOnnxQuantizer

>>> quantizer = RyzenAIOnnxQuantizer.from_pretrained("path/to/model")

下面您将找到一个关于如何从 Timm 库量化 VGG 模型的简单端到端示例。

  • 首先,使用 Optimum Exporters 将 VGG 模型导出到 ONNX。 确保为推理指定静态形状。
  • 创建一个预处理函数来处理特定的图像格式转换,并应用必要的转换来准备模型的输入。
  • 初始化 RyzenAI 量化器 (RyzenAIOnnxQuantizer) 并使用 AutoQuantizationConfig 配置量化设置。 使用 ipu_cnn_config 加载建议用于部署在 IPU 上的 CNN 模型的量化配置。
  • 使用量化器的 get_calibration_dataset 方法获取校准数据集。 此数据集对于在量化过程中计算量化参数至关重要。
  • 使用指定的量化配置和校准数据运行量化器。 在此过程中计算的量化参数将作为常量嵌入到量化模型中。
  • 生成的量化模型保存在指定的量化目录中。
>>> from functools import partial
>>> import timm

>>> from optimum.amd.ryzenai import AutoQuantizationConfig, RyzenAIOnnxQuantizer
>>> from optimum.exporters.onnx import main_export
>>> from transformers import PretrainedConfig

>>> # Define paths for exporting ONNX model and saving quantized model
>>> export_dir = "/path/to/vgg_onnx"
>>> quantization_dir = "/path/to/vgg_onnx_quantized"

>>> # Specify the model ID from Timm
>>> model_id = "timm/vgg11.tv_in1k"

>>> # Step 1: Export the model to ONNX format using Optimum Exporters
>>> main_export(
...     model_name_or_path=model_id,
...     output=export_dir,
...     task="image-classification",
...     opset=13,
...     batch_size=1,
...     no_dynamic_axes=True,
... )

>>> # Step 2: Preprocess configuration and data transformations
>>> config = PretrainedConfig.from_pretrained(export_dir)
>>> data_config = timm.data.resolve_data_config(pretrained_cfg=config.pretrained_cfg)
>>> transforms = timm.data.create_transform(**data_config, is_training=False)

>>> def preprocess_fn(ex, transforms):
...     image = ex["image"]
...     if image.mode == "L":
...       # Convert greyscale to RGB if needed
...       print("WARNING: converting greyscale to RGB")
...       image = image.convert("RGB")
...     pixel_values = transforms(image)
...     return {"pixel_values": pixel_values}

>>> # Step 3: Initialize the RyzenAIOnnxQuantizer with the exported model
>>> quantizer = RyzenAIOnnxQuantizer.from_pretrained(export_dir)

>>> # Step 4: Load recommended quantization config for model
>>> quantization_config = AutoQuantizationConfig.ipu_cnn_config()

>>> # Step 5: Obtain a calibration dataset for computing quantization parameters
>>> train_calibration_dataset = quantizer.get_calibration_dataset(
...     "imagenet-1k",
...     preprocess_function=partial(preprocess_fn, transforms=transforms),
...     num_samples=100,
...     dataset_split="train",
...     preprocess_batch=False,
...     streaming=True,
... )

>>> # Step 6: Run the quantizer with the specified configuration and calibration data
>>> quantizer.quantize(
...     quantization_config=quantization_config,
...     dataset=train_calibration_dataset,
...     save_dir=quantization_dir
... )

使用 BrevitasQuantizer 进行量化

即将推出。

< > 在 GitHub 上更新