Mamba:7 VENI VIDI VICI

news2025/1/25 4:38:37

若在阅读过程中有些知识点存在盲区,可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计。技术宅麻烦死磕LLM背后的基础模型。

序列模型的效率与有效性之间的权衡取决于状态编码(压缩)的程度:追求高效性一定要求具有较小的状态,追求有效性一定要求状态包含更多的上下文信息。而在Mamba中的指导思想是选择性:或者重点关注,或者过滤掉无关的输入从而具备较强的的上下文感知能力。

Mamba

若读者仔细的将前面的六个部分进行仔细的推敲和阅读,那么在这篇终章理解Mamba就轻松多。

先来看看这幅经典的图,从图中可以看到在常规的状态空间模型SSM中,矩阵A、B和C都是固定,而在Mamba中加入了选择机制,矩阵B和C不再是固定矩阵,随着输入x而变化(某种程度而言,BC跟随时间或者步长的变化而变化)。因此Mamba不再是时不变系统了,而是时变系统。

图中有个离散化的参数∆t,它其实是离散化的一个参数。大白话的理解就是要是想忽略掉某次的输入那么t会比较小,要是想要稍微记久一点,那么t会相对大。t也是根据输入x进行变化的。另外从图上可以看出来状态都存储在GPU的高速SRAM中,而矩阵参数都存放在HBM中。

先来看看它的算法,不用害怕里面横七竖八的数学符号,左侧为S4的算法,右侧为Mamba的算法,Mamba有个另外的别名S6。

B: Batch Size(训练的批次大小)

L: Sequence Length (每句序列长度)

D: Size of the input vector (每个Token的向量长度,类似d_model)

N: Size of the hidden state h.(隐含层的长度)

相对于S4而言,S6扩展了矩阵B/C/∆的维度,而且它们和输入x相关,同时这三者在运算过程中会作为参数离散化为\overline{A}\overline{B}\overline{A}\overline{B}的维度为(B,L,D,N)。

理解选择性

先来看看选择性机制的效果,传统SSM可以利用卷积核选择性将固定间隔的记忆内容输出(左图),而Mamba可以将不固定间隔的上下文内容输出,同时能够根据场景决定什么时候重置状态,这其实更加符合大语言模型的需求场景。

RNN的经典门控机制是Mamba选择机制的一个实例。RNN门控和连续时间系统离散化很早就有研究人员将他们建立联系。更广泛地说,在SSM的作用可以看成RNN门控机制。 换句话说,SSM的离散化是智能门控机制的原则基础。<是不是看到这里脑袋一片空白……>

不着急,看来那么先来看看下面的图片,Mamba块的输入x先经过两个线性变换,然后经过σ的激活函数在输送给SSM。还记得RNN中的激活函数没有,激活函数输出[0,1]之间。通过和输入x相乘决定让多少的信息通过,这就是门控

那么回过来看看下面的定理:

符号控制着“关注”或者“忽略”当前输入xt的平衡。它摇身一变,泛化为RNN的门例如上面定理的g_{t})。较大的∆值将重置状态h并关注当前输入x,而较小的∆值保持状态并忽略当前输入。 SSM在这里可以被理解为由时间步长离散化的连续系统(不清楚的见之前的ZOH)。

按照这种方式理解,直觉上是∆->∞ 代表系统更长时间地关注当前输入(因此“选择”它且忘记当前状态),而∆->0 表示被忽略的瞬态输入。

其他的特点

选择性机制:线性 RNN 在长距离竞技场基准测试中确实表现出色,但这并不意味着它们是很好的语言模型。对于语言建模,线性RNN的性能比 Transformer 差得多。正如Mamba论文中所指出的,其原因是线性 RNN 无法选择性地忘记输出向量中的信息。如果权重接近 0,则每次输入后输出向量将设置为 0,实际上模型将始终立即忘记当前输入之前的任何内容。 如果循环权重接近1,则输出向量在与权重相乘时不会改变。而大模型最重要的是根据看到的输入来决定何时存储信息以及何时忘记信息。

Mamba在此对每个输入向量应用线性函数,为该输入生成单独的权重向量,然后使用这些生成的权重执行循环扫描。这样,某些输入可以生成接近0的权重,从而从输出向量中删除信息。 至于如何使用稳定的配置避免Mamba的梯度消失和爆炸,Mamba原始论文没有提及。

并行扫描:已经在Mamba5解释了原理,大家可以对照图推理。由于 Mamba是时变系统,无法使用卷积进行评估(还记得之前SSM的卷积表达模式没有)。但是它可以采用并行扫描算法进行并行化。

内存分配:Mamba还使用另一种技巧,即增加输出向量的大小。在标准RNN 中,输出向量与输入向量大小相同。Mamba将输出向量的大小扩展了16 倍。这使得它能够存储来自先前输入的更多信息。当然输出向量在传递到下一层之前被投影回原始大小。

