本科总结下篇:HPC & LLM & Neuromorphic 杂谈

chensy 发布于 2025-08-31 203 次阅读


本篇写于八月中上旬在甘肃、青海一带旅行的途中,首发于知乎。中国真的是地大物博,甘肃青海一带每两个目的地的距离都在百公里以上,一天有一半的时间在坐车。本篇就是车上写的。


写了一半草稿被删了,哈哈.jpg

虽然很早就立下了下篇的 flag,但是果然还是拖了两个月。现在趁着在长途的车上,进行一个填坑。

本篇是 cs 相关的杂谈。如果读者的关注点与标题上的一些方向相关,并且愿意听一听笔者在本科期间对此产生的看法,或许可以继续往下看笔者发电。

下文中出现的现象包括且不限于:中英混杂,百家杂学,前言不搭后语。读者也可以视每一节的标题,挑着感兴趣的看。

笔者毕竟见识浅薄,见解若有不周,欢迎批评指正。

HPC

如上篇中所说,笔者最开始接触 HPC 是在大一校内超算队选拔的时候。最初的想法是觉得做优化题刷 speedup 挺好玩的,外加想锻炼一些技术,就在队里待了两年左右。这段时间很难说对 HPC 产生了什么深刻见解,倒是成长成了 linux 批,学了不少奇技淫巧。

我认识 HPC 的方式就是打比赛。HPC 赛事的题目大致就是科学计算和深度学习,彼时 ChatGPT 还没出现,LLM 相关的优化还不多,笔者本人接触的也是科学计算居多。大部分的优化问题最后都归结于计算和通信的权衡,毕竟一般而论可并行的计算时间总是能通过增加核心数进行缩短,直到通信时间占据半壁江山为止。因此很多有效优化实际上都来自通信和计算的 overlap,比如算法上的 double buffer,系统上的 GPUDirect/DMA/RDMA,等等。如果优化只涉及到单节点上的 CPU 计算,或者单节点的众核架构(e.g. 申威),很多时候问题就归结于访存的优化(某种意义上也是计算和通信的权衡)。

在打了两年比赛之后,笔者最后还是觉得 HPC 的工程成分太多了。我并不是认为 cs 中的工程实践没有科学性,一般系统性的优化还是很具有研究性质的。问题在于,当一个优化问题追求极致优化的时候,优化手段就逐渐变得并行框架相关/特定硬件相关,从而逐渐转变为纯粹的工程问题。笔者遇到的最典型的一次是 ISC SCC 24 的 coding challenge。ISC 24 的 coding challenge 给了一个科学计算系统的子模块的串行版本,要求是只使用 OpenMP GPU Offload,移植到 GPU 上。当时我们基本上已经优化到极限的状态,数据从 CPU 上搬到 GPU 上再搬回来就结束了,计算的占比基本忽略不计。然而 presentation 的时候被赛方驳回了一项优化,原因是笔者使用了 cuda prefetch api。赛方的理由是只允许调用 OpenMP 的接口,这样方便在不同的 GPU 上进行 portable 的实现。但我寻思一个 prefetch 也不影响算法的逻辑,再者 OpenMP GPU Offload 基本就没有实现 prefetch 的功能,要是有这个接口的话我早就用了。OpenMP GPU Offload 的实现基本是一坨史,不同编译器实现得还不一致,gnu gcc 实现的版本甚至计算通信 overlap 都做不到。类似的例子比比皆是,甚至 ISC 25 换汤不换药,baseline 都没换,就只是把要求改成了 std::par 而已。另一方面,在 LLM 崛起之后,优化的热点开始转向 LLM training/inference,这个趋势就更加明显;LLM 优化还要与特定模型架构相关,因为 LLM 优化基本上就是 Transformer 的优化。这也是必然的,极致的优化必然导致算法的特殊化。我并不是说这是一件坏事,只是笔者还是更喜欢纯粹的算法,因此就没有在这个领域深究下去。

