Chunkwise 并行算法 —— 线性注意力
为了在现代硬件上实现高效训练,Mamba2 和 DeltaNet 都通过分块并行(Chunkwise Parallel)策略将 $O(L)$ 的线性递归改写为矩阵迭代形式。这种变换的核心思想是将长序列划分为大小为 $C$ 的块,利用矩阵乘法(Matmul)处理块内计算,通过隐藏状态传递块间信息。 1. Mamba2:状态空间二元性(SSD)的矩阵迭代推导Mamba2 的核心贡献在于证明了选择性 SSM 实际上等价于一种带有特殊掩码的线性注意力机制。 1.1 从递归到块内状态展开Mamba2 的状态更新公式(矩阵形式)为: $$S_t = \alpha_t S_{t-1} + v_t k_t^T \in \mathbb{R}^{d_v \times d_k}, \quad o_t = S_t q_t \in \mathbb{R}^{d_v}$$ 其中 $\alpha_t \in (0,1)$ 是数据相关的衰减因子。定义 $\gamma_j = \prod_{i=1}^j \alpha_i$ 为全局累积衰减,是一个标量因子。 如果只考虑端侧 C...
Gated Delta Net
门控增量网络(Gated Delta Network)的技术原理、性能优势与工业应用综述随着大语言模型(LLM)在长文本处理、多轮对话以及复杂指令遵循等任务中的广泛应用,传统 Transformer 架构所面临的计算挑战日益凸显。自注意力机制(Self-Attention)的计算复杂度与内存占用随序列长度 $L$ 呈二次方增长($O(L^2)$),这一“效率之墙”严重制约了模型处理超长上下文的能力 。为了突破这一瓶颈,研究界探索了多种亚线性复杂度的替代方案,其中门控增量网络(Gated Delta Network,简称 GDN 或 Gated DeltaNet)作为线性 Transformer 的演进版本,凭借其在记忆精确度与硬件效率之间的卓越平衡,正逐渐成为新一代长文本模型的核心技术 。 第一部分:Gated Delta Network 的核心原理与理论演进GDN 的设计灵感源于对现有线性递归模型局限性的深度审视。在线性 Transformer 的语境下,模型通常被视为一种基于外积的键值关联记忆(Outer-product-based key-value associative...
search-api-summary
搜索 API 价格汇总 API 免费额度 收费额度 其它 serpapi 250 次调用/月 高级版 1000 次调用/$25/月 API 汇总较多 grounding-bing ❌ $14/1000次调用 bing-search-api 已经停用,目前使用 grounding with bing 提供服务 百度智能云·千帆平台 100次调用/天 ¥36/1000次调用 优先扣除免费额度,每天最多调用 100’000 次(3600 元) 腾讯云 ❌ ¥30/1000次调用 高级版 ¥46/1000次调用,基于搜狗搜索引擎 智谱搜索API ❌ ¥10/1000次调用 pro 版 ¥30,pro_sougou 版 ¥50。支持意图分析,融合大模型分析选择到搜索结果中 夸克搜索 ❌ ≥ ¥25 似乎只有对公服务,而且页面有点奇葩,销售感很重 阿里云 IQS 搜索服务 试用 1000次 / 15天 ¥42/1000次调用 仅有试用版 博查搜索...
在 RKNN2 中将 ViT 的卷积层转换为矩阵乘法
背景在上一篇 将 ViT 的第一个卷积层转为 MatMul,要求步长和卷积核相等 中,我们介绍了如何将 ViT 的第一层卷积转换为矩阵乘法。在这篇文章中,我们将讨论这种变化在 RKNN2 工具链里带来的性能收益。 测试 模型 设备 输入尺寸 平均推理时间 (ms) 卷积层 Apple M4-CPU 1x3x384x384 3.32 ± 0.50 Cortex A57-CPU 1x3x384x384 TBD RKNN 1x3x384x384 TBD 将卷积层转为线性层 Apple M4-CPU 1x576x768 2.82 ± 0.43 Cortex A57-CPU 1x576x768 TBD RKNN 1x576x768 TBD 其他代码见 GitHub。
bfloat16 精度损失(II)
在上一篇 记一个关于 RMSNorm 实现上的细节 中,我们讨论了 LayerNorm 和 RMSNorm 使用 float16 格式会导致的数值溢出问题,而 bfloat16 由于数值范围较大,通常不会出现溢出问题。那么本文我们讨论 bfloat16 较之于 float16,由于数据舍入而带来的精度损失问题。 浮点数表示方式浮点数的表示方式是通过科学计数法来表示一个实数。float16 和 bfloat16 都是浮点数格式,但它们的精度和范围不同,具体比特划分如下。 比特位 float16 bfloat16 符号位 1 1 指数位 5 8 尾数位 10 7 max 65504 3.38953e+38 min 6.10351e-05 1.17549e-38 resolution 0.001 0.01 可以看到,bfloat16 在指数位上使用了 8 位,而 float16 只使用了 5 位,这使得 bfloat16 在表示更大范围的数值时更加灵活。但是 bfloat16 的尾数位更短,相比于 float16,它在进行数值运算时会引入更多的舍入...
记一个 Tokenizers 版本兼容性问题
表现当使用较低版本的 tokenizers 库加载版本较高的 tokenizer.json 时,会出现低版本不兼容高版本 tokenizer.json 的问题。代码如下: 12345678910111213141516171819202122232425262728import jsonfrom huggingface_hub import hf_hub_downloadimport tokenizersfrom tokenizers import Tokenizerprint(f"{tokenizers.__version__ = }")def load_tokenizer_and_transformers_version(model_id): tokenizer_filepath = hf_hub_download(repo_id=model_id, filename="tokenizer.json") try: tokenizer = Tokenizer.from_file(tokeniz...
GCC 中的 whole-archive 参数解析
本文由 AI 加提示词大纲生成 提示词如下: 帮我写一篇博客,介绍 gcc 中的 whole-archive 这个参数,顺序如下: 背景:使用全局变量动态注册类到 RegisterFactory 中的时候,发现这个库打包为静态库时,可执行文件去链接这个静态库,会出现未注册成功的情况 表现:1、保存注册结果的 map 大小为 0;2、文件非常小,仅有十几KB,看起来并不包含整个静态库;3、访问空指针时会导致段错误;4、使用动态链接库时没有问题 原因:当全局参数被注册在静态库中时,如果这个静态库被链接,会导致静态库中的全局参数被优化掉了,也就没有注册成功 解决方案:使用 -Wl,--whole-archive lib -Wl,--no-whole-archive 使得链接器在链接时不要优化掉全局参数 在使用全局变量动态注册类到 RegisterFactory 时,常常会遇到这样一个问题:当库打包为静态库后,最终生成的可执行文件链接这个静态库,却无法正常注册。这篇文章将详细介绍这一问题的背景、表现、原因以及解决方案。 1. 背景在很多项目中,我们会在全局作用域中注册类到工厂(R...
科目二考试 - 00
科目二考试有关科目二的一些信息和内容分享。 一般来说,科目二教练在开始练习时让学员最先做的两件事就是:调整座椅和后视镜。这两件事其实都是为了点位这个概念服务的。 至于为什么需要【点位】?原因还是科目二考试需要一次性倒车入库成功,中间不可以换挡,例如从倒车档换成前进档,如果发生换挡,这次考试就挂了。为了方便教学,总结出了点位这个概念。 在座椅确定之后,空间位置就确定了。在这种情况下,记住在何时倒车、何时回正方向盘,就可以一把实现倒车入库了。所以,点位其实就是时间点在车辆空间中的位置。 座椅 座椅的调整是为了确定 3D 空间中的位置,用 3 个距离来描述我们的坐姿,从而在考试的时候复现这个位置。3 个距离如下: 大拇指:手臂水平伸直,大拇指的根部位于仪表盘罩上 头顶:头顶距离车顶 4 指高(一拳) 膝盖:距离前方 3 指宽 后视镜点位上面的两点都是为了【点位】这个概念服务的。
记一个关于 RMSNorm 实现上的细节
背景在 RMSNorm 的实现中,都会强制把输入转为 float32 再进行计算,主要为了避免在计算过程中出现溢出的情况,特别是 float16。 bfloat16 由于动态范围更大,通常不会出现溢出问题,但在一些特定的计算场景下,仍然可能会遇到精度问题。因此,在实现 RMSNorm 时,强制转换为 float32 是一个通用的做法。 RMSNorm123456789101112131415import torchimport torch.nn as nnclass RMSNorm(nn.Module): def __init__(self, dim, eps=1e-8): super(RMSNorm, self).__init__() self.weight = nn.Parameter(torch.ones(dim)) self.eps = eps def forward(self, x): # 强制转换为 float32 x = x.to(torch.float32) # 计算 ...
Qwen2.5-VL 中视觉模型的窗口注意力机制
背景在算能的 LLM-TPU 里有对 Qwen2.5-VL 视觉模型的导出,但是并没有增加对窗口注意力的支持,因此跟 Qwen2.5-VL 原生相比,性能下降较大。 UPDATE: 算能官方已经支持 qwen2.5-vl 的窗口注意力,具体实现参考 tpu-mlir/llm。 qwen2.5-vl 视觉编码器的注意力机制qwen2.5-vl 中有两种不同的注意力机制: 全局注意力:用于处理全图特征,但是计算量较大,计算量增长随着图像尺寸的增加而呈平方增长,因此只在 4 个特殊的 layer 使用。 窗口注意力:只计算局部区域的注意力,计算量较小,适用于大多数层。 qwen2.5-vl 的视觉编码器注意力计算如下: 1234567891011121314151617181920212223class Qwen2_5_VLVisionFlashAttention2(nn.Module): ... def forward( self, hidden_states: torch.Tensor, cu_seqlens: t...