Optimum 文件

最佳化

您正在檢視的是需要從原始碼安裝. 如果您希望常規的pip安裝,請檢視最新的穩定版本 (v1.27.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 以程式設計方式最佳化模型

ONNX 模型可以使用 ORTOptimizer 進行最佳化。該類可以透過 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`,
  • 層歸一化融合,使用 `disable_layer_norm_fusion=False`,
  • Attention 融合,使用 `disable_attention_fusion=False`,
  • SkipLayerNormalization 融合,使用 `disable_skip_layer_norm_fusion=False`,
  • Add Bias 和 SkipLayerNormalization 融合,使用 `disable_bias_skip_layer_norm_fusion=False`,
  • Add Bias 和 Gelu / FastGelu 融合,使用 `disable_bias_gelu_fusion=False`,
  • Gelu 近似,使用 `enable_gelu_approximation=True`。

注意力融合專為 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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.