大语言模型 (LLM) 正在席卷整个机器学习世界。得益于其 transformer 架构,LLM 拥有从大量非结构化数据 (如文本、图像、视频或音频) 中学习的不可思议的能力。它们在 多种任务类型 上表现非常出色,无论是文本分类之类的抽取任务 (extractive task) 还是文本摘要和文生图像之类的生成任务 (generative task)。
顾名思义,LLM 是 _大_模型,其通常拥有超过 100 亿个参数,有些甚至拥有超过 1000 亿个参数,如 BLOOM 模型。 LLM 需要大量的算力才能满足某些场景 (如搜索、对话式应用等) 的低延迟需求。而大算力通常只有高端 GPU 才能提供,不幸的是,对于很多组织而言,相关成本可能高得令人望而却步,因此它们很难在其应用场景中用上最先进的 LLM。
在本文中,我们将讨论有助于减少 LLM 尺寸和推理延迟的优化技术,以使得它们可以在英特尔 CPU 上高效运行。
LLM 通常使用 16 位浮点参数 (即 FP16 或 BF16) 进行训练。因此,存储一个权重值或激活值需要 2 个字节的内存。此外,浮点运算比整型运算更复杂、更慢,且需要额外的计算能力。
量化是一种模型压缩技术,旨在通过减少模型参数的值域来解决上述两个问题。举个例子,你可以将模型量化为较低的精度,如 8 位整型 (INT8),以缩小它们的位宽并用更简单、更快的整型运算代替复杂的浮点运算。
简而言之,量化将模型参数缩放到一个更小的值域。一旦成功,它会将你的模型缩小至少 2 倍,而不会对模型精度产生任何影响。
你可以进行训时量化,即量化感知训练 (QAT),这个方法通常精度更高。如果你需要对已经训成的模型进行量化,则可以使用训后量化 (PTQ),它会更快一些,需要的算力也更小。
市面上有不少量化工具。例如,PyTorch 内置了对 量化 的支持。你还可以使用 Hugging Face Optimum-Intel 库,其中包含面向开发人员的 QAT 和 PTQ API。
最近,有研究 [1][2] 表明目前的量化技术不适用于 LLM。LLM 中有一个特别的现象,即在每层及每个词向量中都能观察到某些特定的激活通道的幅度异常,即某些通道的激活值的幅度比其他通道更大。举个例子,下图来自于 OPT-13B 模型,你可以看到在所有词向量中,其中一个通道的激活值比其他所有通道的大得多。这种现象在每个 transformer 层中都存在。
图源: SmoothQuant 论文
迄今为止,最好的激活量化技术是逐词量化,而逐词量化会导致要么离群值 (outlier) 被截断或要么幅度小的激活值出现下溢,它们都会显著降低模型质量。而量化感知训练又需要额外的训练,由于缺乏计算资源和数据,这在大多数情况下是不切实际的。
SmoothQuant [3][4] 作为一种新的量化技术可以解决这个问题。其通过对权重和激活进行联合数学变换,以增加权重中离群值和非离群值之间的比率为代价降低激活中离群值和非离群值之间的比率,从而行平滑之实。该变换使 transformer 模型的各层变得“量化友好”,并在不损害模型质量的情况下使得 8 位量化重新成为可能。因此,SmoothQuant 可以帮助生成更小、更快的模型,而这些模型能够在英特尔 CPU 平台上运行良好。
图源: SmoothQuant 论文
现在,我们看看 SmoothQuant 在流行的 LLM 上效果如何。
我们在英特尔的合作伙伴使用 SmoothQuant-O3 量化了几个 LLM,分别是: OPT 2.7B、6.7B [5],LLaMA 7B [6],Alpaca 7B [7],Vicuna 7B [8],BloomZ 7.1B [9] 以及 MPT-7B-chat [10]。他们还使用 EleutherAI 的语言模型评估工具 对量化模型的准确性进行了评估。
下表总结了他们的发现。第二列展示了量化后性能反而得到提升的任务数。第三列展示了量化后各个任务平均性能退化的均值 (* 负值表示量化后模型的平均性能提高了)。你可以在文末找到详细结果。
如你所见,OPT 模型非常适合 SmoothQuant 量化。模型比预训练的 16 位模型约小 2 倍。大多数指标都会有所改善,而那些没有改善的指标仅有轻微的降低。
对于 LLaMA 7B 和 BloomZ 7.1B,情况则好坏参半。模型被压缩了约 2 倍,大约一半的任务的指标有所改进。但同样,另一半的指标仅受到轻微影响,仅有一个任务的相对退化超过了 3%。
使用较小模型的明显好处是推理延迟得到了显著的降低。该 视频 演示了在一个 32 核心的单路英特尔 Sapphire Rapids CPU 上使用 MPT-7B-chat 模型以 batch size 1 实时生成文本的效果。
在这个例子中,我们问模型: “ What is the role of Hugging Face in democratizing NLP? ”。程序会向模型发送以下提示:
“ A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user’s questions. USER: What is the role of Hugging Face in democratizing NLP? ASSISTANT: ”
这个例子展示了 8 位量化可以在第 4 代至强处理器上获得额外的延迟增益,从而使每个词的生成时间非常短。这种性能水平无疑使得在 CPU 平台上运行 LLM 成为可能,从而为客户提供比以往任何时候都更大的 IT 灵活性和更好的性价比。
HuggingFace 的首席执行官 Clement 最近表示: “专注于训练和运行成本更低的小尺寸、垂域模型,会使更多的公司会收益。” Alpaca、BloomZ 以及 Vicuna 等小模型的兴起,为企业在生产中降低微调和推理成本的创造了新机会。如上文我们展示的,高质量的量化为英特尔 CPU 平台带来了高质量的聊天体验,而无需庞大的 LLM 和复杂的 AI 加速器。
我们与英特尔一起在 Spaces 中创建了一个很有意思的新应用演示,名为 Q8-Chat (发音为 Cute chat
)。Q8-Chat 提供了类似于 ChatGPT 的聊天体验,而仅需一个有 32 核心的单路英特尔 Sapphire Rapids CPU 即可 (batch size 为 1)。
Space 体验地址: http://intel-q8-chat.hf.space
我们正致力于将 Intel Neural Compressor 集成入 Hugging Face Optimum Intel,从而使得 Optimum Intel 能够利用这一新量化技术。一旦完成,你只需几行代码就可以复现我们的结果。
敬请关注。
未来属于 8 比特!
本文保证纯纯不含 ChatGPT。
本文系与来自英特尔实验室的 Ofir Zafrir、Igor Margulis、Guy Boudoukh 和 Moshe Wasserblat 共同完成。特别感谢他们的宝贵意见及合作。
负值表示量化后性能有所提高。
英文原文: http://hf.co/blog/generative-ai-models-on-intel-cpu
原文作者: Julien Simon
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。
审校/排版: zhongdongy (阿东)
此前,L氪迹有向各位分享如何查询出伪装成百度假蜘蛛的恶意IP,但是除了寻找出来防止,我们还需要防止以及屏蔽这些恶意IP在此攻击我们的网站。L氪迹之前的佛山SEO技术教程网站就是没有预防并屏蔽好恶意IP的攻击,严重到被百度搜索引擎惩罚并K站了。因此,为了让大家避免出现跟博主同样的情况,给大家分享一个妙招,操作简单,快速有效。由于本站点是采用wordpress建站程序,所以推荐解决方法会适用于WP网站。下面直接上图文教程:1、登录wordpress网站后台,点击【插件】,然后点击【安装插件】,如图:2、搜索插件【AllInOneWPSecurity】并安装启用;3、然后启用插件后,就会出现【WP安全】,点击【黑名单管理】,复制【恶意IP地址】到框里,然后勾选保存,即可生效,如下图:【AllInOneWPSecurity】插件是一款功能非常强大实用的安全插件,除了屏蔽恶意IP的功能之外,还有其他防止网站被攻击和守护网站安全的功能,各位站长可以根据插件的提示按照自己的需要去启用功能。L氪迹SEO3.0,深挖用户需求,重塑用户体验!SEO博客简介:SEO免费教程分享_学习交流纯白帽SEO技术以及
处理器中的原子操作原子操作意为:不可中断的一个或一系列操作。现在先了解几个相关术语:术语名称英文解释比较并交换CompareAndSqapCAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较旧值有没有发生变化,如果没有发生变化,才交换新值,发生了变化则不交换。CPU流水线CPUPipelineCPU流水线的工作方式就像工业生产上的装配流水线,在CPU中由5~6个不同功能的电路单元组成一条指令处理流水线,然后将一条x86指令分成5~6步后再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度。内存顺序周期MemoryOrderViolation内存顺序冲突一般是由假共享引起的,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起其中一个CPU的操作无效,当出现这个内存顺序冲突时,CPU必须清空流水线。处理器使用对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。处理器会自动保证基本的内存操作的原子性。处理器保证从系统内存中读取或者写入一个字节是原子的,即:当一个处理器读取一个字节时,其他处理器不能访问这个字节
Unity3D打包android应用程序时,如果不对DLL加密,很容易被反编译,导致代码的泄露。通常的做法是通过加密DLL或者对代码进行混淆。本文的所要探讨的是通过加密的方式来对DLL进行保护,并详细记录加密的操作过程。主要参考 雨松的博文:http://www.xuanyusong.com/archives/3553http://csftech.logdown.com/posts/452269-android-unity-encryption 这两篇文章已经详细介绍了加密的过程,但是还是有些坑和有些操作没有给出。 原理说明所有的代码编译后是在apk\assets\bin\Data\Managed\Assembly-CSharp.dll下,要做的就是对这个DLL进行加密,Assembly-CSharp.dll由libmono.so加载,所以需要在libmono.so中对加密过的Assembly-CSharp.dll进行解密,幸好unity提供了mono的代码可以进行编译修改。当然对于libmono.so也存在被反编译的风险,本文暂不考虑。准备linux系统。本文选择采用的是
版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/u011415782/article/details/102482034这种情况发生在: 我要在自己的ThinkPHP5.1.2框架中,使用composer命令安装workerMan拓展的时候所提示的信息 composer命令:composerrequiretopthink/think-worker=v2.0.9 提示信息 打印信息如下: ./composer.jsonhasbeenupdated Loadingcomposerrepositorieswithpackageinformation Updatingdependencies(includingrequire-dev) Yourrequirementscouldnotberesolvedtoaninstallablesetofpackages. Problem1 -Canonlyinstalloneof:topthink/think-installer[v2.0.0,v1.0
一、定义面向对象设计鼓励将行为分布到各个对象中,把对象划分成更小的粒度,有助于增强对象的可复用性。但由于这些细粒度对象之间的联系激增,又可能反过来降低它们的可复用性。 中介者模式的作用就是解除对象与对象之间的紧耦合关系。二、示例:购买商品假设我们正在开发一个购买手机的页面,购买流程中,可以选择手机颜色以及输入购买数量,同时页面中可以对应展示输入内容。还有一个按钮动态显示下一步操作(该颜色库存量充足,显示下一步;否则显示库存不足)。<div> <span>请选择颜色</span> <selectid="selColor"> <optionvalue="roseGold">玫瑰金</option> <optionvalue="luxuryGold">土豪金</option> </select> </div> <div> <span>请输入购买数量:</span> <inp
铜灵编译整理 量子位出品|公众号QbitAI最近,美国自动驾驶技术公司Comma.ai开源最新无人车数据集:comma2k19。comma2k19内含2019分钟(约33小时)的加州通勤数据,南起旧金山,北至圣何塞。采集地点涵盖这中间20km路段的280条高速公路,适用于自动驾驶研究。comma2k19+Laikacomma2k19中的数据采集过程并不复杂。这些数据是Comma.ai出品的行车记录仪EON采集的,和智能手机类似,EON中也有一些传感器,比如摄像头、手机GPS、温度感应装置和9轴的IMU(惯性感测器原件)等。EON是Comma.ai目前主打产品,此前推出时,官方将其介绍为“可以充当汽车仪表盘的三合一设备”,具备行车记录仪、导航和音乐功能。EON还能收集到未经处理的GNSS(卫星导航系统)数据,以及由Panda发送的所有CAN数据。Panda也是Comma.ai的产品,这套自动驾驶组件支持1996年以后生产的所有汽车的组件,使用了ARM32位的处理器,共有3个CAN总线接口,支持WiFi连接。comma2k19中共包含2019段时长一分钟的视频,研究人员可以拿去应用到建图算
funcmain(){ u:= new (user) u.lock.Lock() u.name= "张三" u.lock.Unlock() fmt.Println(u) } typeuserstruct{ locksync.Mutex namestring ageint }示例中的user类型中的lock字段我不用初始化,直接可以拿来用,不会有无效内存引用异常,因为它已经被零值了。这就是new,它返回的永远是类型的指针,指向分配类型的内存地址。二者异同所以从这里可以看的很明白了,二者都是内存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分配,并且内存置为零。所以在我们编写程序的时候,就可以根据自己的需要很好的选择了。make返回的还是这三个引用类型本身;而new返回的是指向类型的指针。make也是用于内存分配的,但是和new不同,它只用于chan、map以及切片的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类
0x00概述与Dockerfile一样,编写DockerCompose的配置文件是掌握和使用好DockerCompose的前提。编写DockerCompose配置文件,其本质就是根据我们所设计的应用架构,对不同应用容器进行配置并加以组合。在这一节中,我们就来谈谈如何编写DockerCompose的配置文件,了解其中常见配置项的使用方法。0x01 定义服务为了理解在开发中常用的DockerCompose配置,我们通过一个在开发中使用的DockerCompose文件来进行下面的讲解。version:"3" services: redis: image:redis:3.2 networks: -backend volumes: -./redis/redis.conf:/etc/redis.conf:ro ports: -"6379:6379" command:["redis-server","/etc/redis.conf"] database: image:mysql:5.7 networks: -bac
一、变量那点事儿1.1局部变量 (1)声明局部变量DECLARE@变量名数据类型 DECLARE@namevarchar(20) DECLARE@idint复制 (2)为变量赋值SET@变量名=值--set用于普通的赋值 SELECT@变量名=值--用于从表中查询数据并赋值,,可以一次给多个变量赋值 SET@name=‘张三’ SET@id=1 SELECT@name=sNameFROMstudentWHEREsId=@id复制 (3)输出变量的值 SELECT以表格的方式输出,可以同时输出多个变量;而PRINT 则是以文本的方式输出,一次只能输出一个变量的值。SELECT@name,@id PRINT@name PRINT@id print@name,@id--错误!!复制1.2全局变量 (1)关于全局变量与局部变量 局部变量: ①局部变量必须以标记@作为前缀,如@Ageint; ②局部变量需要先声明,再赋值; 全局变量(系统变量): ①全局变量必须以标记@@作为前缀,如@@version; ②全局变量由系统定义和维护,我们只能读取,不能修改全局变量的值;
区块链游戏在经历泡沫潮的大劫后,大部分游戏都已经死去,只有少部分仍在苟延残喘。当前市场上区块链游戏分为三类,一是在一轮游戏市场的群攻后,死在了区块链的泡沫大潮里,以曾经“凶猛”的“玩客猴”为代表;二是回炉重造。以“公信宝”为例,此前一直作为区块链游戏的代表,但是逐渐成为“网易星球”、“元链星系”的劲敌,而逐渐失去了本身的用户流量。而其在推出夺宝竞猜后又引起了一波关注,现今面对市场各种挤兑,公信宝也在回炉重造;三是升级完善。可以说是区块链游戏最好的发展动态了,“元链星系”这样的游戏即使在一阵火爆后,现今进入了2.0版本的研发,除本身的ACNC外,还上线了CTC,RBC两种币种,也即将带着星球副本、种族竞技、道具交换等新玩法回归市场。纵观如今形式,可以发现,区块链游戏行业已经进入了死循环,市场欺诈乱象,各种冒牌货丛生,但是我们不能否认,区块链游戏一直加持着技术与价值的门槛,而这样的高门槛致使区块链游戏高端化和独特化,即使是在一轮轮的衰退期后,区块链游戏仍然可以成为未来游戏界的“王者”。首先,区块链游戏区别于传统游戏无非因其与“区块链”挂钩,但是这并不是概念上的挂钩,而是真正将技术运用游戏。
硬件复兴时代真的来了吗?——Makeblock创始人王建军谈智能硬件创业在9月20号举行的国际智能硬件高峰论坛上,曾入选福布斯评选的“30位30岁以下创业者”的Makeblock创始人王建军针对这次活动的主题“科技创新让生活更美好”分享了他对智能硬件创业的一些思考。以下为Makeblock创始人王建军演讲实录:大家下午好,今天非常高兴来这里跟大家分享一下我对智能硬件创业相关的一些思考。美国最有名的孵化机构YC提出了“硬件复兴”的概念。2013年之前,YC所孵化的企业,软件的比例相当高,而后来,硬件的比例越来越大。到了最近的2015年,YC孵化了50多个公司,其中20多个公司是做硬件相关的。这说明现在的硬件产品越来越多。大家知道,之前在硅谷,是微软、Google的天下,在中国是BAT的天下,这些都是软件公司。那么再之前,像IBM和其他一些做电脑硬件的公司是老大。后来,风投才被Facebook、Google这些软件公司带走。现在,我们又到了一个“硬件复兴”的节点。硬件创业和软件创业有哪些显著差别呢?开发和启动速度软件产品需要的东西比较少,基本上只要人、电脑和网络就可以了,涉及面比较窄。但是
KSKnowledgeSharing知识分享现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。转自:兰亭风雨ArrayList简介ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(Listl)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Cloneable接口,能被克隆。ArrayList源码剖析ArrayList的源码如下(加入了比较详细的注释):/* *提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 *packagejava.util;publicclassA
一、HTTPS协议概念 超文本传输安全协议(HypertextTransferProtocolSecure,简称:HTTPS)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,利用SSL/TLS来加密数据包。HTTPS的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。安全层的主要职责就是对发起的HTTP请求的数据进行加密操作和对接收到的HTTP的内容进行解密操作。 二、HTTPS通信(握手)过程 客户端向服务器发起请求,请求中包含使用的协议版本号、生成的一个随机数、以及客户端支持的加密方法。 服务器端接收到请求后,确认双方使用的加密方法、并给出服务器的证书、以及一个服务器生成的随机数。 客户端确认服务器证书有效后,生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,然后发给服务器。并且还会提供一个前面所有内容的hash的值,用来供服务器检验。 服务器使用自己的私钥,来解密客户端
案例描述: 今天遇到一个很有意思的SQLServer作业报错告警,作业出错的详细信息如下:Date 2021/6/2312:34:00复制Log JobHistory(YourSQLDba_BlockingSQL_Alert)复制 复制StepID 复制Server xxxxx复制JobName YourSQLDba_BlockingSQL_Alert复制StepName 复制Duration 00:0
与其他语言不太相同,C#语言本身有着自己的数据库查询语言,叫做LINQ,全称Language-INtegratedQuery。 在很大程度上,LINQ与我们常用的SQL是相通的,但是却有着更加独特的一些特性。由于程序员每天都要对内存、数据库或是XML文件中的数据对象进行查找和存取,但SQL语言同编程语言的分离为这种行为造成了很大的困扰。 而LINQ作为一种连接面向对象语言和关系数据库的桥梁,联合了对内存、数据库和XML的数据处理。同时作为C#的一种内部语言,写法上更有利于C#程序员操作。 1//Example13-1.AsimpleLINQquery 2usingSystem; 3usingSystem.Collections.Generic; 4usingSystem.Linq; 5namespaceProgramming_CSharp 6{ 7//Simplecustomerclass 8publicclassCustome
iOS震动反馈https://www.jianshu.com/p/f16d1828d768?ivk_sa=1024320u Taptic-Engine震动反馈的深入解析https://www.jianshu.com/p/d4567dbd7dde Vibration,支持IOS和Android(IOS不支持自定义时间,不支持振动模式) https://github.com/BenoitFreslon/Vibration https://github.com/trailblazr/VibrationPatterns/blob/master/Vibrator/MainViewController.m https://github.com/Comp3interactive/Unity-Vibrator https://github.com/Isshi-777/VibrationManager/blob/master/Assets/VibrationManager/Scripts/VibrationManager.cs