使用工具包可将大型模型推理性能提升40倍

英特尔® Extension for Transformer是什么?

英特尔® Extension for Transformers[1]是英特尔推出的一个创新工具包,可基于英特尔® 架构平台,尤其是第四代英特尔® 至强® 可扩展处理器(代号Sapphire Rapids[2],SPR)显著加速基于Transformer的大语言模型(Large Language Model,LLM)。其主要特性包括:

通过扩展Hugging Face transformers API[3]和利用英特尔® Neural Compressor[4],为用户提供无缝的模型压缩体验;提供采用低位量化内核(NeurIPS 2023:在CPU上实现高效LLM推理[5])的LLM推理运行时,支持Falcon、LLaMA、MPT、Llama2、 BLOOM、OPT、ChatGLM2、GPT-J-6B、Baichuan-13B-Base、Baichuan2-13B-Base、Qwen-7B、Qwen-14B和Dolly-v2-3B等常见的LLM[6];先进的压缩感知运行时[7](NeurIPS 2022:在CPU上实现快速蒸馏和QuaLA-MiniLM:量化长度自适应MiniLM;NeurIPS 2021:一次剪枝,一劳永逸:对预训练语言模型进行稀疏/剪枝)。

本文将重点介绍其中的LLM推理运行时(简称为“LLM运行时”),以及如何利用基于Transformer的API在英特尔® 至强® 可扩展处理器上实现更高效的LLM推理和如何应对LLM在聊天场景中的应用难题。

LLM运行时(LLM Runtime)

英特尔® Extension for Transformers提供的LLM Runtime[8]是一种轻量级但高效的LLM推理运行时,其灵感源于GGML[9],且与llama.cpp[10]兼容,具有如下特性:

内核已针对英特尔® 至强® CPU内置的多种AI加速技术(如 AMX、VNNI)以及AVX512F和AVX2指令集进行了优化;可提供更多量化选择,例如:不同的粒度(按通道或按组)、不同的组大小(如:32/128);拥有更优的KV缓存访问以及内存分配策略;具备张量并行化功能,可助力在多路系统中进行分布式推理。

LLM Runtime的简化架构图如下:

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

使用工具包可将大型模型推理性能提升40倍

需要进行改写的内容是:△图1.英特尔® Extension for Transformers的LLM Runtime简化架构图

使用基于Transformer的API,在CPU上实现LLM高效推理

只需不到9行代码,即可让您在CPU上实现更出色的LLM推理性能。用户可以轻松地启用与Transformer类似的API来进行量化和推理。只需将 ‘load_in_4bit’设为true,然后从HuggingFace URL或本地路径输入模型即可。下方提供了启用仅限权重的(weight-only)INT4量化的示例代码:

from transformers import AutoTokenizer, TextStreamerfrom intel_extension_for_transformers.transformers import AutoModelForCausalLMmodel_name = "Intel/neural-chat-7b-v3-1” prompt = "Once upon a time, there existed a little girl,"tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)inputs = tokenizer(prompt, return_tensors="pt").input_idsstreamer = TextStreamer(tokenizer)model = AutoModelForCausalLM.from_pretrained(model_name, load_in_4bit=True)outputs = model.generate(inputs, streamer=streamer, max_new_tokens=300)

默认设置为:将权重存储为4位,以8位进行计算。但也支持不同计算数据类型(dtype)和权重数据类型组合,用户可以按需修改设置。下方提供了如何使用这一功能的示例代码:

from transformers import AutoTokenizer, TextStreamerfrom intel_extension_for_transformers.transformers import AutoModelForCausalLM, WeightOnlyQuantConfigmodel_name = "Intel/neural-chat-7b-v3-1” prompt = "Once upon a time, there existed a little girl,"woq_config = WeightOnlyQuantConfig(compute_dtype="int8", weight_dtype="int4")tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)inputs = tokenizer(prompt, return_tensors="pt").input_idsstreamer = TextStreamer(tokenizer)model = AutoModelForCausalLM.from_pretrained(model_name,quantization_cnotallow=woq_config)outputs = model.generate(inputs, streamer=streamer, max_new_tokens=300)

性能测试

