Optimum 文档

优化

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

并获得增强的文档体验

开始使用

优化

🤗 Optimum 提供了一个 optimum.onnxruntime 包,使您可以使用 ONNX Runtime 模型优化工具对 🤗 hub 上托管的许多模型应用图优化。

在 ONNX 导出期间优化模型

ONNX 模型可以在 ONNX 导出期间直接使用 Optimum CLI 进行优化,方法是在 CLI 中传递参数 --optimize {O1,O2,O3,O4},例如

optimum-cli export onnx --model gpt2 --optimize O3 gpt2_onnx/

优化级别为

  • O1:基本通用优化。
  • O2:基本和扩展的通用优化,transformers 相关的融合。
  • O3:与 O2 相同,但带有 GELU 近似。
  • O4:与 O3 相同,但带有混合精度(fp16,仅限 GPU,需要 --device cuda)。

使用 ORTOptimizer 以编程方式优化模型

可以使用 ORTOptimizer 优化 ONNX 模型。该类可以使用 from_pretrained() 方法初始化,该方法支持不同的检查点格式。

  1. 使用已初始化的 ORTModel 类。
>>> from optimum.onnxruntime import ORTOptimizer, ORTModelForSequenceClassification

# Loading ONNX Model from the Hub
>>> model = ORTModelForSequenceClassification.from_pretrained(
...     "optimum/distilbert-base-uncased-finetuned-sst-2-english"
... )

# Create an optimizer from an ORTModelForXXX
>>> optimizer = ORTOptimizer.from_pretrained(model)
  1. 使用目录中的本地 ONNX 模型。
>>> from optimum.onnxruntime import ORTOptimizer

# This assumes a model.onnx exists in path/to/model
>>> optimizer = ORTOptimizer.from_pretrained("path/to/model")

优化配置

OptimizationConfig 类允许指定 ORTOptimizer 应如何执行优化。

在优化配置中,有 4 个可能的优化级别

  • optimization_level=0:禁用所有优化
  • optimization_level=1:启用基本优化,例如常量折叠或冗余节点消除
  • optimization_level=2:启用扩展的图优化,例如节点融合
  • optimization_level=99:启用数据布局优化

选择一个级别会启用该级别的优化以及所有先前级别的优化。更多信息请点击 此处

enable_transformers_specific_optimizations=True 表示除了上面描述的 ONNX Runtime 优化之外,还会执行 transformers 相关的图融合和近似。以下是您可以启用的可能优化列表

  • Gelu 融合,使用 disable_gelu_fusion=False
  • Layer Normalization 融合,使用 disable_layer_norm_fusion=False
  • Attention 融合,使用 disable_attention_fusion=False
  • SkipLayerNormalization 融合,使用 disable_skip_layer_norm_fusion=False
  • 添加 Bias 和 SkipLayerNormalization 融合,使用 disable_bias_skip_layer_norm_fusion=False
  • 添加 Bias 和 Gelu / FastGelu 融合,使用 disable_bias_gelu_fusion=False
  • Gelu 近似,使用 enable_gelu_approximation=True

Attention 融合专为 BERT 类架构(例如 BERT、RoBERTa、VIT 等)的右侧填充和生成模型(GPT 类)的左侧填充而设计。如果您不遵循约定,请设置 use_raw_attention_mask=True 以避免潜在的准确性问题,但会牺牲性能。

虽然 OptimizationConfig 让您可以完全控制如何进行优化,但可能很难知道要启用/禁用什么。相反,您可以使用 AutoOptimizationConfig,它提供了四个常见的优化级别

  • O1:基本通用优化。
  • O2:基本和扩展的通用优化,transformers 相关的融合。
  • O3:与 O2 相同,但带有 GELU 近似。
  • O4:与 O3 相同,但带有混合精度(fp16,仅限 GPU)。

示例:加载 O2 OptimizationConfig

>>> from optimum.onnxruntime import AutoOptimizationConfig
>>> optimization_config = AutoOptimizationConfig.O2()

您还可以指定 O2 配置中未定义的自定义参数,例如

