Llama 3 CPU推理优化指南

备受期待的 Meta 第三代 Llama 现已发布,我想确保你知道如何以最佳方式部署这种最先进的 (SoTA) LLM。在本教程中,我们将重点介绍如何执行仅权重量化 (WOQ) 来压缩 8B 参数模型并改善推理延迟,但首先,让我们讨论一下 Meta Llama 3。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、Llama 3

到目前为止,Llama 3 系列包括从 8B 到 70B 参数的模型,未来还会有更多版本。这些模型附带宽松的 Meta Llama 3 许可证,建议你在接受使用它们所需的条款之前先查看一下。这标志着 Llama 模型系列和开源 AI 的一个激动人心的篇章。

1.1 架构

Llama 3 是一个基于仅解码器transformer的自回归 LLM。与 Llama 2 相比,Meta 团队做出了以下显著改进:

  • 采用分组查询注意 (GQA),提高了推理效率。
  • 优化的标记器,词汇量为 128K 个标记,旨在更有效地编码语言。
  • 在 15 万亿个标记数据集上进行训练,这比 Llama 2 的训练数据集大 7 倍,代码量多 4 倍。

下图(图 1)是 print(model) 的结果,其中 model 是 meta-llama/Meta-Llama-3–8B-Instruct。在此图中,我们可以看到该模型包含 32 个由 Llama Attention 自注意力组件组成的 LlamaDecoderLayers。此外,它还有 LlamaMLP、LlamaRMSNorm 和 Linear head。我们希望在 Llama 3 研究论文发布后了解更多信息。

图 1. `print(model)` 的输出展示了 llama-3-8B-instruct 架构中各层的分布

1.2 语言建模性能

该模型在各种行业标准语言建模基准上进行了评估,例如 MMLU、GPQA、HumanEval、GSM-8K、MATH 等。为了本教程的目的,我们将回顾“指令调整模型”的性能(图 2)。这些数字中最引人注目的是,Llama 3 8B 参数模型在报告的基准测试中比 Llama 2 70B 的性能高出 62% 到 143%,同时模型体积小 88%!

图 2. Llama 3 指令模型在 MMLU、GPQA、HumanEval、GSM-8K 和 MATH LLM 基准测试中的性能指标摘要

最新一代 Llama 所包含的语言建模性能提升、许可宽松和架构效率标志着生成式 AI 领域一个激动人心的篇章的开始。让我们来探索如何优化 CPU 上的推理,以实现可扩展、低延迟的 Llama 3 部署。

2、使用 PyTorch 优化 Llama 3 推理

在上一篇文章中,我介绍了模型压缩和整体推理优化在开发基于 LLM 的应用程序中的重要性。在本教程中,我们将重点介绍将仅权重量化 (WOQ) 应用于 meta-llama/Meta-Llama-3–8B-Instruct。WOQ 在性能、延迟和准确性之间实现了平衡,并可选择量化为 int4 或 int8。WOQ 的一个关键组成部分是反量化步骤,它在计算之前将 int4/in8 权重转换回 bf16。

图 3. 仅权重量化的简单说明,橙色表示预量化权重,绿色表示量化权重。请注意,这描述了计算步骤中初始量化为 int4/int8 和反量化为 fp16/bf16

2.1 环境设置

你需要大约 60GB 的 RAM 才能在 Llama-3-8B-Instruct 上执行 WOQ。其中包括约 30GB 用于加载完整模型和约 30GB 用于量化期间的峰值内存。WOQ Llama 3 仅消耗约 10GB 的 RAM,这意味着我们可以通过从内存中释放完整模型来释放约 50GB 的 RAM。

你可以在  Intel® Tiber® 开发人员云免费 JupyterLab* 环境上运行本教程。该环境提供具有 224 个线程和 504 GB 内存的第四代 Intel® Xeon® CPU,足以运行此代码。

如果在自己的 IDE 中运行此程序,你可能需要解决其他依赖项,例如安装 Jupyter 和/或配置 conda/python 环境。在开始之前,请确保你已安装以下依赖项。

intel-extension-for-pytorch==2.2
transformers==4.35.2
torch==2.2.0
huggingface_hub

2.2 访问和配置 Llama 3

你需要一个 Hugging Face* 帐户才能访问 Llama 3 的模型和标记器。

为此,请从设置菜单中选择“访问令牌”(图 4)并创建一个令牌。