通常这会使计算时间增加16倍,但事实证明,在GPU上Mamba层的主要瓶颈是在高性能内存中读取和写入数据所需的时间。GPU有两种类型的内存,SRAM和HBM(不明白的话,请跳转至此)。

GPU包含两种主要类型的内存:HBM (High Bandwidth memory)和SRAM (Static Random-Access memory)。HBM虽然带宽很高,但与更快但更小的SRAM相比,它的访问时间相对较慢。Mamba则使用SRAM在矩阵乘法期间进行快速访问,这是其计算的关键。

对于Mamba的递归操作,事实证明传输数据所花费的时间实际上比计算本身所花费的时间要大得多。 因此Mamba将输入向量和模型参数传输到SRAM,然后在单个块中计算整个Mamba操作,包括将输出投影回较小的原始大小,然后将结果写回HBM。这样,只需在高性能内存之间传输原始大小的向量,实际计算时间即便慢了16倍,但计算时间与传输时间相比非常小,不会真正影响总时间。

所有的离散化和计算都在SRAM内完成

重新计算:Mamba不保存大小为(B,L,D,N)的中间状态以避免内存爆炸。 然而中间状态对于向后传递计算新的梯度是必要,所以采用的方式是重新计算这些中间状态。

这么设计的原因是从HBM读取到SRAM的、A、B、C 和输出梯度的大小为 O(BLN + DN),并且输入梯度的大小也为O(BLN + DN),重新计算避免了从HBM读取O (BLND)的时间成本,这也意味着相对于读取写入,重新计算中间状态可以加速SSM的梯队传播。

内核融合:GPU复制数据的速度比计算操作的速度相对慢。为了让操作更快,Mamba融合CUDA内核生成自定义的CUDA内核,该内核依次执行操作,无需将中间结果复制到HBM(左图)。

最后以Mamba的架构图进行收官,希望读者看到山顶的太阳,留下的更是难忘的路途风景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Java基础揉碎]多线程基础

多线程基础 什么是程序, 进程 什么是线程 什么是单线程,多线程 并发, 并行的概念 单核cpu来回切换, 造成貌似同时执行多个任务, 就是并发; 在我们的电脑中可能同时存在并发和并行; 怎么查看自己电脑的cpu有几核 1.资源监视器查看 2.此电脑图标右键管理- 设备管理器- 处理器…

安防监控视频平台智能边缘分析一体机视频存储系统客流统计检测算法

智能边缘分析一体机的客流统计检测算法是一种基于人工智能与边缘计算技术的解决方案&#xff0c;专门设计用来实时、准确地统计通过特定区域的人流量。这项技术广泛应用于零售、交通、场馆管理、智慧城市等领域&#xff0c;以帮助管理者更好地理解顾客行为、优化资源配置、提升…

百度百舸 AIAK-LLM 的大模型训练和推理加速实践

本文整理自 4 月 16 日的 2024 百度 Create 大会的公开课分享《百舸 AIAK-LLM&#xff1a;大模型训练和推理加速实践》。 今天要分享的主题是 AI Infra 相关的内容&#xff0c;主要内容分为四部分。 首先和大家一起讨论大模型给基础设施带来的挑战。第二部分则是向大家介绍一个…

深度优先搜索汇总

常用英文 最近公共祖先&#xff08;Lowest Common Ancestor&#xff0c;简称LCA&#xff09; posterity&#xff0c;英语单词&#xff0c;主要用作名词&#xff0c;作名词时译为“子孙&#xff0c;后裔&#xff1b;后代”。 什么是深度优先搜索 深度优先搜索&#xff0c;D…

linux安装python3.8

一、卸载损坏的yum并安装 本来想直接下载安装python3.8,结果过程中损坏了yum,导致yum无法使用。 参考了【故障】6、yum不可用_yum命令无法使用-CSDN博客 1、删除python #删除现有的python rpm -qa|grep python|sudo xargs rpm -ev --allmatches --nodeps #强制删除已安装程…

tomcat--应用部署

tomcat根目录结构 Tomcat中默认网站根目录是/usr/local/apache-tomcat-8.5.100/webapps/在Tomcat的webapps目录中&#xff0c;有个非常特殊的目录ROOT&#xff0c;它就是网站默认根目录。将eshop解压后的文件放到这个/usr/local/apache-tomcat-8.5.100/webapps/ROOT中。bbs解压…

QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem

QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem&#xff0c;继上一章节讲过qt中如何编译freetype Qt编译和使用freetype矢量字库方法https://blog.csdn.net/wangningyu/article/details/138927379#QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览…

Vitis HLS 学习笔记--资源绑定-使用URAM(1)

目录 1. 简介 2. 代码分析 2.1 存储器代码 2.2 Implementation报告 2.3 存储器类型指定 2.4 存储器初始化 3. 总结 1. 简介 在博文《Vitis HLS 学习笔记--资源绑定-使用URAM-CSDN博客》中&#xff0c;介绍了如何在Vitis HLS环境下设计一个简易的存储器模型。 通过以下…

