大模型笔记【2】 LLM in Flash

news/2024/7/20 17:20:51 标签: LLM, 大模型

Apple最近发表了一篇文章,可以在iphone, MAC 上运行大模型:【LLM in a flash: Efficient Large Language Model Inference with Limited Memory】。

图片

主要解决的问题是在DRAM中无法存放完整的模型和计算,但是Flash Memory可以存放完整的模型。但是Flash带宽较低,LLM in Flash通过尽量减少从Flash中加载参数的数量,优化在DRAM中的内存管理,实现在Flash带宽有限的条件下提高计算速度的目的。


这篇文章很多都是工程上的细节,很少理论。下面是这篇论文的总结,如有不对的地方,欢迎私信。

  • 利用FeedForward 层的稀疏度,只加载FeedForward层输入非0和预测输出非0的参数

  • 通过Window Sliding 只加载增量的参数,复用之前的计算,减少需要加载的参数。

  • 将up-projection的row和down-projection的column放在一起存放,这样在flash中可以一次读取比较大的chunk,提高flash的带宽利用效率。

    如下图所示,chunk越大,带宽也就越大,初始加载chunk的latency可以被平摊。

    图片


1. 大模型在FeedForward layer有超过90%的稀疏度。将embedding和attention 矩阵一直保存在DRAM中。Attention 的权重占据了model总量的1/3。对于FeedForward Layer,只有非稀疏的部分被动态的加载进去DRAM。

2. 预测Relu层的稀疏性。在attention层的输出后面增加low-rank predictor,预测在relu层之后可能是0的元素。

经过优化后,最终只需要加载2%的FeedForward层的参数到DRAM中。

图片

3. Sliding Window

每次滑动窗口,在生成新的token后,删掉不在window内的neuron,增加新的neuron。

图片

上图右侧为一个window size为5的示意图,粉色的是要删除的元素,蓝色的是新加入的元素。

上图左侧是如何在aggregated usage和incremental transfer中保持平衡,window设置的越大,每次新需要加载neruon也就越少,但是需要在memory中累计保存的空间占用的也就越大。

上图左侧的目标就是如何让aggregated usage和incremental transfer都比较小。

译者疑问:这个window就是Longformer: The Long-Document Transformer 中的sliding window吗?欢迎私信。

4. 内存管理

内存管理也是因为sliding window引入的。

译者注:

就像c++中vector的维护一样,如果每次删除vector中间的一个元素,都需要导致该元素后面所有元素的移动。

下图描述的就是删除和加入新neuron的内容。

图片

最后文章还提出了比较有意思的一点,他们主要进行了稀疏化的优化,在计算和加载参数方面。他们也尝试了通过和当前neuron关系紧密的 “closest friend”绑定,每次加载neuron时,也都加载他的closest friend。

作者说但是这样带来了负面作用,因为存在一些closest friend是很多neuron的closest friend (译者注:类似于大众之友),这些neuron被频繁的加载到DRAM中,反而降低了性能。


http://www.niftyadmin.cn/n/5312992.html

相关文章

使用串口 DMA 模式接收不定长数据

一、简介 曾经遇到客户有一个需求,需要用串口 DMA 的方式接收不定长度的数据,DMA 有个缺点就是在每次传输前需要设定好传输的字节长度,这种方式显然对于接收不定长度的数据来说没有那么灵活。但 DMA 也有着显著的优点,如可直接访…

【Java并发】深入浅出 synchronized关键词原理-下

上一篇文章,简要介绍了syn的基本用法和monter对象的结构,本篇主要深入理解,偏向锁、轻量级锁、重量级锁的本质。 对象内存布局 Hotspot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据 (Instance Da…

this.$emit()的用法

this.$emit 是 Vue.js 中的一个方法,它可以用于子组件向父组件传递事件。 使用方法如下: this.$emit(eventName, […args])其中,eventName 是事件名称,args 是可选参数,表示传递给父组件的数据。 举个例子,…

数据导出excel的通用python代码

将数据导出excel的通用代码 在实际的项目开发中,一些重要数据需要保存到excel文件中,或者需要提供下载的功能,都会用到将数据导出excel的代码。 本文介绍了将数据导出excel的通用python代码,对创建excel文件、写数据等过程进行了…

低压 5V 全桥驱动芯片GC9114 ,适用于摄像机、消费类等产品上

GC9114 是一款低压 5V 全桥驱动芯片,为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。 GC9114 能提供高达 1.3A 的持续输出电流。可以工作在 2~6V 的电源电压上。具有 PWM(IN/IN)输入接口,与…

探秘 JAVA 工厂模式:深度详解与实例分析

探秘 JAVA 工厂模式:深度详解与实例分析 前言: 欢迎阅读本篇博客,我们将深入研究 Java 中一种设计模式——工厂模式。工厂模式是一种创建型模式,它提供了创建对象的最佳方式之一,有助于将对象的创建与使用解耦。 1. 工厂模式简…

前端使用scale属性结合CSS动态样式实现动态的图片缩放效果

废话不多说&#xff0c;直接上代码&#xff1a; 示例一&#xff0c;使用css动态样式结合scale进行src图片的缩放。 //结构层&#xff0c;使用动态属性配合计算属性来实现动态样式<img :src"selectedItem.url" alt"" :style"elementStyle(item)&…

【Python学习】Python学习8-Number

目录 【Python学习】Python学习8-Number 前言在变量赋值时被创建Python支持四种不同的数据类型整型(Int)长整型(long integers&#xff09;浮点型(loating point real values)复数(complex numbers) Python Number 类型转换Python math 模块、cmath 模块Python数学函数Python随…