CPU 推理
通过一些优化,可以在 CPU 上高效地运行大型模型推理。这些优化技术之一涉及将 PyTorch 代码编译成中间格式,以用于 C++ 等高性能环境。另一种技术是将多个操作融合到一个内核中,以减少单独运行每个操作的开销。
您将学习如何使用 BetterTransformer 进行更快的推理,以及如何将 PyTorch 代码转换为 TorchScript。如果您使用的是英特尔 CPU,还可以使用来自 Intel Extension for PyTorch 的 图优化 来进一步提高推理速度。最后,学习如何使用 🤗 Optimum 通过 ONNX Runtime 或 OpenVINO(如果您使用的是英特尔 CPU)加速推理。
BetterTransformer
BetterTransformer 通过其快速路径(Transformer 函数的原生 PyTorch 特定实现)执行来加速推理。快速路径执行中的两个优化是
- 融合,它将多个顺序操作组合成单个“内核”以减少计算步骤数量
- 跳过填充标记的固有稀疏性,以避免使用嵌套张量进行不必要的计算
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 上更新