Spring Boot | SpringBoot 中 自定义 “用户授权管理“ : 自定义“用户访问控制“、自定义“用户登录控制“

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 ) :二、 自定义 "用户访问控制" ( 通过 "HttpSecurity类" 的 authorizeRequests( )方法来实现 "自定义用户访问控制" ) :1.基础项目文件准备2.实现 "自定义身份认…

初识C语言——第二十一天

猜数字小游戏的实现&#xff1a; 学会了之后可以自己制作彩票抽奖&#xff0c;哈哈&#xff01; 代码实现&#xff1a; #include <stdlib.h> #include <time.h>void menu()//无返回值函数 {printf("**************************\n");printf("****…

企业网站开发技术

随着互联网的快速发展&#xff0c;企业网站成为了企业宣传和推广的重要渠道之一。一个好的企业网站不仅可以提升企业的形象&#xff0c;还可以实现在线销售和客户服务等功能。那么&#xff0c;企业网站的开发技术有哪些呢&#xff1f;本文将从前端开发和后端开发两个方面进行讨…

三.使用HashiCorp Vault工具管理数据库

三.ubuntu安装使用HashiCorp Vault工具管理数据库 HashiCorp Vault 是一个基于身份的秘密和加密管理系统。机密是您想要严格控制访问的任何内容,例如 API 加密密钥、密码和证书。Vault 提供由身份验证和授权方法门控的加密服务。使用 Vault 的 UI、CLI 或 HTTP API,可以安全…

废品回收 小程序+APP功能介绍

基于您提供的废品回收应用的开发需求&#xff0c;以下是基于Uniapp&#xff08;用户端和回收员端&#xff09;、Thinkphp5&#xff08;后台&#xff09;、MySQL&#xff08;数据库&#xff09;的综合解决方案的概述。 一、技术栈选择 前端&#xff1a;Uniapp&#xff08;跨平…

51单片机入门:I2C通讯协议

I2C通讯协议 I2C简介 串口通信只能在两个设备之间进行&#xff0c;如果是三个设备相互通讯&#xff0c;那么每个设备需要两组串口&#xff0c;实际上是3组相互独立的串口通信。如果是4个设备相互通信就更加麻烦了&#xff0c;最突出的问题就是线路连接比较复杂。 为了解决这个…

请问空三前启动引擎,提示这个错误是什么情况?

答&#xff1a;在AppData-Local-GEngine目录下找到G3DEngineConfig.ini&#xff0c;检查ServerCheckCMD后面是否存在路径 &#xff0c;正常是为空&#xff0c;异常是为存在路径&#xff0c;需要清空该路径&#xff0c;然后重新启动引擎即可 重建大师是一款专为超大规模实景三维…

Python 提取PDF表格数据并保存到TXT文本或Excel文件

目录 安装Python库 Python提取PDF表格数据并保存到文本文档 Python提取PDF表格数据并保存到Excel文档 PDF文件常用于存储和共享各种类型的文档&#xff0c;这些文档可能包括大量的数据表格。通过提取这些PDF表格数据&#xff0c;我们可以将其导入到Excel、数据库或统计软件等…

基于openEuler22.03 LTS环境的容器项目实训——分布式微服务项目部署

一、说明 本文配置环境为VMware虚拟机&#xff08;4核CPU&#xff0c;8 GB内存&#xff0c;40GB磁盘&#xff09;&#xff0c;OS为openEuler 22.03 LTS &#xff0c;虚拟机要求能联网。 二、安装docker环境 2.1 安装docker相关软件包 [rootnode01 ~]# dnf -y install docker…

PCIE V3.0物理层协议学习笔记

一、说明 PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准&#xff0c;它原来的名称为“3GIO”&#xff0c;是由英特尔在2001年提出的&#xff0c;旨在替代旧的PCI&#xff0c;PCI-X和AGP总线标准。 PCIe属于高速串行点对点双通道高…

Ubuntu 安装 eclipse 的详细过程及工程创建和编译配置

目录 一、安装环境二、下载依赖 java jdk三、下载 eclipse四、安装4.1 java 环境4.2 eclipse 安装4.3 打开 eclipse 五、配置 eclipse5.1 新建 C 工程5.2 工具链 配置5.3 头文件路径5.4 链接库5.5 编译 一、安装环境 Ubuntu 版本&#xff1a;22.04.3 位数&#xff1a;64-bit 二…

其实解决问题的方法很简单

大家好&#xff01;我是编码小哥&#xff0c;欢迎关注&#xff0c;持续分享更多实用的编程经验和开发技巧&#xff0c;共同进步&#xff01; 本例是一个动态数组的例子&#xff0c;实现数据的增加、删除、根据索引修改数值、获取数值。 dynamic_array.c #include "dy…