图 4. Hugging Face 令牌配置控制台的快照

复制你的访问令牌并将其粘贴到运行以下代码后在 Jupyter 单元内生成的“令牌”字段中。

from huggingface_hub import notebook_login, Repository

# Login to Hugging Face
notebook_login()

请访问 meta-llama/Meta-Llama-3–8B-Instruct,在提供你的信息并提交 Llama 3 访问请求之前,仔细评估条款和许可。接受模型的条款并提供你的信息完全由你自己决定。

2.3 使用 WOQ 量化 Llama-3–8B-Instruct

我们将利用英特尔® PyTorch* 扩展将 WOQ 应用于 Llama 3。此扩展包含针对英特尔硬件的最新 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

Model = 'meta-llama/Meta-Llama-3-8B-Instruct'

model = AutoModelForCausalLM.from_pretrained(Model)
tokenizer = AutoTokenizer.from_pretrained(Model)
  • 量化配方配置

配置 WOQ 量化配方。我们可以将 weight_dtype 变量设置为所需的内存数据类型,分别为 int4 和 in8 选择 torch.quint4x2 或 torch.qint8。此外,我们可以使用 lowp_model 来定义反量化精度。

目前,我们将其保留为 ipex.quantization.WoqLowpMode.None,以保持默认的 bf16 计算精度。

qconfig = ipex.quantization.get_weight_only_quant_qconfig_mapping(
  weight_dtype=torch.quint4x2, # or torch.qint8
  lowp_mode=ipex.quantization.WoqLowpMode.NONE, # or FP16, BF16, INT8
)
checkpoint = None # optionally load int4 or int8 checkpoint

# PART 3: Model optimization and quantization
model_ipex = ipex.llm.optimize(model, quantization_config=qconfig, low_precision_checkpoint=checkpoint)

del model 

我们使用 ipex.llm.optimize() 应用 WOQ,然后使用 del model 从内存中删除完整模型并释放约 30GB 的 RAM。

  • 提示 Llama 3

与 LLama 2 一样,Llama 3 为其指令调整模型提供了预定义的提示模板。使用此模板,开发人员可以定义特定的模型行为指令并提供用户提示和对话历史记录。

system= """\n\n You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. If you don't know the answer to a question, please don't share false information."""
user= "\n\n You are an expert in astronomy. Can you tell me 5 fun facts about the universe?"
model_answer_1 = 'None'

llama_prompt_tempate = f"""
<|begin_of_text|>\n<|start_header_id|>system<|end_header_id|>{system}
<|eot_id|>\n<|start_header_id|>user<|end_header_id|>{user}
<|eot_id|>\n<|start_header_id|>assistant<|end_header_id|>{model_answer_1}<|eot_id|>
"""

inputs = tokenizer(llama_prompt_tempate, return_tensors="pt").input_ids

我们提供所需的字段,然后使用 tokenizer 将整个模板转换为模型的 token。

  • 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,
        eos_token_id=128001,
        max_new_tokens=300,
        repetition_penalty=1.5,
)

运行此代码后,模型将开始生成输出。请记住,这些是未经过滤且不受保护的输出。对于实际用例,你需要进行额外的后处理考虑。

图 5. 在英特尔 Tiber 开发者云的 JupyterLab 环境上运行的 Llama-3–8B-Instruct 在 int4 上使用 WOQ 模式压缩进行流式推理

3、部署注意事项

根据你的推理服务部署策略,需要考虑以下几点:

  • 如果在容器中部署 Llama 3 实例,WOQ 将提供较小的内存占用,并允许你在单个硬件节点上提供模型的多个推理服务。
  • 部署多个推理服务时,你应该优化为每个服务实例保留的线程和内存。留出足够的额外内存(~4 GB)和线程(~4 个线程)来处理后台进程。
  • 考虑保存模型的 WOQ 版本并将其存储在模型注册表中,从而无需在每个实例部署时重新量化模型。

4、结束语

Meta 的 Llama 3 LLM 系列与前几代产品相比有了显著的改进,具有多种配置(更多配置即将推出)。在本教程中,我们探索了使用仅权重量化 (WOQ) 增强 CPU 推理,这是一种减少延迟且对准确性影响最小的技术。

通过将新一代面向性能的 Llama 3 LLM 与 WOQ 等优化技术相结合,开发人员可以为 GenAI 应用程序解锁新的可能性。这种组合简化了硬件要求,以实现集成到新系统和现有系统中的 LLM 的高保真度、低延迟结果。

