视界展开的一瞬,韩路一眼前弹出一大片光幕。
【任务:L100算子适配】
【当前领域掌握度:23.4%】
【风险提示:目标领域涉及GPU体系结构、并行计算、编译器优化、数值分析、深度学习模型结构、硬件驱动接口、工程调试经验……】
韩路一盯着后面一长串专业名词,沉默了好一会儿。
这里面的东西,我多少也懂一点儿;可这要求的知识面也太宽了吧。
就算重新高考一次,再读个电子工程本科、芯片设计研究生、人工智能博士,再——
再什么也不顶用啊——这根本不是一个人干的活儿。英伟达对应做这个工作的团队,怕不是有几百人,而且人家都做了快二十年了。
也不怪硅明的软件团队干了一年多,覆盖的使用场景还不到百分之五。
源智要是没有韩路一开挂,再加上江松然把在谷歌和创业公司积累的宝贵经验贡献出来,汤圆现在连个能跑的地方都找不到。
算子适配这东西,字面上说,就是把一个能在英伟达显卡上跑的函数,搬到L100这张新显卡上跑起来。
听起来,像是把一道一加一的算式从一张纸抄到另一张纸上。
但这个比喻完全错了!
真要比喻的话,应该是把一支交响乐团从剧院换到一辆公交车上。空间是够的,可你怎么保证在公交车上还能奏出剧院里的效果?
小提琴放哪儿,大提琴又放哪儿;黑管放哪儿,圆号又放哪儿。
最关键的是,指挥熟悉的所有动作和位置,都得重新编排。
这才是算子适配的难度。
大模型里的算子,看起来无非是矩阵乘法、归一化、注意力、激活函数这些纯数学的东西;可到了硬件层面,每一步都是海量数据的并行计算。
一个数据从显存里读出来,放进寄存器,再放进共享内存,随后被不同线程反复使用。
连数据块切成多大、每次读多少,都得细致设计。
读多了,显存带宽爆炸,训练直接失败。
读少了,计算单元空转,利用率上不去。
如今在模型训练这件事上,大家已经有一个公认的事实——
搬数据,比算数据还贵。
像硅明的L100,纸面算力已经很夸张;可要真把这些纸面算力发挥出来,靠的是对硬件能力的极致压榨。
必须让L100痛苦地说:“真的一点儿也没有啦!”
到了这种程度,才能说:我们能拿国产卡来训练了。
这就是英伟达的生态在做的事——不仅纸面数据厉害,对硬件潜力的压榨也到了极致。
韩路一开着视界,看了看屏幕上的代码库,又看了看江松然之前发来的算子统计数据——绿色少、红色多,随后把目光落到桌上那张外接L100显卡上。
他叹了口气,默默打开视界的可编程界面。
如果我说——
我准备把算子适配做成一个AI技能,让视界来调用——那阁下又该如何应对呢?
韩路一心念一动,面前的电脑便打开浏览器,一个个标签页接连弹出,各种关键词被输入搜索引擎。
主题:GPU核心优化。高校公开课、课程讲义、课件,网上公开或收费的论文,以及被各研究院、实验室和硬件厂商研究部门备份在冷僻网络存储里吃灰的资料,全都飞快涌入韩路一的脑海;随后在视界的操作下去芜存菁,只留下最核心、最相关的部分,其余无用内容被迅速丢弃。
为了让操作更高效,韩路一又给视界编写了一个学术插件。
网上每一份或公开或隐藏的资料,都被视界打了分。
英伟达的内部资料:
【资料价值:92】
【适配相关性:高】
【重复内容:低】
这是好东西。
哈佛大学公开课:
【资料价值:62】
【适配相关性:低】
【重复内容:高】
哈子,不是说你不好哈,主要是内容重复了。
韩路一这回算是真正体会到什么叫“知识滑过大脑皮层”了。
各种相关信息在脑海中飞速穿行,其中最重要、最本质的东西被整理归位。
这感觉就很爽,像是开了挂一样。
哦,原来我真开了啊,那没事了。
在视界的可编程界面里,韩路一辟出一个单独地址,用来存放视界整理出的最有用、最相关的知识。
随着文档逐渐成型,视界面板上的内容也开始变化。
原本散乱漂浮的知识点,像被一根根细线串到一起,渐渐变成一张复杂而有序的大网。
【技能结构识别中……】
【知识片段整理中……】
【推理路径压缩中……】
韩路一猛地睁开眼。
等等,让我有点儿仪式感。
“视界,加点!”
【算子适配 Lv.1,已习得】
这下舒服了。
韩路一精神一振。
虽然这些提示语都是他自己写的插件,但功能是实打实的。
韩路一打开江松然发来的适配清单,滚动了一会儿,找到一个标着三个红色感叹号的条目。
FusedAttentionBackward,注意力融合反向算子。
这是汤圆训练框架里最关键的算子之一,前向推理完全用不到,只有反向传播计算梯度时才会触发。
正因为只在训练里出现,赵文渊和江松然他们一直没去适配它。毕竟要先保推理路径的流畅性,可训练效率上的损耗真实存在;真要做训练,这个算子必须得做。
融合算子是什么?反向算子又是什么?
前向Attention(注意力)大家都很熟悉。
Query、Key、Value三组张量进来,算出注意力权重,再乘上V,得到输出。
推理时,最重要的是前向快。
可训练时,真正麻烦的是反向。
你不仅要知道输出是什么,还要知道输出变化之后,Q、K、V三组值该怎么调整。
按普通实现,这里可以用很多其他算子替代。
先算dV,再算dP,再还原softmax梯度,一步步算过去。
最后能得到一个新值,但每一个算子运算都要读写一次显存、搬运一次数据。
而大家公认:搬数据,比算数据贵。
聪明的芯片工程师想出一个办法。
既然这个反向计算每次都要跑,跑法又固定,那把这些算子融合在一起,直接在显卡核心里一次性跑完,不就不用把数据搬来搬去了吗?
这就是融合算子。
想法很好,做起来却很难。
反向计算本身占的内存就大,融合之后更大。
这个算子,可以说是在考验工程师对硬件理解和内存编排的极限。
这么难的任务,怎么办呢?
韩路一调用刚拿到的【算子适配】技能,指向这个注意力融合反向算子。
随即,韩路一眼中出现一个L100显卡的透明模型。
模型在半空中逐渐放大,仿佛变成一座悬浮的立体工厂。
每一个线程块,都是发光的巨大机械臂。
每一段共享内存,是一排排透明储物格。
寄存器像传送带,围绕巨大的计算核心运转;一块块数据被送进高速运转的计算核心,随后又被吐出来。
韩路一明白,接下来的任务,是优化这座工厂的操作流程。