但视界让韩路一看到的是另一层东西,不只是代码在做什么,还有代码为什么这样做。
每一个设计选择背后的权衡,都像批注一样浮现在代码旁边。
为什么softmax没有用最直觉的实现方式,而是拆成了三个阶段?因为直觉实现在长串行上会有数值溢出。
为什么矩阵乘的分块是这个尺寸,不大也不小?因为再大sharedmemory放不下,再小会产生内存冲突。
这些东西没有写在任何文档里。它们是英伟达的工程师经过无数次实验之后沉淀下来的经验,藏在代码的结构里,只有真正理解硬件的人才能读出来。
赵文渊不是读不懂代码,他只是没办法在几天之内,就把别人几年的工程经验全部提炼出来。
但是视界可以,韩路一可以。
韩路一关掉第一版的提示词,重新输入。
这一次,他没有让智能体自由发挥。
而是把视界看到的东西直接输入进去。
「softmax必须使用onlinealgorithm三阶段,不要使用naivesoftmax。当前精度问题出在第二阶段reduce,局部最大值和指数和更新顺序要保持一致。」
「矩阵乘tile使用64x64,tile过大sharedmemory不够,过小会增加bankconflict。」
「reduce时按4-stride展开,避免bankconflict。」
「KV矩阵按row-major缓存在sharedmemory,避免跨bank连续冲突。」
「先保证精度,再做性能优化。」
回车。
智能体又开始勤勤恳恳的劳动了。
五分钟后,一个大大的绿色PASS出现在屏幕上。
赵文渊在旁边眼珠子都快要瞪出来了。
「不是……这怎么回事?」
他不顾韩路一还坐在电脑前,把头凑到屏幕前面,把测试报告从头到尾看了一遍。
精度误差:,远低于1e-5的要求。
性能:N卡实现的83%。
不是70%,是83%。
赵文渊又把生成的代码拉出来,逐行看了一遍。
他越看越沉默。
这段代码根本不是那种「能跑就行」的粗糙实现:softmax用的是三阶段onlinealgorithm,reduce的展开策略干净利落,sharedmemory的使用几乎没有浪费。
这是一个对底层硬件有深刻理解的人才能写出来的东西。
不,准确地说,是一个对底层硬件有深刻理解的人,才能指导AI写出来的东西。
赵文渊转过头,看着韩路一。
「韩总,你第二次输入的那些提示词——softmax三阶段、tile64x64、4-stride展开——你怎么知道的?」
韩路一靠在椅背上:「我看了文档。」
「我去,原来你看了文档啊,不早说。」赵文渊先开了个玩笑,然后声音突然拔高了,「我也看了两天文档,跑了十几个测试,我都没找到这个tile尺寸,你看了几分钟就看出来了?」
韩路一没有回答,只是笑了笑。
赵文渊盯着他看了好一会儿,最后像是泄了气一样靠回椅子上。
「行吧。」他说,「我不问了。」
他之前不是没想过用AI来做这些工作,但是AI根本做不了。每次跑出来的结果,不是卡死,就是偏差太大。
怎么韩路一一上手就好用了?
赵文渊现在只想火速删掉发给韩路一的那个共享文档的标题。
韩路一在他眼前,把他觉得不可能的事情做出来了。
如果这个不是偶然呢?
如果可以这样做,那其他算子呢?
什么暂无可行性啊?
什么叫「别想了,没戏」啊?
这不是有戏了吗?
他现在非常想让那个前同事过来现场看看。