经过持续努力,上述优化方案的INT4性能得到了显著提升。本文在搭载英特尔® 至强® 铂金8480+的系统上与llama.cpp进行了性能比较;系统配置详情如下:@3.8GHz,56核/路,启用超线程,启用睿频,总内存 256 GB (16 x 16 GB DDR5 4800 MT/s [4800 MT/s]),BIOS 3A14.TEL2P1,微代码0x2b0001b0,CentOS Stream 8。

推理性能测试结果见下表,其中输入大小为32,输出大小为32,beam为1

使用工具包可将大型模型推理性能提升40倍

△表1.LLM Runtime与llama.cpp推理性能比较(输入大小=32,输出大小=32,beam=1)

输入大小为1024、输出大小为32、beam为1时的推理性能的测试结果,详见下表:

使用工具包可将大型模型推理性能提升40倍

△表2.LLM Runtime与llama.cpp推理性能比较(输入大小=1024,输出大小=32,beam=1)

根据上表2可见:与同样运行在第四代英特尔® 至强® 可扩展处理器上的llama.cpp相比,无论是首个token还是下一个token,LLM Runtime都能显著降低时延,且首个token和下一个token的推理速度分别提升多达 40 倍[a](Baichuan-13B,输入为1024)和2.68倍[b](MPT-7B,输入为1024)。llama.cpp的测试采用的是默认代码库[10]。

而综合表1和表2的测试结果,可得:与同样运行在第四代英特尔® 至强® 可扩展处理器上的llama.cpp相比,LLM Runtime能显著提升诸多常见LLM的整体性能:在输入大小为1024时,实现3.58到21.5倍的提升;在输入大小为32时,实现1.76到3.43倍的提升[c]。

准确性测试

英特尔® Extension for Transformers可利用英特尔® Neural Compressor中的SignRound[11]、RTN和GPTQ[12]等量化方法,并使用lambada_openai、piqa、winogrande和hellaswag数据集验证了 INT4 推理准确性。下表是测试结果平均值与FP32准确性的比较。

使用工具包可将大型模型推理性能提升40倍
△表3.INT4与FP32准确性对比

从上表3可以看出,多个模型基于LLM Runtime进行的INT4推理准确性损失微小,几乎可以忽略不记。我们验证了很多模型,但由于篇幅限制此处仅罗列了部分内容。如您欲了解更多信息或细节,请访问此链接:https://medium.com/@NeuralCompressor/llm-performance-of-intel-extension-for-transformers-f7d061556176。

更先进的功能:满足LLM更多场景应用需求

同时,LLM Runtime[8]还具备双路CPU的张量并行化功能,是较早具备此类功能的产品之一。未来,还会进一步支持双节点。

然而,LLM Runtime的优势不仅在于其更出色的性能和准确性,我们还投入了大量精力来增强其在聊天应用场景中的功能,并解决了LLM在聊天场景中可能遇到的以下应用难题:

可图大模型 可图大模型

可图大模型(Kolors)是快手大模型团队自研打造的文生图AI大模型

可图大模型 32 查看详情 可图大模型 对话不仅关乎LLM推理,对话历史也很有用。输出长度有限:LLM模型预训练主要基于有限的序列长度。因此,当序列长度超出预训练时使用的注意力窗口大小时,其准确性便会降低。效率低下:在解码阶段,基于Transformer的LLM会存储所有先前生成的token的键值状态(KV),从而导致内存使用过度,解码时延增加。

关于第一个问题,LLM Runtime的对话功能通过纳入更多对话历史数据以及生成更多输出加以解决,而llama.cpp目前尚未能很好地应对这一问题。

关于第二和第三个问题,我们将流式LLM(Steaming LLM)集成到英特尔® Extension for Transformers中,从而能显著优化内存使用并降低推理时延。

Streaming LLM

与传统KV缓存算法不同,我们的方法结合了注意力汇聚(Attention Sink)(4个初始token)以提升注意力计算的稳定性,并借助滚动KV缓存保留最新的token,这对语言建模至关重要。该设计具有强大的灵活性,可无缝集成到能够利用旋转位置编码RoPE和相对位置编码ALiBi的自回归语言模型中。

使用工具包可将大型模型推理性能提升40倍

需要重写的内容是:△ 图2. 使用注意力下沉实现高效流式语言模型的Steam LLM的KV缓存(图片来源:[13])

