Optimum 文档

Ryzen AI 量化

您正在查看 main 版本,需要从源代码安装. 如果您想使用常规的 pip 安装,请查看最新的稳定版本 (v1.23.1).
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 上部署的模型。

可以使用 RyzenAIOnnxQuantizerfrom_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 上更新