0.3%参数推理,实现78倍加速!ETH团队提出UltraFastBERT,构筑语言模型巨人

47894ae061b1aef63c877b1a6bd43221.gif

©PaperWeekly 原创 · 作者 | 岳廷

研究方向 | 大语言模型

对于大语言模型,如果能在推理过程中只选择性地使用模型中的一小部分参数,将大幅减少计算量,使语言模型的响应速度得到质的提升。

然而参数量的减少是否会降低模型性能呢?对此,来自瑞士联邦理工学院苏黎世分校的研究人员在最新研究中给出了证明。他们设计了一种名为 UltraFastBERT 的 BERT 模型变体,其参数量与原 BERT-BASE 持平,但推理时只使用了0.3%的参数。

实验结果表明,在多项下游语言理解任务上的表现与 BERT-BASE 可相比拟。这说明语言模型的参数在推理时存在巨大的冗余。同时实验结果显示,相对于基线获得 78 倍加速!

fe7facee1813b729e6147c8427e84e64.png

论文题目:

Exponentially Faster Language Modeling

论文链接:

https://arxiv.org/pdf/2311.10770

代码链接:

https://github.com/pbelcak/UltraFastBERT

def9121f4f6db77b85336d84023b15ea.png

方法

大语言模型的前馈层占据了它们参数的大部分。然而,并非所有神经元都需要在每次输入时被用于计算前馈层的输出。

文章提出了一种新的 BERT 变体模型 UltraFastBERT,其核心是使用快速前馈网络(FFF)来替代 BERT 的前馈层(FF)。UltraFastBERT 的中间层在设计上快得多:对于具有 n 个神经元的FF网络和FFF网络,通过 FFF 的前向传播的时间复杂度为 ,而 FF 的时间复杂度为 。这是因为 FFF 将其神经元组织成一个平衡二叉树,并且根据输入条件选择性地执行二叉树的某一个分支。从而大大减少了运算量。

在 FFF 上执行推理等同于进行条件矩阵乘法(CMM),其中输入的行与神经权重的列依次进行点乘,而选择进行的权重列取决于之前点乘操作的输出。通过这种方式,所有神经元仅被一些输入使用,并且没有任何输入需要网络处理超过少数几个神经元。这与传统前馈网络中的密集矩阵乘法(DMM)形成对比,DMM 计算所有行与所有列的点积。

对于 CMM,除了 high-level 模拟,目前尚无高效的原生 CMM 库,也没有流行的深度学习框架有现成的接口可供实现。因此,文章提供了一套基于 BLAS 库的指针批量矩阵乘法程序的 CPU 实现。

33022319976de490fa422aafe5ad7433.png

模型

2.1 架构

文章以 Crammed BERT 架构为基准。将前馈网络替换为快速前馈网络。Crammed BERT 是一种对 BERT 进行改进的模型,它通过增加模型的大小和容量来提高性能。Crammed BERT 的模型大小是原始 BERT 模型的两倍,并且具有更多的参数。

Crammed BERT 的改进主要体现在以下两个方面:

  • 更大的模型大小可以让 Crammed BERT 学习到更复杂的关系和模式;

  • 更多的参数可以让 Crammed BERT 更好地捕捉文本中的细微差别。

Crammed BERT 在各种自然语言处理任务上都取得了显著的改进。 

另外,文章对架构做以下简化更改:

1. 删除叶节点和非叶节点之间的所有差异。特别是在所有节点上使用相同的(GELU)激活函数,在所有节点上都配备输出权重,并删除所有输出偏差;

2. 将叶大小固定为 1;

3. 允许多个 FFF 树并行。通过对各个树的输出求和并将和呈现为中间层输出,以允许多个 FFF 树共同计算中间层输出。

2.2 下游性能

遵循与 Crammed BERT 一样的训练过程。调优所有 FastBERT 模型以用于 GLUE 基准任务,并报告评估分数。调优结果如表 1。

d44f6ccfededa9b7e5afc9ee43c8f08b.png

可以看到,在单个 A6000 GPU 上训练 1 天的所有 FastBERT 变量至少保留了原始 BERT-base 模型下游预测性能的 96.0%。

6d8edf23cf0b5dece2c5b70c0cf9fde8.png

推理

从工程学角度来看,其实现的核心是条件矩阵乘法运算,其伪代码如下。

666632b49ab70c8ac99e4c6e604ec529.png

3.1 算法

在算法 1 中,B 表示批大小,H 表示层输入宽度(transformer 隐藏维度), 是神经元的数量,, 表示 M 的第 k 列,, 表示M的第l行。CMM 中的 >- 比较的结果假定为整数∈{0, 1}。

另外,总体上 CMM 与现有计算流程和硬件是兼容的,但实现起来更有难度。

3.2 推理性能

文章比较了几种可用的 FF/FFF 推理实现的速度。

实现方法:对于 CPU 推理,使用 Intel oneAPI 中提供的数学内核库。

Level 1 实现仅使用 BLAS 级 1 例程和类 BLAS 级 1 扩展构建,即向量-向量点积和标量-向量积。 

Level 2 实现使用批处理 BLAS 2 级例程和类 BLAS 1 级扩展,即批处理矩阵-向量乘法和批处理标量-向量积。 

Level 3 实现使用(非批处理)BLAS 3 级矩阵-矩阵乘法。这是 FF 的最快 CPU 实现,但由于向量级稀疏性不被库支持,目前无法为 FFF 提供此类实现。 