而且,与llama.cpp不同,这个优化方案还新增了“n_keep”和“n_discard”等参数,以增强Streaming LLM策略。用户可以使用“n_keep”参数指定要保留在KV缓存中的token数量,并使用“n_discard”参数确定要在已生成的token中舍弃的数量。为了更好地平衡性能和准确性,系统默认在KV缓存中舍弃最新token数量的一半

同时,为进一步提高性能,我们还将Streaming LLM添加到了MHA融合模式中。如果模型是采用旋转位置编码(RoPE)来实现位置嵌入,那么只需针对现有的K-Cache应用“移位运算(shift operation)”,即可避免对先前生成的、未被舍弃的token进行重复计算。这一方法不仅充分利用了长文本生成时的完整上下文大小,还能在KV缓存上下文完全被填满前不产生额外开销。

“shift operation”依赖于旋转的交换性和关联性,或复数乘法。例如:如果某个token的K-张量初始放置位置为m并且旋转了m×θi for i ∈ [0,d/2),那么当它需要移动到m-1这个位置时,则可以旋转回到(-1)×θi for i ∈ [0,d/2)。这正是每次舍弃n_discard个token的缓存时发生的事情,而此时剩余的每个token都需要“移动”n_discard个位置。下图以“n_keep=4、n_ctx=16、n_discard=1”为例,展示了这一过程。

使用工具包可将大型模型推理性能提升40倍

△图3.Ring-Buffer KV-Cache和Shift-RoPE工作原理

需要注意的是:融合注意力层无需了解上述过程。如果对K-cache和V-cache进行相同的洗牌,注意力层会输出几乎相同的结果(可能存在因浮点误差导致的微小差异)。

您可以使用下面的代码来启动Streaming LLM:

from transformers import AutoTokenizer, TextStreamer from intel_extension_for_transformers.transformers import AutoModelForCausalLM, WeightOnlyQuantConfig model_name = "Intel/neural-chat-7b-v1-1" # Hugging Face model_id or local model woq_config = WeightOnlyQuantConfig(compute_dtype="int8", weight_dtype="int4") prompt = "Once upon a time, a little girl"tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) inputs = tokenizer(prompt, return_tensors="pt").input_ids streamer = TextStreamer(tokenizer)model = AutoModelForCausalLM.from_pretrained(model_name, quantization_cnotallow=woq_config, trust_remote_code=True) # Recommend n_keep=4 to do attention sinks (four initial tokens) and n_discard=-1 to drop half rencetly tokens when meet length threshold outputs = model.generate(inputs, streamer=streamer, max_new_tokens=300, ctx_size=100, n_keep=4, n_discard=-1)

结论与展望

本文基于上述实践经验,提供了一个在英特尔® 至强® 可扩展处理器上实现高效的低位(INT4)LLM推理的解决方案,并且在一系列常见LLM上验证了其通用性以及展现了其相对于其他基于CPU的开源解决方案的性能优势。未来,我们还将进一步提升CPU张量库和跨节点并行性能。

欢迎您试用英特尔® Extension for Transformers[1],并在英特尔® 平台上更高效地运行LLM推理!也欢迎您向代码仓库(repository)提交修改请求 (pull request)、问题或疑问。期待您的反馈!

特别致谢

在此致谢为此篇文章做出贡献的英特尔公司人工智能资深经理张瀚文及工程师许震中、余振滔、刘振卫、丁艺、王哲、刘宇澄。

[a]根据表2 baichuan-13b的首个token测试结果计算而得。
[b]根据表2 mpt-7b的下一个token测试结果计算而得。
[c]当输入大小为1024时,整体性能=首个token性能+1023下一个token性能;当输入大小为32时,整体性能=首个token性能+31下一个token性能。

以上就是使用工具包可将大型模型推理性能提升40倍的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/455020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 01:01:16
下一篇 2025年11月8日 01:06:46