其实从更现实的角度来说,不在这个方向上继续深造还有更重要的理由,那就是我认为类似的事情应该在工业界做,而不是在学术界做。比如 LLM training/inference,工业界既有动力也有实力来做这样的事,笔者不认为高校对此有什么优势。能够做这些事的高校和院所,(在笔者了解的范围内)大多也是借助企业的计算资源完成的。既然选择深造,笔者还是希望能做一些更有研究性/探索性的事情,或者说学术意义上有潜力但工业界暂时不感兴趣的事情。虽然至少到目前为止,我还是觉得这是一件很困难的事情。在泛 cs 的范围内,我认为高校相比工业界有什么优势都很难回答的问题。

后来的事情读者从标题里也知道了,笔者到 neuromorphic 相关的方向去了。

“Algorithm”

虽然笔者自认为是做算法的,但“算法”实际上是一个很广泛的词;做硬件的老师常有“你们做算法的太卷了”类似言论,但算法和算法亦有区别。林子大了什么鸟都有,deep learning 的林子可太大了。笔者曾有一次和群友讨论一篇何恺明的文章,一个在 CAD 实验室做应用的群友问曰何恺明是谁,是你的导师吗?遂绷。但如果非要问此人是不是做算法的,笔者也只能回答,是,而且还发过顶会。整个 deep learning,下至 mlsys,推理优化,中至模型架构,训练算法,上至拿预训练模型做应用,哪一个不是算法?

不过不管哪个方向都卷得没边,这倒是真的。

笔者的兴趣在于架构和训练算法。这里笔者想提到一个观点,即在这个时代架构其实已经不重要,只要数据够好,大力出奇迹就可以了。架构真没用了吗?笔者对此的理解是,所谓大力出奇迹指的是我们能够把广泛的世界知识压缩到各种各样的模型里。毕竟 Transformer 的大头也还是 MLP,这种意义上架构确实不那么重要。但事实上架构还包括了推理时行为;比如,一个 Transformer 和一个最简单的 Linear Transformer,它们的权重形状大小可以完全一致,但它们在推理时甚至连复杂度都不相同。在这个视角下,架构需要做的事情还有很多。

Brain-Inspired != Neuromorphic != SNN

很显然,neuromorphic 的方向上工业界确实没什么兴趣。那么,它真的有学术意义上的潜力吗?

其实我并不太想用 neuromorphic 这个词,因为这个词通常意味着在硬件层面上对神经元结构进行模仿,而我(至少目前)与此并不高度相关。

机器对于人类智能,或者说脑的借鉴和模仿存在不同的层次。广义上,这些所有能扯得上边的算法都在类脑/脑启发(brain-inspired)的范围内。比如,所谓的 system 1 和 system 2 的区别,各类 CoT,广义上都是对人类智能的行为级模仿;基于 hebb rule 的 linear transformer,甚至于 transformer 本身(softmax attention 本身是 exponential kernel 下 hebb rule 的体现),都可以算是对脑的机制级别模仿。只有将模仿的级别限定在神经元级别,才在神经拟态(neuromorphic)的范围之内。传统意义下,神经元级别的模仿指的就是 SNN,即脉冲神经网络。行为级别的模仿很少自诩为 brain-inspired 范畴。机制级别的模仿可能是目前最多样化的一条道路,笔者认为液态神经网络,(连续)吸引子网络,甚至于现代 RNN(建立于 hebb/delta rule 之上的)基本上都属于这个范畴。而最后,最传统的神经元级别的模仿(如果指的是 SNN 的话)反而面临着众所周知的困难。这也是笔者从开始接触 SNN 开始困扰了将近两年的疑惑。

SNN sucks?

