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 上部署的模型。
可以使用 RyzenAIOnnxQuantizer 的 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 上更新