相关推荐

  • 动态生成HTML表格:优化JavaScript数据展示与导出

    本文旨在解决JavaScript中动态生成HTML表格时遇到的代码冗余和样式控制难题。通过引入数据驱动的编程思想,我们将数据与视图逻辑分离,首先将表格内容组织为JavaScript对象数组,然后利用一个通用的函数将这些结构化数据渲染为可读性强、易于维护且支持灵活样式的HTML表格字符串。这种方法不仅…

    2025年12月23日
    000
  • HTML5性能优化怎么实现_HTML5新特性在性能优化方面的应用方法

    HTML5通过语义化标签、Web Storage、Canvas/SVG、Service Worker和原生媒体支持等技术提升性能:1. 语义化标签优化渲染效率;2. Web Storage减少网络请求;3. Canvas/SVG降低资源加载量;4. Service Worker实现离线缓存;5. 原…

    2025年12月23日
    000
  • 利用UTM参数与GTM优化链接点击来源追踪

    本文详细阐述了如何通过UTM参数精准追踪营销链接的点击来源,并深入探讨了Google Tag Manager (GTM) 在此过程中的高级应用。文章首先介绍了UTM参数的构成、生成方法及其在Google Analytics中的自动解析机制,强调其在识别流量来源方面的核心作用。随后,探讨了GTM如何通…

    2025年12月23日
    000
  • 如何用HTML插入标签云组件_HTML CSS3变换与随机颜色生成算法

    使用HTML构建标签结构,CSS3添加旋转与过渡效果,JavaScript生成随机HSL颜色并设置字体大小,实现动态交互的标签云组件。 要在网页中实现一个动态的标签云组件,结合 HTML、CSS3 变换和随机颜色生成算法,可以按照以下步骤操作。这个组件不仅能提升页面视觉效果,还能通过色彩和旋转增加交…

    2025年12月23日
    000
  • 如何在Go Gin应用中集成前端JavaScript模块(如Sentry)

    本文探讨了在Go Gin框架下,通过HTML模板服务前端页面时,如何有效集成JavaScript模块(如Sentry)。针对浏览器不直接支持Node.js模块导入语法的问题,文章详细阐述了利用CDN引入Sentry SDK的解决方案,并提供了具体的代码示例,帮助开发者实现前端错误监控功能,避免了复杂…

    2025年12月23日
    000
  • html官网浏览入口_html网站设计免费平台

    html官网浏览入口在https://www.codepen.io,该平台支持实时预览代码、创建Pen项目、Fork开源示例,可添加外部资源,具备点赞评论收藏等社区互动功能,设有挑战活动与作品集分类,开放API接口,界面简洁适合初学者,在线编写无需配置环境,支持多种预处理器和响应式测试。 html官…

    2025年12月23日
    000
  • 如何通过HTML在线展示数据_HTML在线数据展示实现与可视化方案

    网页展示数据需结合HTML、CSS与JavaScript,首选table展示结构化数据,配合Chart.js等库实现可视化图表,通过fetch加载远程JSON动态渲染内容,并利用响应式设计与交互优化提升用户体验。 在网页中展示数据,核心是将结构化信息清晰、直观地呈现给用户。HTML本身是内容载体,结…

    2025年12月23日
    000
  • html在线几何图形绘制 html在线SVG应用实战教程

    使用HTML与SVG结合可高效绘制几何图形。SVG基于XML,支持圆形、矩形、多边形、路径等,在任意分辨率下清晰。1. 基础元素包括rect、circle、ellipse、line、polygon、polyline和path。2. 实战示例:用polygon绘制三角形,path绘制五角星和弧线仪表盘…

    2025年12月23日
    000
  • 单页应用(SPA)中特定分类数据的API直链访问与性能考量

    针对单页应用(SPA),本文探讨了如何通过URL直接访问特定分类数据,而非依赖客户端UI交互。文章揭示了SPA在初始加载时已获取所有数据,因此客户端分类选择对数据加载量无影响。核心策略是绕过前端界面,直接调用后端API获取所需数据,从而实现高效且精准的数据访问,并提供了具体API示例。 理解单页应用…

    2025年12月23日
    100
  • jQuery循环中动态表格数据访问与比较教程

    本文详细介绍了在jQuery循环中处理动态生成表格数据时常见的挑战与解决方案。我们将探讨如何正确使用.find()代替.children()来定位嵌套元素,解决.data()方法返回数字类型导致比较错误的问题,并提供一个基于事件监听的实用示例,以实现对用户修改数据的实时检测和保存。 动态表格数据处理…

    2025年12月22日
    000
  • 揭秘canvas技术在数据可视化中的独特威力

    发现Canvas技术在数据可视化中的独特作用 随着数据时代的到来,数据可视化成为了一种重要的方式来呈现大量的数据。在数据可视化中,Canvas技术以其独特的优势在各个领域展示了巨大的潜力。本文将着重介绍Canvas技术在数据可视化中的独特作用,并给出具体的代码示例。 Canvas是HTML5中的一个…

    好文分享 2025年12月21日
    000
  • 使用localstorage存储数据所需的包有哪些?

    localstorage是HTML5中的一项重要技术,它可以用来在客户端本地存储数据。在使用localstorage存储数据之前,我们需要确保在代码中引入合适的包来操作这个功能。 在使用localstorage之前,我们需要在HTML文件中添加以下代码来引入localstorage的相关包: 在以上…

    2025年12月21日
    000
  • 无法将数据保存到localstorage,为什么?

    为什么我的数据无法保存到localstorage中? 本文将详细讨论为何在某些情况下,数据无法保存到本地存储(localstorage)中。同时,我将提供一些具体的代码示例以帮助您解决这个问题。 首先,让我们来了解一下什么是localstorage。localstorage是HTML5中引入的一种W…

    2025年12月21日
    000
  • 如何将HTML表单数据作为文本并发送到html2pdf?

    html2pdf 是一个 JavaScript 包,允许开发人员将 html 转换为 canvas、pdf、图像等。它将 html 作为参数并将其添加到 pdf 或所需文档中。此外,它还允许用户在添加 html 内容后下载该文档。 在这里,我们将访问表单并使用html2pdf npm包将其添加到pd…

    2025年12月21日
    000
  • html如何修改日期样式

    在html中,可以使用“::-webkit-datetime-edit”伪元素选择器来修改日期格式,只需要用该选择器选中元素,在设置具体样式即可,具体语法为“::-webkit-datetime-edit{属性:属性值}”。 本教程操作环境:windows7系统、CSS3&&HTML…

    2025年12月21日
    100
  • 单选框的type属性值为什么

    单选框的type属性值为“radio”。html type属性可以规定要显示的输入框“”元素的类型;值为“radio”时显示为单选框、“checkbox”时显示为复选框、“select”时显示为下拉式选框等等。 本教程操作环境:windows7系统、HTML5版、Dell G3电脑。 在HTML中,…

    2025年12月21日
    000
  • HTML中type是什么意思

    在HTML中,type是类型的意思,是一个标签属性,主要用于定义标签元素的类型或文档(脚本)的MIME类型;例在input标签中type属性可以规定input元素的类型,在script标签中type属性可以规定脚本的MIME类型。 本教程操作环境:windows7系统、html5版、Dell G3电…

    2025年12月21日
    000
  • HTML中ul标签如何去掉点?HTML无序列表的样式实例解析

    本篇文章主要讲述的是关于html中的ul标签的默认小点给取消掉,还有关于html的无序列表ul标签的样式解释,给出了ul标签中的type属性三种值的介绍。现在就让我们一起来看本篇文章吧 首先这篇文章一开始我们就开始介绍在html中是怎么把ul标签的点给去掉的: 大家应该都使用过ul无序列表标签,ul…

    2025年12月21日 好文分享
    000
  • html中的ol标签如何去掉标号呢?标签的使用方法总结

    本篇文章介绍了html的ol标签是怎么去掉序号标号的,这里还有代码的详细解释,还有介绍了关于html ol有序列表标签如何更改序号,下文介绍了三种序号,大家也可以自己去想填写怎样的序号。现在来看这篇文章吧 一、我们先看看html中的ol标签是如何去掉标号的呢: 我们都知道html的ol标签是个有序列…

    2025年12月21日 好文分享
    000
  • HTML ul标签的什么意思?HTML ul标签的作用详解

    本篇文章主要的为大家讲解了关于html ul标签的三种重要的用法,还有关于html ul标签的解释,包含li标签的还有type属性对ul标签的使用情况,好了,下面大家一起来看文章吧 首先让我们先来解释一下HTML ul标签的意思: ul标签定义的是表格当中无序列表,表格当中的无序列表都是在 标签之中…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信