【构想】利用FPGA构造接入大内存以缓解显存不足

如题所示。

我们知道,现在很多显卡的显存都只有十几个G,最强的A100不过60个G。这当中自然有构造适合GPU快存取的显存特性的限制问题。但是我觉得,显存的限制还是一个问题,特别对于那种或许不是很吃计算速度,但是展开来一定很吃内存的模型。

因此我在想,能不能用FPGA+一个很大的内存来代替高端大显存的显卡呢?特别是对于那些明显感到顶级显卡经济压力的情况。据我的了解,FPGA 虽然运算速度比不过高端显卡,但是对于矩阵的运算,在设计合适的情况下常常比CPU要强。

当然,FPGA 本身是可编程硬件,要实现这个构想就得有懂硬件设计的人员(要懂Verilog,vHDL 一类的语言)。这个要求已经不低了,弄完这一步还得让FPGA能够运行CUDA,这也是很贴近硬件的底层编程。

但是,我觉得这个想法是有价值的。首先,FPGA 确实比CPU更适合这种简单任务的运行。其次,FPGA 功耗的效率高,这一点比CPU强。再次,既然涉及到硬件,肯定有办法偶联多个FPGA完成任务,就像显卡的多核心一样;CPU这样偶联没有意义,计算速度损耗还大。最后,通盘来考虑FPGA的应用,它还能应用于一些CPU和GPU都无法应用的使用场合(例如:随身的本地AI助手盒子)。

总结一下就是:1、FPGA 比CPU更加适用大规模简单计算的任务;2、FPGA 更有可改造性,可以偶联多个,也可以接入比显存大得多的内存;3、FPGA 功耗效率高;4、FPGA 基于其可改造性的特征,还可以用于随身AI盒子一类的专门用途,避免庞大的显卡和其他装置。

1 个赞

和这个的想法有点像诶

感觉这个想法在固定模型的推理阶段是成立的,推理阶段甚至可以不使用内存,直接用电路一口气计算到底。但是如果涉及到要访问内存的场景,比如训练场景,可能这套方案的访问内存效率会比不上现有的NVIDIA显卡(或者是要追上现有显卡需要消耗大量的研发成本)

(当然,训练阶段也许可以不用内存一口气计算完,就像PyTorch Inductor那样,提前把包含前向传播和反向传播的计算图都算出来,形成一个joint graph,然后直接用梯度节点来更新参数,但是这个可能就会更复杂了)

这个想法落地的最大难点应该还是成本,光是适配CUDA生态的工作量就已经是不可小觑的了,可能得需要一个大型公司才会有能力完成这种级别的研发(可以参考一下华为Ascend计算卡,软件生态现在还有一堆BUG,这种后期BUG收敛的工作量可能远大于前期搭建平台)。

不过我个人还是很期待能见到在这个方向第一个吃螃蟹的勇士的,这很可能是实现端侧大模型推理的一个必经之路。

1 个赞

支持想法,但是和cpu比不算很有用
毕竟干不过显卡跑模型很可能效果存疑(除非量化成若至了),那么“以比cpu快一些的速度用实际上是拼装了大内存(速度远低于显存)的机器能跑很大的模型”这件事听起来就没那么高的吸引力了?

这个感觉已经有企业在落实了,之前有幸去看了一下optiver的校招会,量化公司会去招FPGA工程师来进行硬件设计来实现快速高效的计算

表示你提到的那个帖子我看过啦。把模型硬编码到芯片上这种手段可以很好地降低芯片功耗,提高运行效率。这是芯片的专用任务化,所谓“绝利一源,用师百倍”是也。

你考虑的推理阶段中不使用内存,光用电路本身计算。这确实可以。但那就跟后面提到的“训练”“适配CUDA生态”完全不是一个方向了。

我认为利用FPGA结合大模型应该有这样两个方向:

1、硬编码的端侧模型,利用电路进行推理运算。这个的后续发展方向应该是写在FPGA芯片里的模型同时解决训练和推理两种功能。这就像NieR: Automata里的机械生命体核心一样。但是这种写在FPGA芯片里的模型,虽然理论上可以通过一些手段直接在电路上解决训练和推理的问题,但写进去的模型架构是死的,架构是不可能改变的;能改变的只有权重。

2、FPGA 作为可以配置超大内存的计算卡使用。这点就是我的原始想法:虽然FPGA 不如GPU算得快,但它比CPU 的功耗效率要强,又能像CPU一样配置大量内存以避免爆内存的问题。你说的适配CUDA生态的庞大工作量和成本就是这个方向的问题。

对于(1)中的训练方法问题,你提到提前算出Joint Graph,然后用梯度节点来更新参数。这应该是对这个神经网络进行反向传播训练的方法。

我想的却是,能否给塞进FPGA 中的模型使用某种generalized Hebbian training方法?这样一来可以异步更新不同节点的权重,另一方面它的修改内容少,不容易出现灾难性遗忘。这样做的好处是:或许可以做到“一边推理一边训练”。难点是Hebbian训练的效率低——不过这个可以通过预先写入训练到一定程度的权重的方法处理。

这就要看什么算有用。

我最初的想法是:像kaggle那样用过时的Xeon 2.2Hz服务器CPU的环境跑我的代码勉强能跑,可是它给的30GB内存太少,我想要至少128GB的。所以在想要是有FPGA 能够配上大量内存跑我的代码就好了。很朴素的一个想法。

但是如果有些AI代码不太容易被写成便于GPU加速计算的形式,那这一种说不定就很有用了。

本质上我的想法是一个“经济适用性”的想法。对于仅有的非“经济适用性”的方向,那就是应用在不太容易被写成便于GPU处理的形式的代码了。如果你说要跟GPU比跑大模型,那肯定比不了。

原来已经有人在做了。不知道他们想做的是专属某些模型的硬编码端,还是一个通用的FPGA 搭建的计算卡。

这么说的话,确实

这回我想到了一个用FPGA构造接入超大内存用于计算的用途:那就是循环神经网络的Real Time Recurrent Learning(RTRL),这个训练方法的原始算法要求O(N^4)的算力和O(N^3)的存储,所以简直是吃内存和算力的超级怪兽;不过,它不像循环神经网络的BPTT算法一样对时间展开(它每次只计算一个时间步,只依赖该步前后的两个状态),等于说无论多长的序列,从头到尾内存的使用是固定的,而且它还可以实时训练(一边输出一边训练)。

因此,我认为FPGA搭配大内存的构造对于RTRL算法是天生适配的。

另外,记得是@Isamc 还是 @qzero 你俩谁说过想找一个能一边输出一边训练更新的神经网络,我想那就是某种循环神经网络的架构搭配上RTRL算法。

1 个赞

没事我俩都对Test time Learning感兴趣

RTRL…感觉没了解过,这段时间忙过去我来了解了解看看 :face_holding_back_tears:
最近太忙了haha,甚至连论坛来的次数都少了

最近有点忙+1 :innocent: :sob:
简单了解了一下,感觉这个和RNN一样都有个大问题:序列信息被压缩到了一个隐状态里,效果可能不如Transformer那么好(比较Transformer在推理的时候是能够看到完整的序列的)

开个脑洞:
如果把这种方法加上一个Context Window,不知道会不会有效。就是让模型既保留一小段上下文序列,又同时有隐状态可以压缩之前的信息,这就和人脑的短期记忆和长期记忆有点像了。
完整保存的那一段上下文作为短期记忆,隐状态作为长期记忆,在推理的时候不断更新这两者。

1 个赞