RISC—V不止替代,更搭AI

Yuki-^_^ 2024-06-11 17:01:03 阅读 51

从2010至今13年的时间,RISC-V架构已从无人问津变成了能够挑战ARM架构的最强勇者。究其原因,无外乎开源、自由、简单等原因,更关键的是随着经济逆全球化趋势凸现,中美更存在着贸易进一步脱钩的可能。有着台积电、英伟达等“卡脖子”的前车之鉴,国内的半导体厂商与芯片工程师愈发关注如何针对Arm进行“国产替代”,RISC-V逐渐成为“全村的希望”。

不过,“国产替代”终究是在走替代的道路,要想实现如今ARM那样成熟的生态,年轻的RISC-V的路还有很长。但正如武侠小说中,主角往往都能在机缘巧合下获得传世法宝或顶级武功秘籍,RISC-V似乎也迎来了它的机遇——AI时代。

如果说曾经的RISC-V是沿着ARM的道路前行,努力做好“替代”的工作,那AI时代的RISC-V就获得了超越ARM的机会。

RISC-V不止替代,为什么?

另起炉灶,没包袱

相对ARM来说,RISC-V拥有的最大优势就是轻量化与开源性。

就轻量化来说,这可能并不算是一个优点。虽然芯片仅能听懂0与1组成的二进制命令(机器语言),但工程师能指挥芯片完成多种多样的复杂计算并不需要使用这些,而是可以使用类似命令行的文本来控制它,这就离不开建立在芯片之上的各种指令集。

指令集本质上是操控芯片执行任务的机器语言或电信号的集合,每个指令对应着一个电路,输入一些电信号,芯片就会返回一些电信号。它可以被分为复杂指令集CISC(Complex Instruction Set Computer)与精简指令集RISC(Reduced Instruction Set Computing)。事实上,无论是复杂还是精简,它们之间并无优劣之分,只是在面对不同应用环境的时候会展现出不同的性能表现。例如在执行较复杂命令,对功耗要求不那么高的PC平台上,属于CISC的X86指令集几乎一统天下,而在移动端领域,CISC较高的功耗需求,让属于RISC的ARM占据了绝对优势。

不过就RISC-V与其竞争对手ARM而言,他们都属于RISC指令集的一种,替代ARM,RISC-V优势在哪?

进入2023年,AI让芯片的算力得到无与伦比的表现。作为软件,AI可以说已经榨干了所有芯片的极限。而当摩尔定律脚步放缓,硬件成长速度变慢,算力从哪来?突破摩尔定律,RISC-V似乎比ARM更有优势。

目前,面对AI算法对硬件算力的压榨,实行专用架构,或者说对AI算法进行特定优化的芯片成为化解高算力需求的新趋势。ARM与X86,作为老牌指令集,它们内部有着诸多“陈年代码”类似的问题——“shit山”,换种文雅的说法就是历史遗留指令太多,后续工程师很难再对现有指令进行更新或添加。很多读者或许下载过ARM官方的文档介绍,几千页读下来,熟练掌握尚且困难,推陈出新更是难办。多指令模式更为ARM架构设计增添了复杂性。因此,在指令集的扩展方面,年轻的RISC-V天然具有极大优势。

目前,专用芯片可以分为常规的CPU、GPU,以及FPGA与ASIC。芯片从CPU到ASIC,专用性依次提升,但通用性也相应下降。ASIC作为专用芯片,它甚至只能跑固定算法,不过换来的则是超越所有芯片的运行速度与更低的功耗。有数据显示,相对同级别CPU、GPU,该类ASIC芯片可提高运算性能15倍至30倍,并提高能耗效率30倍至80倍。不过,目前AI算法还正处于快速迭代中,将算法直接固定下来显然不划算。因此,专用性与通用性两手抓的DSA架构与FPGA受到更多的关注。

2017年,David Patterson与John Hennessy在“体系结构的黄金年代”主题演讲中提出了DSA架构。相比FPGA,DSA更像是ASIC的升级版或回调版,而不是FPGA的改进。DSA可以为某类应用进行特定优化,实现更高的能效比。在RSIC-V高灵活性优势的加持下,DSA架构还能发挥出更多优势,其中就包括能耗。从另一方面来说,目前FPGA已经较为成熟,已经有不少服务器用上了FPGA,但在新兴的边缘计算领域,由于对功耗较为敏感,DSA正在获取更多市场。

总的来说,更“年轻”的RISC-V拥有比ARM和X86更好的灵活性与扩展性。在边缘AI计算对算力、功耗均有较高要求的条件下,DSA架构正在快速发展,RISC-V作为更灵活的指令集,则更加搭配DSA架构。

更适合小模型

RISC-V并不是适合所有的AI模型。很明显,在AI大模型方面,由于其需要的极高算力与超高的相关资源消耗,让几乎所有RISC指令集望而却步。以ChatGPT这类大模型为例,据OpenAI测算,ChatGPT训练阶段总算力消耗约为3640 PF-days(约1PFLOP/s效率跑3640天),GPT-3训练成本预计能达到500万美元/次。