笔者最开始接触 SNN 时正值 Spiking Transformer 兴起的时期。至少现在我认为接触这个领域是一个很糟糕的决定。所谓 Spiking Transformer 基本上就是将 Transformer 中的激活值二值化,然后进行各类魔改,比如加入各类卷积结构,改造 attention,刷榜。重要的是,这类结构到目前为止一直是纸上谈兵。Transformer 本身并不是一个严格的神经网络,因为 attention 中抽象不出神经元和权重的结构,和卷积不同。attention 一般意义上不能部署于神经形态芯片上(笔者并不精通硬件,但曾经这样问过做 neuromorphic 硬件的老伯,得到的回答是不行)。实际上并不是没有人尝试过将类似的结构进行硬件实现,但实现的架构往往和算法的发展相去甚远,很明显是硬件和算法各玩各的。这使当时的我被迫开始思考一个问题,这类模型到底有什么用?或者更宽泛一些,SNN 到底有什么用?

SNN 的 paper 中往往用低功耗和边缘计算来回答这个问题。第一个方面,这个回答本身其实并没有什么说服力。其一,SNN 的 paper 中估算的从来都是计算带来的功耗,事实上存储带来的功耗可能更加严重。其二,这些 paper 中比较的对象往往是未量化的 ANN 在 GPU 上的开销,量化后的 ANN 在专用硬件(比如 FPGA 上)往往也能够 claim 较低的功耗;甚至在 GPU 上,ANN 的开销也未必有那么高。笔者曾经见过一篇 paper 估算 GPU 上进行一次单目非线性操作(e.g. GELU)需要 70 flops,但事实上 cuda fast math 对常见的非线性操作有内置的 intrinsic,这些 intrinsic 的实现方式应该分段线性拟合,分段的端点用查表的形式存储,70 flops 应该是严重的高估。更进一步,就算 SNN 的实际功耗能够更低,那究竟是什么场景下需要这么低的功耗?这必要吗?又或者说,这重要吗?笔者有一个从华为顺来的 orange pi,也用过装了 neuromorphic chip 的单片机,都算是边缘计算设备。说实话两者的架构并没有差太多,neuromorphic chip 实际上作为一个 accelerator 存在,它的外围还是要有一套标准的设备支持,比如 cpu,memory,disk 这些东西。如果看整机功耗,很难说实际上能省多少。可惜当时没来得及买一个功率计,否则就实测一下了。

第二个方面或许更重要一些。笔者曾经和一位物理出身的同门大伯讨论过这个疑问,他说,SNN 就像物理里面的超导材料一样。物理学界对超导材料有诸多讨论,实际上用得最多的场景是风力发电机的轴承,因为超导材料普遍耐磨(转述,可能不完全严谨)。对脑进行任何级别的模仿,具体到对于神经元级别的模仿,原始的目的是对智能系统产生更深刻的理解,产生更智能的网络,实际上被用来省电。在这个意义上,低功耗叙事本身就是有问题的。当然,这个方面上或许可以认为 SNN 仅仅是脱胎于神经科学,但并没有在后续的发展中继续遵循神经科学的原理,本身就只是一个面向低功耗的范式。现代追求短时间步的 SNN 实际上就是这样,过短的时间步实际上已经失去生物合理性了。但在这种视角下, brain-inspired 的叙事基本上已经不成立了。况且这种视角目前也很难回答第一个问题,笔者认为这个路线上的 SNN 对比常规的网络轻量化路线很难体现出什么优势,甚至于 SNN 本身就是一种量化和稀疏化。笔者第一次了解 ANN2SNN 的时候看得五感杂陈,我很少用既优雅又乏味来形容一种算法()。ANN2SNN 揭示了 SNN 在极度简化的情形下与量化的等价性,事实上一般常用的神经元动力学也没有比这种情形复杂多少。

