ARM 架构深度学习推理指令集的演进与技术范式分析报告
ARM 架构深度学习推理指令集的演进与技术范式分析报告在现代计算架构的演进过程中,ARM 架构已从最初的嵌入式低功耗设计,逐步成长为覆盖移动端、数据中心、超级计算机以及边缘计算的全能型架构。这一转型的核心驱动力之一,便是为了应对深度学习(Deep Learning)和人工智能(AI)推理任务对计算效率、算力密度以及能效比的极致追求。从最初的通用向量扩展 NEON,到专为量化计算设计的 DotProd 和 I8MM,再到代表未来高性能计算范式的可伸缩矢量扩展(SVE)与可伸缩矩阵扩展(SME),ARM 指令集架构(ISA)的演变深刻地反映了计算范式从标量向向量,再由向量向矩阵的重大跃迁 。 第一章 ARM 深度学习指令集的历史演进脉络ARM 架构的深度学习推理能力并非一蹴而就,而是伴随着 ARMv7 到 ARMv9 的架构更迭,经历了数个关键的技术周期。 1.1 初期探索:NEON 与通用 SIMD 时代在深度学习爆发之前,多媒体处理、图形渲染和音频编解码是并行计算的主要需求。2011年,ARM 在 ARMv7-A 架构中正式引入了 Advanced SIMD 技术,即 NEON ...
软件工程中的 SOLID 原则
在软件工程中,SOLID原则就像是建筑工程中的力学规范。它们不是硬性的语法规定,而是为了解决软件开发中最为头疼的问题:代码的腐化(Code Rot)。当你的代码变得难以维护、改一处坏十处、或者无法测试时,通常是因为违背了这些原则。 下面我们就逐一拆解这五个核心原则。 单一职责原则和接口隔离原则:如何划分模块和接口,即保持简单精细 里式替换原则和依赖倒置原则:设计类与类之间的关系,面向抽象和多态 开闭原则:最终的设计目标,易于拓展的软件架构 S - 单一职责原则 (SRP) 出发点:一个类应该只有一个引起它变化的原因。 解决问题:高耦合。如果一个类承担了太多的功能(比如既处理数据逻辑,又处理文件保存),那么当保存格式变化时,可能会无意中破坏数据逻辑的代码。 核心痛点:如果你在 Employee 类里既写薪水计算,又写 HTML 报表生成,那么当财务规则改变或 UI 风格改变时,你都得去改同一个文件,这会大大增加回归测试的压力。 个人理解:SRP 告诉我们如果类写得太大的话,我们应该如何拆分这个类 / 函数。与之相关的一个实践是,函数最好能够被一个屏幕放下。 ...
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 指宽 后视镜点位上面的两点都是为了【点位】这个概念服务的。