边缘AI,无法承载大模型对算力的高需求,瞄准单一领域、对算力要求相对低的小模型AI则可以施展拳脚,RISC-V的机会就来了。尤其是物联网领域,RISC-V已经展现出了优势。前文提到,RISC-V的轻量化带来灵活性优势,这一点也正好匹配了IOT领域的发展。2021年,RISC-V芯片数量已经突破10亿颗,其中最多应用在语音识别、AI视觉、智能家电、工业控制、物联网安全等领域。

算法角度来说,更高自由度的RISC-V指令集恰好与需要更快速迭代与高算力的AI算法相匹配。墨滴论坛专家表示:“RISC-V的指令集可以根据具体的应用需求进行裁剪和定制,因此可以更好地适应不同的AI算法,包括深度学习、神经网络等。”更重要的是,AI算法,无论是大模型还是小模型,都离不开算力属性的支持。既要算力高,又要迭代快适应广,更轻更便捷的RISC-V非常适合。

还有一点非常重要,在ARM的绝对优势区域IP领域,RISC-V还拥有杀手锏。首先,由于RISC-V指令集非常灵活,在设计芯片时,单个IP可以更加灵活的进行组合或重构(自行增减指令集或者核心数量),而不是必须遵守ARM的IP协议,较死板的应用高价买来的IP核。简单来说,RISC-V的IP相比ARM还能继续“拆解”,以解决芯片设计的多种情况。同时,这也为RISC-V架构带来了更高的扩展性,设计师可以像玩乐高积木一样任意拆分模块,组合出理想中的芯片来。

总结一下,如今AI大流行时代,云端AI模型正逐渐向覆盖面积更广阔的边缘移动。高自由度的组合形式为RISC-V带来更强的灵活性,也更加契合边缘AI的发展。

AI时代,RISC-V怎么开拓市场?

就ARM或X86的选择上,一家中小规模的公司,一旦选择在某个指令集上发力,就要投入大量人力资源去迎合。那么RISC-V怎么从早已成熟的ARM架构中抢夺本来就稀缺的芯片人才呢?

记者在南京世界半导体大会上采访到了时擎科技董事长蒋寿美。他表示,其实应用RISC-V指令集并不会给芯片设计工程师造成很大困难。ARM与RISC-V之间的切换,就像是具有数据结构知识的程序员,在C语言与Python之间的切换一样。变化的只是指令,不变的是整体的设计理念。蒋寿美认为,一个熟练掌握ARM架构的设计师,可能仅需半个月就能切换到RISC-V的开发上来。

对于RISC-V来说,AI是个风口,但也埋藏危机。曾经元宇宙与区块链的概念都红极一时,不过仅一两年的时间过后,很多厂商就已经倒闭或撤资,吹起来的泡沫也一一破裂。当AI退潮,RISC-V是否在裸泳呢?

就目前来看,AI的浪潮与过去元宇宙和区块链的爆火并不相同。AI其实已经切实的提升了整体生产力。更关键的是,AI的发展并不是一蹴而就,从阿尔法狗战胜李世石的惊世棋局,再到ChatGPT引发的另一个“iPhone时刻”,AI已经高速发展了很久,它经历了多次互联网寒冬,横跨了多个爆发的热点技术。记者从多家企业中了解到,目前很多企业都将研发重点押宝AI,尤其是边缘计算,包括AI语音、AI视觉甚至AI交互。今天的发展成果,还远不及AI所能达到的顶点。AI从未止步,RISC-V也未停歇。

总结

从宏观角度看,RISC-V的发展还远远不及ARM。庞大的生态体系与众多的开发者是RISC-V难以逾越的鸿沟。不过正因如此,RISC-V也具备了更轻量化的指令集,“船小好调头”成为AI时代的重要优势。随着硬件技术的发展,更搭AI的RISC-V正从替代ARM,一步步走向与ARM并肩前行的未来。

```pythonclass BertPooler(nn.Module): def __init__(self, config): super().__init__() self.dense = nn.Linear(config.hidden_size, config.hidden_size) self.activation = nn.Tanh() def forward(self, hidden_states): # We "pool" the model by simply taking the hidden state corresponding # to the first token. first_token_tensor = hidden_states[:, 0] pooled_output = self.dense(first_token_tensor) pooled_output = self.activation(pooled_output) return pooled_outputfrom transformers.models.bert.configuration_bert import *import torchconfig = BertConfig.from_pretrained("bert-base-uncased")bert_pooler = BertPooler(config=config)print("input to bert pooler size: {}".format(config.hidden_size))batch_size = 1seq_len = 2hidden_size = 768x = torch.rand(batch_size, seq_len, hidden_size)y = bert_pooler(x)print(y.size())```



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。