借用一位学长的观点,短时间步的 SNN 路线实际上就是更细粒度的网络稀疏化,即 bit 级别的稀疏化。现代的 deep learning 架构确实有稀疏化的趋势,比如 MoE,是网络结构上粗粒度的稀疏化;各类 dynamic sparse attention,比如 NSA,MoBA。流行的稀疏化策略往往是块级的,因为在常规的加速器上必须考虑访存的 locality。再细一个粒度有神经元级别的稀疏化,比如 ReLU 主导的网络下的稀疏性,或者非规则剪枝导致的稀疏性之类。经典 SNN 的稀疏度应该视为神经元级甚至以下。所以在这个意义下,笔者认为 SNN 至多和主流网络轻量化路线殊途同归,即逐渐舍弃传统 SNN 中不利于计算和训练的部分,成为一种网络轻量化的手段。

回到最原始的动机,SNN 的理论框架实际上在流行的神经网络框架之上增加了两个部分,其一是动力学(或者说 recurrent 连接),其二是脉冲发放。前者主导了网络的动力学性质,后者主导了事件驱动、稀疏化的特征。与轻量化路线的同化事实上是忽视动力学的结果:如果严格遵循二值化的约束,就必然通过时间步来达到足够的精度,从而倾向于量化;如果放松二值化的约束,就发展为非结构化稀疏的一种。另一方面,如果放弃脉冲发放的约束,只保留动力学,就成为 RNN 的一种,实际上回归到机制层面上的对脑的模仿。笔者个人认为后者蕴含的潜在可能性更广阔,因为动力学始终具有更深厚的理论和实践背景。动力学既可以视为控制的 dynamic system,也可以视为 online learning,又或者视作数学上的 ODE/SDE,从而借鉴 numerical analysis 中的理论,甚至能够确实从神经科学中得到 plasticity 上的支持(hebb/hopfield)。现在已经有文章开始 claim SNN=ANN+Dynamics,也就是倒向动力学的一侧。

所以,回到最开始的问题:SNN sucks?我认为这取决于对 SNN/neuromorphic 的限定范围。如果一定要求同时保留动力学和脉冲性,笔者认为仅保留理论上的潜力。或许终极的网络范式会发展成既有动力学性质又高度稀疏的形态,但笔者不认为现在就能够通过 spiking neuron 的约束端到端地做到这一点;又或者在某种机缘巧合下能够做到,但笔者至少不认为这是符合发展规律的轨迹,这就好像要求在 RNN 为主的时代发展出完备的 linear attention 体系一样,有种要在蒙德城里唱还魂诗的感觉(?)。如果完全放松二值约束,动力学的潜力是无可置疑的,只不过相关的 research 未必会打上 brain-inspired 的 tag。而对于更普遍的现状,即进一步作茧自缚放弃动力学的特征,笔者个人认为这就只能和量化殊途同归,并且不是一种优雅的方式。此外,这还取决于一个条件,那就是硬件。

hardware?

此处稍微叠一个甲,笔者并不精通硬件,只是根据本人的经验进行论述和评价。

neuromorphic 研究中经常 claim 的另一个点是软硬件协同设计。这一点则更加微妙,甚至可以说硬件上的 neuromorphic 和算法上的 neuromorphic 在目标上本身就有所分歧。

neuromorphic 的原则,即存算一体、事件驱动、异步计算,虽然是对算法和硬件的协同要求,但本质的动机是对硬件的要求。这些原则名义上来自神经系统的计算范式,但实际上的实现中体现为对传统冯氏架构的背离;存算一体对应于存算分离和内存墙,异步计算对应于传统处理器的同步时钟,事件驱动(或者稀疏计算)不知道怎么描述,读者自己体会吧(x)。而在硬件侧,笔者拙见,与传统冯氏架构最显著的区别是存算一体。如果读者还能 callback 到前文的内容,可能会发现 HPC 中的优化问题最终都归结为计算和数据移动之间的 balance,即存算分离带来的权衡;要抹除推理时数据移动带来的一系列优化问题,就必须把存储单元移动到更靠近计算单元的地方。所以读者可以发现典型的 neuromorphic chip 区别于流行的加速器(TPU,NPU,etc.)最显著的特征就是更彻底的存内/近存架构,实际上表现出分布式内存的众核架构特征。其实对应的体系优化问题并不是被消除了,而是转移到编译的过程上去了;统一存储的情况下不需要考虑什么数据存储到什么地方,但分布式存储需要,某种意义上是把优化从 just-in-time 的位置转移到了 ahead-of-time 的位置(可能不是一个很恰当的比喻)。至于剩下的两个特征,笔者认为不是非要对冯氏架构进行大刀阔斧的改变才能实现。论稀疏性,GPU 上也有 GEMM 和 spGEMM 的区别;论异步性,其实可以有很多程度的异步特征,有些甚至是算法层面决定的,与硬件的关系不是那么大。比如,batched inference 和 in-flight batching 相比,后者算不算有一定的异步性?笔者觉得也算吧。其实这些特征都不是绝对性的、非黑即白的,比如 CUDA 架构下的 shared memory 有没有近存的性质?什么样的计算才能够算作 process in memory,memristor 肯定是算的,那么在 ALU 旁边多加一块 buffer 算不算?