对于 GPU 实现,使用 PyTorch 内核或自定义 CUDA 内核:

  • native fused 实现使用 native fused 前馈层内核。请注意,对于 FF 图层这是最快的 GPU 实现,但由于 CMM 的性质,当前不存在这样用于 FFF 的内核;

  • BMM 实现对 FF 和 FFF 都使用批处理矩阵乘法和激活内核。在 FFF 的情况下,在每一步的树下降中大量使用向量复制来模拟条件性;

  • native CUDA 实现是自定义 CUDA 内核代码,既用于 FF 又用于 FFF。

测试方法:对于 CPU 推理,在 Intel(R) Core(TM) i7-6700HQ CPU 上执行 250 次前向传递,在 Intel MKL v2023.2.0 下,使用所有例程的 64 位变体。报告单次推理花费的平均时间,注意标准偏差的值始终远低于平均值的 2%。对于 GPU 实现,在 NVIDIA RTX A6000 GPU 上执行 1000 次前向传递,在 CUDA v11.7 和 PyTorch 2.0.1 下。测量 GPU 时间并报告平均时间,标准偏差同样低于平均值的 2%。

结果:表 2 列出了 BERT-base 和 FastBERT-1x11 中前馈层和快速前馈层的性能比较。表的每一列列出了在使用相同线性代数例程原语时 FFF 相对于 FF 实现的实现速度提升。

1e5660e2ec3d2872cbc766cfebf558e4.png

表中缺少的两个条目是当前不可用的 BLAS level 3 和 native fused FFF 实现。

efae56cb1d3ad5f17b4d74efb62bbd98.png

总结

总的来说,文章提出的快速前馈网络和基于此构建的 UltraFastBERT 模型,打开了语言模型加速的新视野,值得我们继续深入探索:

1. UltraFastBERT 只是第一步,其思路可推广到更大规模的语言模型,或适当调整后应用于其他 NLP 模型,实现更高倍数的加速。如果获得设备厂商支持,会加速这类技术向实用转化;

2. 通过证明了参数冗余度极高,这篇工作突出了模型压缩的巨大价值。我们可以在不损失性能的前提下获得轻量级模型,这对于模型在边缘设备上的部署尤其重要;

3. 条件神经执行引入了新的有向路径分支,这为动态推理提供了可能性。我们可以根据输入动态调整参与计算的神经元集合和数量,实现自适应预测。 

另外,文章已开源相关代码,感兴趣的研究人员可进行快速验证。

更多阅读

cc5ff5954dad1797f2b2abcd4e4d8a49.png

69862cdd93539b3008c58f0d2d29ec06.png

22c92cb7a1c02cb823d01d529ad44078.png

f2542fe2f9d312b297bca65f5284de81.gif

#投 稿 通 道#

 让你的文字被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。

📝 稿件基本要求:

• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算

📬 投稿通道:

• 投稿邮箱:hr@paperweekly.site 

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿

b62f34ae9a635c755e5ab0636dd1e970.png

△长按添加PaperWeekly小编

🔍

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

·

·

5a1d7d23dda3c17a07281e2b38bb7d9b.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在STM32中配置ETH MAC的参数需要以下步骤: 1. 确定ETH MAC的工作模式,可以选择MII或RMII模式。 2. 配置ETH MAC的时钟源,可以选择外部时钟源或者内部PLL时钟源。 3. 配置PHY芯片的地址,使ETH MAC能够与PHY进行通信。 4. 配置ETH MAC的MAC地址,以便其他设备能够识别该设备。 5. 配置ETH MAC的传输参数,如最大传输单元、发送和接收缓冲区大小等。 6. 启动ETH MAC,使其能够开始工作。 以下是一个简单的示例代码,可以帮助你更好地了解如何在STM32中配置ETH MAC的参数: ``` #include "stm32f4xx.h" #include "stm32f4xx_eth.h" void ETH_Configuration(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx | RCC_AHB1Periph_ETH_MAC_Rx, ENABLE); ETH_DeInit(); ETH_StructInit(&ETH_InitStructure); ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable; ETH_InitStructure.ETH_Speed = ETH_Speed_100M; ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable; ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable; ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable; ETH_InitStructure.ETH_ReceiveBuffer = ETH_ReceiveBuffer_Ring; ETH_InitStructure.ETH_TransmitBuffer = ETH_TransmitBuffer_Ring; ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1; ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable; ETH_InitStructure.ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes; ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable; ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable; ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable; ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable; ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable; ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat; ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat; ETH_InitStructure.ETH_RxDescAligned = ETH_RxDescAligned_Enable; ETH_InitStructure.ETH_TxDescAligned = ETH_TxDescAligned_Enable; while (ETH_Init(&ETH_InitStructure, PHY_ADDRESS) != ETH_SUCCESS); ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } ``` 在上面的代码中,我们首先开启了ETH MAC和相关的外设时钟,并使用ETH_DeInit函数将ETH MAC的所有寄存器恢复到默认值。然后,我们使用ETH_StructInit函数初始化了ETH_InitStructure结构体,并设置了各种ETH MAC参数。最后,我们使用ETH_Init函数将ETH MAC初始化,并使用ETH_DMAITConfig函数和NVIC_Init函数配置相关的DMA和中断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值