接下来要尝试的一些令人兴奋的事情是:

  • 尝试量化级别:你应该测试 int4 和 int8 量化,以确定特定应用程序的性能和准确性之间的最佳折衷。
  • 性能监控:在不同的现实场景中持续评估 Llama 3 模型的性能和准确性至关重要,以确保量化保持所需的有效性。
  • 测试更多 Llamas:探索整个 Llama 3 系列并评估 WOQ 和其他 PyTorch 量化配方的影响。

原文链接:Llama 3 CPU推理指南 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/653931.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

七大获取免费https证书的方式

想要实现https访问最简单有效的的方法就是安装SSL证书。只要证书正常安装上以后&#xff0c;浏览器就不会出现网站不安全提示或者访问被拦截的情况。下面我来教大家怎么去获取免费的SSL证书&#xff0c;又如何安装证书实现https访问。 一、选择免费SSL证书提供商 有多家机构提…

失落的方舟台服账号怎么注册 失落的方舟台服注册收不到验证码

《失落的方舟》&#xff08;Lost Ark&#xff09;是由韩国Smilegate公司研发的一款大型多人在线角色扮演游戏&#xff08;MMORPG&#xff09;。该游戏以其精美的画面、丰富的剧情、动作类游戏的战斗手感以及广阔的开放世界而著称&#xff0c;自发布以来便吸引了全球众多游戏玩家…

Hono 框架使用经验谈

Hono&#x1f525;是一个小型、快速并开源的 Serverless Web 框架&#xff0c;用 TypeScript 写就。它适用于任何JavaScript运行时&#xff1a;Cloudflare Workers&#xff0c;Fastly ComputeEdge&#xff0c;Deno&#xff0c;Bun&#xff0c;Vercel&#xff0c;Netlify&#x…

su模型导进3D无法炸开和移动?---模大狮模型网

SketchUp(简称SU)作为一款广受欢迎的3D建模软件&#xff0c;其直观的操作界面和丰富的功能深受用户喜爱。然而&#xff0c;当我们将SU模型导入到其他3D软件(如3ds Max、Maya等)时&#xff0c;有时会遇到模型无法炸开(即分解)和移动的问题。这不仅影响了我们的工作效率&#xff…

开源监控工具monit安装部署

Monit 简介 Monit是一个轻量级(500KB)跨平台的用来监控Unix/linux系统的开源工具。部署简单&#xff0c;并且不依赖任何第三方程序、插件或者库。 Monit可以监控服务器进程、文件、文件系统、网络状态&#xff08;HTTP/SMTP等协议&#xff09;、远程主机、服务器资源变化等等。…

【Python】 如何将列表转换为字符串

基本原理 在Python中&#xff0c;列表&#xff08;list&#xff09;和字符串&#xff08;string&#xff09;是两种不同的数据类型。列表是一个有序的元素集合&#xff0c;可以包含不同类型的元素&#xff0c;而字符串则是一个字符序列。有时&#xff0c;我们可能需要将列表中…

tinyrenderer-渲染器着色

整理了代码&#xff0c;创建了一个相机类&#xff0c;控制镜头 class Camera { public:Camera(Vec3f cameraPos, Vec3f target, Vec3f up):cameraPos_(cameraPos), target_(target), up_(up) {}Matrix getView();Matrix getProjection(); private:Vec3f cameraPos_;Vec3f targ…

2024年区块链,物联网与信息技术国际会议(ICBITIT 2024)

2024年区块链&#xff0c;物联网与信息技术国际会议&#xff08;ICBITIT 2024&#xff09; 2024 International Conference on Blockchain, Internet of Things, and Information Technology 会议简介&#xff1a; 2024年区块链&#xff0c;物联网与信息技术国际会议&#xff…

大数据开发面试题【Kafka篇】

83、介绍下Kafka&#xff0c;Kafka的作用?Kafka的组件?适用场景? kafka是一个高吞吐量、可扩展的分布式消息传递系统&#xff0c;在处理实时流式数据&#xff0c;并能够保证持久性和容错性 可用于数据管道、流分析和数据继承和关键任务应用&#xff08;发布/订阅模式&#…

C语言作为计算机行业的基础之一,是否制约了行业本身的发展?

