Transformers 文档

CPU推理

CPU 推理

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

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

BetterTransformer

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

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

BetterTransformer 还将所有注意力操作转换为使用更节省内存的 scaled dot product attention

并非所有模型都支持BetterTransformer。请查看此列表以确认某个模型是否支持BetterTransformer。

在开始之前,请确保你已经安装了🤗 Optimum。

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

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("bigcode/starcoder", torch_dtype="auto")

TorchScript

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

有关TorchScript的温和介绍,请参阅PyTorch TorchScript介绍教程。

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

python examples/pytorch/question-answering/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 图优化

Intel® Extension for PyTorch (IPEX) 为英特尔 CPU 在 JIT 模式下提供了进一步的优化,我们建议将其与 TorchScript 结合使用以获得更快的性能。IPEX 的图优化融合了诸如多头注意力、Concat Linear、Linear + Add、Linear + Gelu、Add + LayerNorm 等操作。

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

pip install intel_extension_for_pytorch

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

python examples/pytorch/question-answering/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中使用ORT的详细信息,请参阅使用ONNX Runtime进行Optimum推理指南。本节仅提供一个简要且简单的示例。

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

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

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格式的工具,以实现更高性能的推理。

< > Update on GitHub