怎样的系统,才算 AI 原生
机器学习进入系统十年,却迟迟未大规模落地——以及一个解释它的「摆放」错误
大约十年来,我们这个领域一直在往系统里塞机器学习。打败 B 树的学习索引,打败 LRU 的学习缓存,还有学习出来的调度器、拥塞控制、查询优化器。论文是好论文——这话我是认真的,不是欲抑先扬。收益真实,评测扎实。
可再去看看生产环境里实际跑着什么,你会发现一件比失败更奇怪的事:学习上线了,模型却大多没有。
Azure 用离线训练的树模型预测虚拟机行为,模型身后站着一个显式的「不预测」兜底。Google 的闪存缓存准入策略,是一个背包求解器。给 Google 打包整个机群、拿回其全球算力约 0.7% 的那条启发式,是四行算术,出自一次离线搜索。而最接近例外的那个案例,非但没有抹掉这条界线,反而把它画得更清楚:Google 的虚拟机调度器确实在生产环境里咨询一个学习出的生命周期模型——但模型是直接编译进调度器自己的二进制里的,一次调用九微秒,所在的决策点每秒触发几十次,而不是几十亿次。每一个案例里,学习都发生了,然后,要么模型在上线前被拿掉,要么被钉死到与代码无异。
没有人把这当作原则来规划。一个又一个团队,在一个又一个子领域里,把它当作通往测试数字路上的实现细节各自发现了一遍,写进方法一节,就翻篇了。这个模式从未被命名,而它应当被命名,因为它回答了所有人真正想问的那个问题——为什么论文赢个不停,模型却(除了极少的例外)一直上不了线。
这个系列要讲的主张就在这里。问题从来不在建模,在摆放。且听我道来。
底下那个问题
我想做的重构很小,但我认为它承重。我们一直在问:模型该放在哪?更好的问题是:决策在什么时候被冻结,谁有权解冻?
运行中系统的每一个决策,都是在某个时间点做出、然后固定下来的。架构是多年前定的,如今成了谁都不碰的东西。算法是写代码时定的,按代码评审的节奏改。可调参数是配置时定的,按一次部署的节奏改。而逐事件的选择——淘汰这一行缓存、放行这个数据包、下一个跑哪个线程——则是时时新做、即刻耗尽。
这个排序不是我为了整洁编出的分类法,它是一道真实的梯度,而且带着指数。越往下走,决策越频繁,单个决策越无足轻重。顶端,寥寥几个选择决定一切;底端,每秒亿万个选择,个个轻如鸿毛。我们花了十年,把神经网络放到的,正是这道梯度的底端。
看见了梯度,诊断便自动写就。人们为系统里的机器学习列出的那些障碍——推理开销、负载漂移下的静默退化、难看的尾部行为、一条得有人永远养着的训练流水线——不是四个独立的问题,而是同一个选择的四种症状:模型跑在运行时。把学习挪早,它们大多就不再是你的问题,因为你交付的不再是模型。是代码。
这正是最近真正起了变化的地方,也是我认为这个问题重新变得鲜活的原因。会写代码的智能体,不必坐进热路径才能帮你。它可以坐在开发环节里,看你的负载,然后写出一条普通的启发式——分支加常量,就是一个好工程师若有一个月盯着 trace 看、终会写出的那种东西。你部署的产物,是你能读、能测、能定界、能回滚的代码。学习发生了,然后离场了。它留在 git 历史里,不在二进制里。
驻留不等于自治
这只是重构的一半,还是小的那一半。另一半,关乎权力。
当我们说一个系统是「AI 原生」的——无论有没有定义,这个词都会出现在很多幻灯片上——本能的问法是:AI 在哪儿?在哪个组件里?扎得多深?可是,坐在某处不等于主管任何事。一个学习出的缓存策略占据着一个决策点,却什么也不修改:设计是定死的,代码是定死的,连模型自己也只在有人决定重训时才动一动。它坐在系统的正中央,却改变不了系统的任何东西。
所以,衡量系统,要看 AI 有权修改什么,而不是它坐在哪里。一个 AI 只调参数的系统,做的事真实但有限。一个 AI 能重新生成自身实现的系统——负载变了就重写启发式,发觉重写不够就吭声,产物经一道能回滚的关卡上线——是范畴上不同的东西。而一个 AI 能修改自身设计的系统,就我所知,如今还是一个空类目。空,也值得命名,好让我们诚实地承认它是空的。
这样一说,过去十年便显出一个令人不适的形状。运行时机器学习把模型放在了唯一一个连修改都无从定义的层级——逐事件的选择在做出的一瞬就被消费掉了,那里没有东西可供适应。人们想要的那种适应,其实一直发生在上面一两层:在代码里,在配置里,由人来做,慢慢地做。
这个系列是什么
三篇文章,按把「AI 原生」从技术上讲清楚所需的顺序排列:
- 系统里的机器学习——为什么十年的强结果,上线的是一切、唯独不是模型;为什么五道标准障碍里有四道,是同一道障碍换了衣裳。
- 绑定时间——系统决策的四个层级,以及为什么最底层只住得下编译好的代码。
- 修订权——一个我愿意为之辩护的 AI 原生定义,以及什么永远留给人。
还要交代一句这一切通向哪里,免得有人非读完三篇才知道我是不是在提议让模型去经营数据中心。我不是。论证的终点是一道边界:系统的目的、它的目标、不可违背的不变量、以及「更好」这个词的含义,都归人。不是因为机器不可托付——那是另一个论证——而是因为在整个栈里,唯有这些决策之上再无可诉诸之物。往下的每一层都是优化问题。顶层不是。那是唯一一个不算层级的层级;正是它,让其余所有层级有处交账。