所以,硬件上的 neuromorphic 原则叙事上脱胎于神经系统的物理组织形态,实际上发展为以近存计算架构为主的一种范式。这实际上与算法的发展大同小异;基础的形态(叙事上)从神经系统中得到,从这些形态中抽象出更本质的原则,然后以这些原则为基础,以利于计算为目的,逐渐发展为偏离所谓生物合理性、对计算更加友好的形态。这些抽象出的原则对算法而言是动力学和二值性(或者放松为稀疏性),对硬件而言是存算一体,附带事件驱动和异步计算的性质。至此读者可以看到,算法和硬件发展的原则并不完全一致。事实上,这些硬件上的原则从来没有要求算法有动力学性质,也没有要求算法具有二值性。即使一个算法不具有任何动力学性质,也没有二值性,它也可以符合硬件上对 neuromorphic 的原则要求。再说得明白一些,neuromorphic 的硬件原则从未要求算法呈现为 SNN 的形式,也从未要求硬件设计为针对 SNN 的形式。 从发展的方向来看,算法上倾向于放松二值约束,发展为(稀疏的)动力学网络;硬件上,借用 THU 邓磊老师的观点,倾向于继续向 local memory 的众核架构发展。这两者未必是同一条道路,神经科学对于硬件上设计非冯架构和对于算法上探索更先进的智能形态的启发本身就是不相同的。因此,笔者才会在这一节的开始提出这样的论断。

The Hardware Lottery

当然,并不是说算法与硬件的发展完全南辕北辙。如果目标不是颠覆冯氏架构和智能范式,即不是以计算科学为目标,或许就两说。neuromorphic hardware 经常 claim 能够用于脑模拟,笔者对脑模拟基本是完全不了解,但笔者对脑模拟是否真的需要并且也真的能够用上特化的硬件设计抱有疑问。另一种可能性即为笔者在前两节中提到的,不惜牺牲动力学特性也要保持二值特征,希望在特化的硬件上与网络轻量化路线竞争。

在科学的角度上,笔者在前文中已经提到观点,即确实保留理论上更稀疏的可能性,但是对必要性和理论美观度保持怀疑。在这一节中,我希望从科学史的角度来讨论这个问题。

本节标题取自同名文章,里面对于 deep learning 的宏观现状有很好的阐述,笔者强烈安利。作者的核心观点是,在逻辑上,硬件的发展应该跟随算法的变化。我们发现了有潜力的算法,所以需要能够快速执行它的硬件,算法为因,硬件为果。但在现实中,这一关系实际上被颠倒。考虑到现实因素,硬件发展的成本比软件高得多,硬件厂商往往选择保守的策略,针对成熟的算法设计硬件;但同时,如果没有合适的硬件,具有潜力的算法可能根本不会发展起来。这导致流行的算法往往是能够适应当前硬件的算法,而不是在理论性质上更优的算法。这种因果关系的倒置阻碍了算法的发展。这就是所谓的硬件彩票(hardware lottery):在现实中,硬件往往是决定性的,只有吃上了硬件红利的算法才能流行起来。

