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