c不是计算机行业的基础啦&#xff0c;你想&#xff0c;c语言出现时已经有一套成熟的计算机体系&#xff0c;有基于内存地址的寻找指令、数据的工作方式&#xff0c;有汇编语言&#xff0c;那搞出c这种高级语言就很正常啊&#xff01;刚好我有一些资料&#xff0c;是我根据网友给…

C++中的结构体——结构体定义和使用

一、结构体基本概念 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型 二、结构体定义和使用 语法&#xff1a; struct 结构体名 { 结构体成员列表 }&#xff1b; 通过结构体创建变量的方式有三种&#xff1a; 1. struct 结构体名 变量名 2.struct…

智慧农田视频监控技术应用:智能监管引领农业新时代

据新闻报道&#xff0c;5月24日合肥市公安局接到群众报警&#xff0c;反映自己辛苦种植的小麦有几十亩地被人偷偷用收割机盗割。公安机关迅速出警并立案侦查&#xff0c;通过查看监控视频得知&#xff0c;用户所在的公司租用了几千亩土地进行农业种植&#xff0c;因公司与村民之…

C语言 数组——数组的定义和初始化

目录 为什么使用数组(Array)? 一维数组的定义 一维数组的初始化 一维数组元素的访问 一维数组元素的赋值 数组的逻辑存储结构 数组的物理存储结构 二维数组的定义和初始化 为什么使用数组(Array)? 一维数组的定义 一维 数组的定义 int a[10]; 定义一个有 10 个 int 型元素的…

破解微信校验难题,Xinstall助你轻松实现Universal Link功能!

在移动互联网时代&#xff0c;App的推广和运营离不开各种技术手段的支持。其中&#xff0c;Universal Link作为连接App和网页的重要桥梁&#xff0c;被广大开发者所青睐。然而&#xff0c;很多开发者在使用Universal Link时遇到了微信校验不通过的问题&#xff0c;这不仅影响了…

堆排序和Topk问题

堆排序 堆排序即利用堆的思想来进行排序&#xff0c; 总共分为两个步骤&#xff1a; 1. 建堆 升序&#xff1a;建大堆&#xff1b; 降序&#xff1a;建小堆 2 .利用堆删除思想来进行排序 利用堆删除思想来进行排序 建堆和堆删除中都用到了向下调整&#xff0c;因此掌握了…

Go 错误日志处理

是不是所有的 if err ! nil 的地方都应该输出错误日志&#xff1f; 打印过多的错误日志会导致日志文件变得冗长和难以阅读。 其次&#xff0c;重复的错误信息会增加冗余。 此外&#xff0c;每一层都打印错误日志&#xff0c;一旦错误信息设计不当&#xff0c;可能会导致上下…

VCRUNTIME140_1.dll丢失是怎么回事?vcruntime140_1.dll无法继续执行代码的处理方法

VCRUNTIME140_1.dll丢失是怎么回事&#xff1f;问出这样的问题的人&#xff0c;一般是遇到vcruntime140_1.dll无法继续执行代码的问题了&#xff0c;找不到VCRUNTIME140_1.dll文件&#xff0c;那么程序就肯定是启动不了的&#xff0c;程序的启动是需要VCRUNTIME140_1.dll文件的…

全局数据 与 singleton 类的选择

1&#xff0c;singleton 相对于全局数据的优势 使用 Singleton 类相对于全局数据具有以下好处&#xff1a; 1.1. 延迟初始化&#xff1a;Singleton 类可以实现延迟初始化&#xff0c;即在需要时才创建实例&#xff0c;而全局数据在程序启动时就会被初始化。这可以节省资源并提…

设计软件有哪些?建模和造型工具篇(3),渲染100邀请码1a12

这次我们接着介绍建模工具。 1、FloorGenerator FloorGenerator是由CG-Source开发的3ds Max插件&#xff0c;用于快速创建各种类型的地板和瓷砖。该插件提供了丰富的地板样式和布局选项&#xff0c;用户可以根据需要轻松创建木质地板、石板地板、砖瓦地板等不同风格的地面。F…

【常用的队列总结】

文章目录 队列的介绍Queue队列的基本概念与操作队列的基本概念 常见的队列介绍非阻塞队列LinkedList:ArrayDeque:PriorityQueue: 阻塞队列ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue DelayQueueSynchronousQueue 队列的介绍 Queue队列的基本概念与操作 在 …