这是一种宽泛的说法,实际上指的就是 GPU。deep learning 能够跑在 GPU 上更像是一种巧合;相传在上世纪,代表连接主义的神经网络被打压,停留在实验室中。彼时并不是没有人试图为神经网络制造专用的 accelerator,Lenet-5 在上世纪九十年代就有了,而在那十几年间并没有什么出名的加速器,直到本世纪初才有先驱者开始尝试使用 GPU 进行训练,AlexNet 更是再过了十几年之后的事情了。deep learning 靠上 GPU 大山的过程更像是,早期的研究者偶然看到 GPU 这个打游戏的玩意,诶 ,好像拿来做计算还挺合适的。逐渐就有一批人开始建设相关的生态,后来就有了 CUDA,有了 deep learning 的繁荣。这似乎是一种历史的偶然。如果 GPU 没有出现,适合 deep learning 的计算设备一定会出现吗?笔者觉得未必。GPU 为 deep learning 提供的实际上是基础的硬件和基础的生态,这些条件很难在学术界产生。即使提供了硬件的原型,建立起一定的社区和生态也是困难的。从这个角度来看,GPU 用于计算似乎没有历史的必然性。

所以,从科学史的角度出发,企图从神经形态硬件出发重新建立从硬件到算法的秩序在现实因素上是困难的,就像上世纪的神经网络加速器并未从神经网络本身出发得到成功的发展一样。况且驱动社区发展需要潜在的动力。神经网络本身发展于符号主义的瓶颈时期,至少也具有分布式表征的潜在优势(再叠个甲,笔者对科学史也并不非常了解,可能也有历史马后炮之嫌)。现在正是 LLM 和 scaling 魔法高歌猛进之时,社区里有多少人 care 功耗这件事?退一万步,轻量化和边缘推理并非没有代价更小的替代品,关注一条颠覆性路线的人可能就更少了。出于这个原因,笔者也不认为通过 neuromorphic 生态与常规轻量化路线竞争在现实因素上是个好主意。

抛开 neuromorphic 不谈,GPU 及其生态对 deep learning 的发展也并非没有副作用,这也是 The Hardware Lottery 本身讨论的问题。事实上,这篇文章发表的时代尚没有发展到 attention is all you need 的程度,不知道作者现在对此作何感想。GPU 及其生态确实对模型的类型产生了隐性的约束;一个例子是 linear attention,GPU 上的优化高度依赖于 tensor core,这使得以 deltanet 为代表的 chunkwise parallelism 必须放弃天然线性的算法复杂度,转而使用更复杂的 chunk 形式以求利用 tensor core,形成复杂度更高的算法反而跑得更快的奇观。另一个例子还是 linear attention。笔者研究 linear attention 也有大半年时间了,上来别的先不干,先是框框写 Triton kernel。如果说 tensor core 只是锦上添花,不通过手写 kernel 基本上就无法在 pytorch 上得到合理的性能,就 RNN 而言是循环内频繁的 kernel launch 导致的。不过话不能说太死,pytorch 2.8 已经开始支持 condition operator 了,或许 compile 之后会有好一些的性能。不过目前笔者对此不抱太大希望,感觉最多也就是达到 jax 级别的性能,jax 的效率比 triton 还是要差上几倍,很难说是一个可用的性能。举这些例子并不是抱怨框架不好使(?可能吧,至少 triton 已经比 cuda c 好使多了),而是说在现有的硬件和生态下,一些算法的实现容易程度和运行效率要比另一些差得多,从而影响到算法发展的倾向。


好像差不多写完了,又不知道怎么结束了。现在看看也不知道这篇写了个什么东西,如果读者能坚持看到这里,相信你做什么都会成功的(?)。祝各位看得开心,也祝自己博士阶段学习顺利。

此作者没有提供个人介绍。
最后更新于 2025-08-31