Nightcafe创作 — 图片版权归作者所有
学习如何在CPU上部署Meta Llama 3时降低模型响应时间Meta的第三代Llama系列终于发布了(详情),我想要确保你知道如何最优化地部署这款最先进的(SoTA)大语言模型。在本教程中,我们将专注于进行仅权重量化的(WOQ)以压缩80亿参数模型并提升推理速度,但在开始之前,我们先来聊聊Meta的Llama 3。
羊驼 3到目前为止,Llama 3 家族包括从 8B 到 70B 参数的模型,未来还将不断推出新版本。这些模型包含一个宽松的 Meta Llama 3 许可协议,建议在使用前先审阅许可协议。这标志着 Llama 模型家族和开源 AI 的一个令人兴奋的新篇章。
建筑Llama 3 是一个自回归的大规模语言模型,基于单解码器变压器。与Llama 2相比,Meta团队成员在以下几个方面进行了显著改进:
- 采用了分组查询注意力机制(GQA)以提升推理效率。
- 优化了词元化器,采用了包含128K词汇的词表,旨在更高效地编码语言信息。
- 在一个包含15万亿词元的训练数据集上进行了训练,这个数据集比Llama 2的训练数据集大7倍,包含的代码量则多出4倍。
下面的图(图1)显示了 print(model)
的结果,其中 model
是 meta-llama/Meta-Llama-3–8B-Instruct。从图中我们可以看到,该模型由包含自注意力机制的32个Llama解码层组成。此外,它还包括LlamaMLP、LlamaRMSNorm以及一个Linear头。我们期待在Llama 3的研究论文发布后了解更多。
图1. print(model)
显示了 llama-3–8B-instruct 架构中层的分布情况。
该模型在各种行业标准的语言建模基准上进行了评估,例如MMLU基准、GPQA测试、HumanEval基准、GSM-8K测试、MATH基准等。为了本教程的目的,我们将特别关注“指令微调模型”(图2)的表现。最引人注目的是,Llama 3 8B参数模型在报告的这些基准测试中比Llama 2 70B模型的表现高出62%到143%,而其模型大小却只有Llama 2 70B的12%!
图2. Llama 3指令模型在MMLU、GPQA、HumanEval、GSM-8K和MATH LLM基准测试中的性能指标 — 图片由作者提供,来源: source
更加出色的语言建模能力、更加宽松的许可协议以及这一代Llama所包含的架构效率标志着一个激动人心的新阶段的开始。让我们来看看如何在CPU上优化推理过程,以便实现Llama 3的可扩展和低延迟部署。
使用PyTorch优化Llama 3推断在之前的文章里,我介绍了模型压缩和整体推理的优化在开发基于LLM的应用程序过程中的重要性。在本教程中,我们将重点介绍如何将仅权重的量化(WOQ)应用于meta-llama/Meta-Llama-3–8B-Instruct。WOQ提供了一个在性能、延迟和准确性之间的平衡,可以选择将权重量化为int4或int8。WOQ的关键环节是去量化步骤,它将int4或int8权重转换回bf16进行计算。
图3. 仅对权重进行量化(weight-only quantization)的简单说明,预量化的权重以橙色表示,量化的权重以绿色表示。请注意,这描绘了初始量化为int4/int8,然后去量化为fp16/bf16或bf16以进行计算步骤。 — 图片由作者制作 — (来源)
环境搭建您将需要大约60GB的RAM来运行WOQ于Llama-3-8B-Instruct。这其中包括约30GB用于加载完整模型,以及在量化过程中达到的约30GB峰值内存占用。经过WOQ处理的Llama 3仅会消耗约10GB的RAM,这相当于释放整个模型的内存后,可以节省约50GB的RAM。
您可以在 Intel ® Tiber ® 开发者云 免费的 JupyterLab* 环境中运行这个教程。该环境配备第 4 代 Intel ® Xeon ® CPU,拥有 224 个线程和 504 GB 内存,完全够用运行这段代码。
如果你是在自己的IDE中运行此程序,你可能需要安装Jupyter,以及配置conda或Python环境。在开始之前,请确保安装了必要的依赖。
intel-extension-for-pytorch==2.2 # 英特尔PyTorch扩展
transformers==4.35.2 # 变换器
torch==2.2.0 # PyTorch
huggingface_hub # Hugging Face Hub
访问和设置Llama 3:
您需要一个Hugging Face*账户来使用Llama 3的模型和分词器。
为了做到这一点,在设置菜单中选择“Access Tokens”,然后创建一个令牌。(请参见图4)
图4. Hugging Face token配置界面的截图 — 图片由作者提供
在运行以下代码后,复制你的访问令牌(access token)并粘贴到在你的 Jupyter 单元格内生成的“Token”字段中。
从huggingface_hub导入notebook_login, Repository,
# 登录到Hugging Face账号
notebook_login()
访问 meta-llama/Meta-Llama-3–8B-Instruct 页面,并仔细阅读条款和许可,随后提供您的信息并提交 Llama 3 访问请求。接受模型条款并提供个人信息完全由您自行决定。
Llama 3-8B Instruct 的量化(使用 WOQ 方法)我们将利用Intel® Extension for PyTorch*将WOQ应用于Llama 3。此扩展包含了针对Intel硬件的最新PyTorch优化技术。请按照以下步骤对Llama 3模型进行量化,并执行优化推理:
- Llama 3 模型和分词器: 首先,导入所需的包,并使用
AutoModelForCausalLM.from_pretrained()
和AutoTokenizer.from_pretrained()
方法来加载模型和分词器,加载 llama-3-8b-instruct 特定的权重和分词器设置。
import torch
import intel_extension_for_pytorch as ipex
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
模型 = 'meta-llama/Meta-Llama-3-8B-Instruct'
model = AutoModelForCausalLM.from_pretrained(模型) # 导入预训练模型
tokenizer = AutoTokenizer.from_pretrained(模型) # 导入分词器
2. 量化配方设置: 配置WOQ量化配方。我们可以将weight_dtype
变量设置为所需的内存数据类型,从torch.quint4x2
或torch.qint8
中选择,分别对应4位整数和8位整数。此外,我们还可以使用lowp_model
来定义反量精度。当前,我们将保留为ipex.quantization.WoqLowpMode.None
以维持默认的bf16(半精度浮点数)计算精度。
qconfig = ipex.quantization.get_weight_only_quant_qconfig_mapping(
weight_dtype=torch.quint4x2, # 或 torch.qint8
lowp_mode=ipex.quantization.WoqLowpMode.NONE, # 或 FP16, BF16, INT8
)
checkpoint = None # 可选地加载 int4 或 int8 检查点
# 第三部分:模型优化和量化
model_ipex = ipex.llm.optimize(model, quantization_config=qconfig, low_precision_checkpoint=checkpoint)
del model # 删除原始模型
我们使用 ipex.llm.optimize()
来应用 WOQ,然后使用 del model
删除整个模型,从而释放大约 30GB 内存。
3. 提示Llama 3: Llama 3和Llama 2一样,有一个预定义的特定提示模板,用于其指令优化的模型。使用这个模板,开发人员可以定义具体的模型行为指令,并提供用户提示以及对话历史。
系统= """\n\n 你是乐于助人、尊重他人和诚实的助手。始终尽可能友好地回答问题,同时确保安全无忧。如果你不知道答案,请不要编造信息。"""
user= "\n\n你是一位天文学专家。你能给我讲讲关于宇宙的5个有趣的事实吗?"
model_answer_1 = 'None'
llama_prompt_tempate = f"""
\n系统{系统}
\nuser{user}
\nassistant{model_answer_1}
"""
inputs = tokenizer(llama_prompt_tempate, return_tensors="pt").input_ids
我们填写所需字段,然后利用分词器将整个模板转换成模型可以理解的令牌。
4.Llama 3 推理: 对于文本生成,我们使用 TextStreamer
生成实时生成流,而不是一次性打印整个输出。这为读者提供了一个更自然的文本生成体验。我们将配置好的流处理器传递给 model_ipex.generate()
函数以及其他文本生成参数。
streamer = TextStreamer(tokenizer, skip_prompt=True)
# 启用推理模式,用于推理过程
with torch.inference_mode():
# 生成模型的输出
tokens = model_ipex.generate(
inputs,
streamer=streamer,
pad_token_id=128001, # 填充token的ID
eos_token_id=128001, # 结束token的ID
max_new_tokens=300, # 控制生成的新token数量
repetition_penalty=1.5, # 重复惩罚因子,防止生成内容重复
)
运行这段代码时,模型将开始生成输出。需要注意的是,这些输出未经任何过滤或保护。在实际应用中,您可能还需要进行额外的后期处理。
图5. 在Intel Tiber云的JupyterLab环境中,使用WOQ模式下的压缩以int4运行的Llama-3–8B-Instruct的实时推理——作者的Gif图
就这样搞定啦。仅用不到20行代码,你现在就已经有了一个低延迟、CPU优化的最新SoTA LLM版本。
部署时,需要考虑的因素根据你的推理引擎服务部署策略,你可能需要考虑以下几个方面:
- 如果在容器中部署 Llama 3 的实例,WOQ 将带来更小的内存占用,并允许你在单个硬件节点上提供多个该模型的推理服务。
- 部署多个推理服务时,你应该为每个服务实例优化线程和内存的分配。为处理后台进程,应预留大约 4 GB 的额外内存和大约 4 个线程。
- 考虑将 WOQ 版本的模型保存并存储在模型注册表中,以避免每次部署实例时重新量化模型。
Meta的Llama 3 LLM家族相比之前的版本实现了显著的进步,提供了多种配置选项(更多即将推出)。在这次教程中,我们探讨了如何通过weight-only quantization (WOQ)技术来提升CPU推理性能,这种技术在减少延迟的同时几乎不影响准确性。
通过将新一代高性能的Llama 3 LLM与如WOQ等优化技术相结合,开发人员可以为GenAI应用程序开启新的可能性。这种组合降低了硬件要求,以实现集成到新系统和现有系统中的LLM后获得的高度保真、低延迟结果。
下面有几个好玩的可以试试:
- 量化级别实验: 应该测试int4和int8量化,以找到性能和准确性之间最适合您特定应用的最佳平衡方案。
- 性能监测: 持续评估Llama 3模型在不同实际场景中的性能和准确性至关重要,以确保量化能够保持所需的效力。
- 测试更多Llama: 探索整个Llama 3系列,并评估WOQ及其他PyTorch 量化配方的影响。
感谢您的阅读!不要忘了关注我以获取更多类似的文章,您可以在这里找到我的个人资料我的个人资料。
其他名称和品牌可能归他人所有或为他人商标.
共同学习,写下你的评论
评论加载中...
作者其他优质文章