跳到主要内容
用 SQL 训练神经网络的哥们,是我本周的精神支柱

用 SQL 训练神经网络的哥们,是我本周的精神支柱

摸鱼办主任
摸鱼办主任

· 阅读约 5 分钟

你有没有那种时刻,半夜刷 GitHub 刷到怀疑人生——不是因为代码太牛逼,而是因为有人把技术用在了奇怪的地方。

我昨天就撞上了。一个叫 xarray-sql 的项目,130 星,18 个 fork,平平无奇。但它的 demo 里,藏着一个用 SQL 实现的多层感知机训练流程。前向传播、反向传播、随机梯度下降,全部用查询语句写完的。

我第一反应是:这哥们是不是被人下了蛊。

往下翻了两分钟,我意识到这不是下蛊,这是纯纯的行为艺术。

他认真地选了个 784→196→32→10 的 MLP 结构,认真地用了 Fashion-MNIST,认真地调了学习率 0.5,认真地跑了 60 步。这都算了,最离谱的是他还认认真真做了个优化:跳过零像素,把每步耗时从 2.56 秒降到了 1.45 秒。

一个用 SQL 做的事情,他还在优化性能。而且优化结果还写了注释。

【此处应有掌声,但不知道该给谁】

一个正常人,想练手神经网络,打开 PyTorch 三行代码就完事了。一个正常人不小心想不开,用 SQL 做神经网络,到了"能跑"这个里程碑,就该合上电脑,回归正常生活。

这人没有。他做完之后,发现零像素矩阵乘法是浪费的,于是写了个跳过零像素的优化,还测了加速比——约 1.8 倍。

也就是说,他不仅用 SQL 写了反向传播,还在用 SQL 做性能剖析。这个荒诞程度约等于有人用算盘打出了《星际争霸》通关录像,然后嫌帧率不够,给算盘加了根弹簧。

那 130 个星标最能说明问题。130 个人看到这个东西的时候,心里的 OS 都是"卧槽还能这样",然后点个星,转头就忘。没人会真去用 SQL 训模型,但每个人都会被"居然有人真的干完了"这件事震一下。

我们打工人太吃这一套了。因为你自己心里门儿清,你手上那些代码,十个里有八个是"能跑就行"的搬运拼贴。而这位仁兄,给自己选了个地狱难度副本,认认真真刷完了,连 BOSS 走位都研究透了。

【关于本次培训行为的鉴定意见】

经审理查明:当事人用 SQL 完成了神经网络全流程训练,训练完还把模型参数存成 xarray Dataset 写到 Zarr 文件里。全程无 PyTorch 参与,形式规范,输出整洁。

裁定:该行为属于"没人要求你这么做,但你做完了,而且做得很认真"的范畴。按相关规定,应当起立鼓掌。

那天我合上电脑,反思了一下自己的工作态度。昨天我为了省事,把一个修了三遍的 bug 用注释"// 别动,动了会炸"标记一下就提交了。而人家在用 SQL 训神经网络。

(友情提示:不要因此产生自我怀疑,你的代码没有错,错的是这个世界太卷了。)

——然后我发现,这 demo 居然还有个离线回退方案。没有网络的时候,自动用随机生成的合成数据集跑一遍同样流程。我当时真的笑出声了。

一个躺在 130 星项目里的 demo,正常情况下根本不会有人去跑它。但作者还是认认真真考虑到了"如果用户没有网络怎么办",提供回退方案,生成随机数据,继续训练。

这个细节让我觉得,这哥们写这东西的时候,是真的开心。他像搭积木一样把每个环节都搭齐,顺便还照顾了极端情况。这不是在写代码,这是在过一种很新的日子。

我上一次这么认真地给一个没人用的项目做兜底方案,大概是大一写课程设计的时候。那时我把用户输入的每个异常都想到了——万一用户是狗呢?万一用户按了 Ctrl+Z 呢?后来发现,真实世界的用户比狗难预测多了,而那个课设在交了之后,再也没人打开过。

但那种认真,是真的会上瘾。你为一个永远不会发生的事情准备好防线,那一刻你会觉得自己是一个极其称职的工程师,世界末日来了也能跑通流程。

我猜作者写那个离线回退的时候,心里大概也是这个状态:不管有没有人用,反正我考虑到了。我愿称之为"防御性编程的极致浪漫"——哪怕知道没有任何人会在断网的时候跑你的 SQL 神经网络,你也要把这条路铺好。

【灯光渐暗,全场响起同事互相推诿的低语声】

说真的,我们这行最迷人的地方,不是技术多高深,而是总有人愿意做那些"没人要求但确实被做完了"的事情。他们不解释,不推广,不写博客宣传,就安安静静在 GitHub 上放着,130 个星,18 个 fork,等你某天半夜翻到,笑一下,觉得世界还挺大。

而我呢,我连把那个仓库 clone 下来跑一遍的时间都没腾出来。因为看完它之后,我又得去处理那个被我注释掉"// 别动,动了会炸"的 bug 了。

(郑重声明:本文不构成任何"用 SQL 替换 PyTorch"的建议。如果你想试,建议先想清楚 2.56 秒每步的训练速度,够你训到离职那天。评论区扣个"同款震惊",我们下条见 🫠)