HuggingFace Transformers 模型导出到 ONNX 格式
- 0. 引言
- 1. 使用 Optimum
- 2. 使用 transformers.onnx 导出模型
0. 引言
ONNX 是一种开放格式,用于表示机器学习模型。ONNX 定义了一组通用运算符(机器学习和深度学习模型的构建基块)和通用文件格式,使 AI 开发人员能够将模型与各种框架、工具、运行时和编译器一起使用。了解更多信息
官网地址: https://onnx.ai/
1. 使用 Optimum
在生产环境中部署 Transformers 模型通常需要将模型导出为可在专用运行时和硬件上加载和执行的序列化格式,或者可以从中受益。
Optimum 是 Transformer 的扩展,它允许通过其 exporters 模块将模型从 PyTorch 或 TensorFlow 导出为 ONNX 和 TFLite 等序列化格式。 Optimum还提供了一组性能优化工具,以最高效率在目标硬件上训练和运行模型。
今天尝试使用 Optimum 将 Transformer 模型导出到 ONNX。
ONNX(开放神经网络交换)是一种开放标准,它定义了一组通用运算符和通用文件格式,用于表示各种框架(包括 PyTorch 和 TensorFlow)中的深度学习模型。当模型导出为 ONNX 格式时,这些运算符用于构造计算图(通常称为中间表示),该图表示通过神经网络的数据流。
通过公开具有标准化运算符和数据类型的图形,ONNX 可以轻松地在框架之间切换。例如,可以在 PyTorch 中训练的模型导出为 ONNX 格式,然后导入到 TensorFlow 中(反之亦然)。
导出为 ONNX 格式后,模型可以:
-
通过图形优化和量化等技术针对推理进行了优化。
-
通过 ORTModelForXXX 类与 ONNX 运行时一起运行,这些类遵循与您在 Transformer 中习惯使用的 API 相同的 AutoModel API。
-
使用优化的推理管道运行,该管道与 Transformer 中的 pipeline() 函数具有相同的 API。
Optimum 通过利用配置对象为 ONNX 导出提供支持。这些配置对象是现成的,适用于许多模型架构,并且设计为可以轻松扩展到其他架构。
有两种方法可以将 Transformers 模型导出到 ONNX,这里我们展示这两种方法:
-
通过 CLI 使用 Optimum 导出。
-
使用 Optimum 和 导出 optimum.onnxruntime 。
使用 CLI 将转换器模型导出到 ONNX
若要将 Transformers 模型导出到 ONNX,请先安装一个额外的依赖项:
pip install optimum[exporters]
要查看所有可用的参数,请参阅 Optimum 文档,或在命令行中查看帮助:
optimum-cli export onnx --help
例如, distilbert/distilbert-base-uncased-distilled-squad 要从 Hub 导出模型的检查点,请运行以下命令:
optimum-cli export onnx --model distilbert/distilbert-base-uncased-distilled-squad distilbert_base_uncased_squad_onnx/
您应该会看到指示进度的日志,并显示结果 model.onnx 的保存位置,如下所示:
Validating ONNX model distilbert_base_uncased_squad_onnx/model.onnx...
-[✓] ONNX model o服务器托管网utput names match reference model (start_logits, end_logits)
- Validating ONNX Model output "start_logits":
-[✓] (2, 16) matches (2, 16)
-[✓] all values close (atol: 0.0001)
- Validating ONNX Model output "end_logits":
-[✓] (2, 16) matches (2, 16)
-[✓] all values close (atol: 0.0001)
The ONNX export succeeded and the exported model was saved at: distilbert_base_uncased_squad_onnx
然后,生成 model.onnx 的文件可以在支持 ONNX 标准的众多加速器之一上运行。例如,我们可以使用 ONNX 运行时加载和运行模型,如下所示:
from transformers import AutoTokenizer
from optimum.onnxruntime import ORTModelForQuestionAnswering
tokenizer = AutoTokenizer.from_pretrained("distilbert_base_uncased_squad_onnx")
model = ORTModelForQuestionAnswering.from_pretrained("distilbert_base_uncased_squad_onnx")
inputs = tokenizer("What am I using?", "Using DistilBERT with ONNX Runtime!", return_tensors="pt")
outputs = model(**inputs)
使用 optimum.onnxruntime 将 Transformers 模型导出到 ONNX
作为 CLI 的替代方法,可以按编程方式将 Transformers 模型导出到 ONNX,如下所示:
from optimum.onnxruntime import ORTModelForSequenceClassification
from transformers import AutoTokenizer
model_checkpoint = "distilbert_base_uncased_squad"
save_directory = "onnx/"
# Load a model from transformers and export it to ONNX
ort_model = ORTModelForSequenceClassification.from_pretraine服务器托管网d(model_checkpoint, export=True)
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
# Save the onnx model and tokenizer
ort_model.save_pretrained(save_directory)
tokenizer.save_pretrained(save_directory)
2. 使用 transformers.onnx 导出模型
不尝试了,原因如下。
tranformers.onnx 不再维护,请如上所述导出带有 Optimum 的模型。此部分将在将来的版本中删除。
refer: https://huggingface.co/docs/transformers/serialization#onnx
完结!
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net