CPU跑大模型怎么加速?

一、概念

        近几年,大模型的规模越做越大。普通码农没几张显卡几乎都跑不动动辄几百B的模型了。当然,随着SLM进一步发展,移动端、PC端部署SLM变得轻松了起来。即便只有CPU也能带得起3B以内的SLM,只不过推理速度比较感人。因此,我们需要通过一些优化来使得CPU也能高效地运行大型模型推理。这里,我们一起来看看HuggingFace教程给出的推理加速方案。

二、python实现

1、BetterTransformer

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

  • 将多个连续操作组合成一个单一的“内核”,以减少计算步骤的数量
  • 跳过padding tokens的固有稀疏性,以避免使用嵌套张量进行不必要的计算

        BetterTransformer还将所有注意力操作转换为使用更节省内存的缩放点积注意力。但需要注意不是所有模型都支持这个方法,具体可以查看官网链接

from transformers import AutoModelForSequenceClassification
from optimum.bettertransformer import BetterTransformer

model_hf = AutoModelForSequenceClassification.from_pretrained("bert-base-cased")
model = BetterTransformer.transform(model_hf, keep_original_model=True)

2、TorchScript

        TorchScript 是一种中间的PyTorch模型表示形式,可以在性能很重要的生产环境中运行。你可以在PyTorch中训练一个模型,然后将其导出到TorchScript,以使模型摆脱 Python 性能限制。PyTorch 追踪一个模型以返回一个经过即时编译(just-in-time compilation,JIT)优化的ScriptFunction。与默认的eager模式相比,PyTorch 中的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

3、IPEX graph optimization

        英特尔PyTorch扩展(IPEX)在即时编译(JIT)模式下为英特尔CPU提供了进一步的优化,HuggingFace建议将其与TorchScript结合使用以获得更快的性能。IPEX的图优化融合了诸如多头注意力、连接线性、线性加加法、线性加GELU、加法加LayerNorm等操作。

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

4、Optimum

        ONNX Runtime (ORT) 是一种模型加速器,默认情况下在CPU上运行推理。Optimum支持 ONNX运行时,它可以在Transformers中使用,而无需对代码进行太多更改。我们只需要将Transformers的AutoClass替换为等效的ORT模型,并加载ONNX格式的checkpoint。

        例如,如果我们正在对一个问答任务进行推理,只需要加载包含一个model.onnx文件的optimum/roberta-base-squad2模型checkpoint即可:

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)

 

 

### NVIDIA GeForce RTX 2060 运行大型语言模型的性能和可行性 #### 显存容量分析 NVIDIA GeForce RTX 2060 配备了6 GB GDDR6显存。对于现代的大规模预训练语言模型(LLMs),如BERT、GPT系列等,所需的显存量通常较大。例如,加载一个标准大小的BERT模型可能就需要超过10 GB的显存空间[^1]。 #### 显存带宽影响 显存带宽决定了GPU处理器能够多快地从显存中读取数据和向显存中写入数据。显存带宽越高,GPU处理大量数据时的性能通常也越好。RTX 2060拥有较高的显存带宽,但在面对超大规模的数据集或更复杂的神经网络结构时可能会成为瓶颈[^2]。 #### 实际应用测试 为了评估RTX 2060能否有效支持特定类型的LLM工作负载,可以尝试使用Python脚本进行简单的推理任务: ```python import torch from transformers import AutoModelForSequenceClassification, AutoTokenizer device = 'cuda' if torch.cuda.is_available() else 'cpu' model_name = "distilbert-base-uncased-finetuned-sst-2-english" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name).to(device) text = ["This is a test sentence."] inputs = tokenizer(text, return_tensors="pt").to(device) outputs = model(**inputs) print(outputs.logits.softmax(dim=-1)) ``` 这段代码展示了如何利用Hugging Face Transformers库中的DistilBERT模型来进行情感分类的任务。如果设备配置不足,则会出现OOM (Out Of Memory)错误提示。 考虑到未来几年内硬件发展趋势以及当前可用资源,建议考虑升级到具有更大显存的新一代图形卡以获得更好的体验和支持更多样化的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值