Transformers 文档

CPU 推理

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

CPU 推理

通过一些优化,可以在 CPU 上高效地运行大型模型推理。这些优化技术之一涉及将 PyTorch 代码编译成中间格式,以用于 C++ 等高性能环境。另一种技术是将多个操作融合到一个内核中,以减少单独运行每个操作的开销。

您将学习如何使用 BetterTransformer 进行更快的推理,以及如何将 PyTorch 代码转换为 TorchScript。如果您使用的是英特尔 CPU,还可以使用来自 Intel Extension for PyTorch图优化 来进一步提高推理速度。最后,学习如何使用 🤗 Optimum 通过 ONNX Runtime 或 OpenVINO(如果您使用的是英特尔 CPU)加速推理。

BetterTransformer

BetterTransformer 通过其快速路径(Transformer 函数的原生 PyTorch 特定实现)执行来加速推理。快速路径执行中的两个优化是

  1. 融合,它将多个顺序操作组合成单个“内核”以减少计算步骤数量
  2. 跳过填充标记的固有稀疏性,以避免使用嵌套张量进行不必要的计算

BetterTransformer 还将所有注意力操作转换为使用更节省内存的 缩放点积注意力

BetterTransformer 不支持所有模型。查看此 列表 以查看模型是否支持 BetterTransformer。

在开始之前,请确保您已安装 🤗 Optimum 安装

使用 PreTrainedModel.to_bettertransformer() 方法启用 BetterTransformer

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("bigcode/starcoder")
model.to_bettertransformer()

TorchScript

TorchScript 是一种可以在注重性能的生产环境中运行的中间 PyTorch 模型表示。您可以使用 PyTorch 训练模型,然后将其导出到 TorchScript,以使模型摆脱 Python 性能约束。PyTorch 跟踪 模型以返回一个 ScriptFunction,该函数使用即时编译 (JIT) 进行优化。与默认的急切模式相比,PyTorch 中的 JIT 模式通常通过操作融合等优化技术为推理提供更好的性能。

有关 TorchScript 的入门介绍,请参阅 PyTorch TorchScript 简介 教程。

使用 Trainer 类,您可以通过设置 --jit_mode_eval 标志来为 CPU 推理启用 JIT 模式

python run_qa.py \
--model_name_or_path csarron/bert-base-uncased-squad-v1 \
--dataset_name squad \
--do_eval \
--max_seq_length 384 \
--doc_stride 128 \
--output_dir /tmp/ \
--no_cuda \
--jit_mode_eval

对于 PyTorch >= 1.14.0,JIT 模式可以使任何模型受益于预测和评估,因为 jit.trace 中支持字典输入。

对于 PyTorch < 1.14.0,如果模型的前向参数顺序与 jit.trace 中的元组输入顺序匹配,例如问答模型,则 JIT 模式可以使模型受益。如果前向参数顺序与 jit.trace 中的元组输入顺序不匹配,例如文本分类模型,则 jit.trace 将失败,我们在此处使用异常捕获此情况以使其回退。日志用于通知用户。

IPEX 图优化

用于 PyTorch 的 Intel® 扩展 (IPEX) 在 Intel CPU 的 JIT 模式下提供了进一步的优化,我们建议将其与 TorchScript 结合使用以获得更快的性能。IPEX 图优化 融合了多头注意力、连接线性、线性 + 加法、线性 + Gelu、加法 + 层归一化等操作。

要利用这些图优化,请确保您已安装 IPEX 安装

pip install intel_extension_for_pytorch

Trainer 类中设置 --use_ipex--jit_mode_eval 标志以启用具有图优化的 JIT 模式

python run_qa.py \
--model_name_or_path csarron/bert-base-uncased-squad-v1 \
--dataset_name squad \
--do_eval \
--max_seq_length 384 \
--doc_stride 128 \
--output_dir /tmp/ \
--no_cuda \
--use_ipex \
--jit_mode_eval

🤗 Optimum

使用 ONNX Runtime 进行 Optimum 推理 指南中了解有关使用 ORT 和 🤗 Optimum 的更多详细信息。本节仅提供一个简短且简单的示例。

ONNX Runtime (ORT) 是一种模型加速器,默认情况下在 CPU 上运行推理。ORT 受 🤗 Optimum 支持,可以在 🤗 Transformers 中使用,而无需对代码进行太多更改。您只需要将 🤗 Transformers AutoClass 替换为其等效的 ORTModel(用于您正在解决的任务),并在 ONNX 格式中加载检查点。

例如,如果您正在对问答任务运行推理,请加载 optimum/roberta-base-squad2 检查点,其中包含 model.onnx 文件

from transformers import AutoTokenizer, pipeline
from optimum.onnxruntime import ORTModelForQuestionAnswering

model = ORTModelForQuestionAnswering.from_pretrained("optimum/roberta-base-squad2")
tokenizer = AutoTokenizer.from_pretrained("deepset/roberta-base-squad2")

onnx_qa = pipeline("question-answering", model=model, tokenizer=tokenizer)

question = "What's my name?"
context = "My name is Philipp and I live in Nuremberg."
pred = onnx_qa(question, context)

如果您有英特尔 CPU,请查看 🤗 Optimum Intel,它支持各种压缩技术(量化、剪枝、知识蒸馏)以及将模型转换为 OpenVINO 格式以实现更高性能推理的工具。

< > 在 GitHub 上更新