>>> from optimum.onnxruntime import AutoOptimizationConfig
>>> optimization_config = AutoOptimizationConfig.O2(disable_embed_layer_norm_fusion=False)

优化示例

下面您将找到一个关于如何优化 distilbert-base-uncased-finetuned-sst-2-english 的简单端到端示例。

>>> from optimum.onnxruntime import (
...     AutoOptimizationConfig, ORTOptimizer, ORTModelForSequenceClassification
... )

>>> model_id = "distilbert-base-uncased-finetuned-sst-2-english"
>>> save_dir = "distilbert_optimized"

>>> # Load a PyTorch model and export it to the ONNX format
>>> model = ORTModelForSequenceClassification.from_pretrained(model_id, export=True)

>>> # Create the optimizer
>>> optimizer = ORTOptimizer.from_pretrained(model)

>>> # Define the optimization strategy by creating the appropriate configuration
>>> optimization_config = AutoOptimizationConfig.O2()

>>> # Optimize the model
>>> optimizer.optimize(save_dir=save_dir, optimization_config=optimization_config)

下面您将找到一个关于如何优化 Seq2Seq 模型 sshleifer/distilbart-cnn-12-6 的简单端到端示例。

>>> from transformers import AutoTokenizer
>>> from optimum.onnxruntime import  OptimizationConfig, ORTOptimizer, ORTModelForSeq2SeqLM

>>> model_id = "sshleifer/distilbart-cnn-12-6"
>>> save_dir = "distilbart_optimized"

>>> # Load a PyTorch model and export it to the ONNX format
>>> model = ORTModelForSeq2SeqLM.from_pretrained(model_id, export=True)

>>> # Create the optimizer
>>> optimizer = ORTOptimizer.from_pretrained(model)

>>> # Define the optimization strategy by creating the appropriate configuration
>>> optimization_config = OptimizationConfig(
...     optimization_level=2,
...     enable_transformers_specific_optimizations=True,
...     optimize_for_gpu=False,
... )

>>> # Optimize the model
>>> optimizer.optimize(save_dir=save_dir, optimization_config=optimization_config)
>>> tokenizer = AutoTokenizer.from_pretrained(model_id)
>>> optimized_model = ORTModelForSeq2SeqLM.from_pretrained(save_dir)
>>> tokens = tokenizer("This is a sample input", return_tensors="pt")
>>> outputs = optimized_model.generate(**tokens)

使用 Optimum CLI 优化模型

Optimum ONNX Runtime 优化工具可以直接通过 Optimum 命令行界面使用

optimum-cli onnxruntime optimize --help
usage: optimum-cli <command> [<args>] onnxruntime optimize [-h] --onnx_model ONNX_MODEL -o OUTPUT (-O1 | -O2 | -O3 | -O4 | -c CONFIG)

options:
  -h, --help            show this help message and exit
  -O1                   Basic general optimizations (see: https://huggingface.co/docs/optimum/onnxruntime/usage_guides/optimization for more details).
  -O2                   Basic and extended general optimizations, transformers-specific fusions (see: https://huggingface.co/docs/optimum/onnxruntime/usage_guides/optimization for more
                        details).
  -O3                   Same as O2 with Gelu approximation (see: https://huggingface.co/docs/optimum/onnxruntime/usage_guides/optimization for more details).
  -O4                   Same as O3 with mixed precision (see: https://huggingface.co/docs/optimum/onnxruntime/usage_guides/optimization for more details).
  -c CONFIG, --config CONFIG
                        `ORTConfig` file to use to optimize the model.

Required arguments:
  --onnx_model ONNX_MODEL
                        Path to the repository where the ONNX models to optimize are located.
  -o OUTPUT, --output OUTPUT
                        Path to the directory where to store generated ONNX model.

优化 ONNX 模型可以按如下方式完成

 optimum-cli onnxruntime optimize --onnx_model onnx_model_location/ -O1 -o optimized_model/

这将使用基本通用优化来优化 onnx_model_location 中的所有 ONNX 文件。

< > 在 GitHub 上更新