每个决策都有它的绑定时间
系统决策的四个层级,以及为什么最底层只住得下编译好的代码
拿运行中系统的任意一个行为,问它一个问题:这是什么时候决定的?不问谁决定、为何决定——只问它何时不再开放、成为定局。把系统里的每个决策按这个答案排个序,一件整齐的事就会发生:它们不是均匀铺在时间上的。它们成团。
系统决策的四个层级
L1,设计。架构,它要服务的目标,它不得违背的不变量。定得早,定一次,通常出自几个人的一场争论,此后便被当作地形而非选择。日志结构还是原地更新。一层还是三层。究竟允不允许读到旧数据。这些决策以项目为时间尺度做出,以重写为时间尺度重议。
L2,实现。真正的算法,和表达它的代码。LRU、CLOCK,或者别的什么。确切的淘汰规则、分支顺序、数据布局。有人写下时决定,按代码评审的节奏改动,编译器一跑便冻结。
L3,策略参数。那些可调项:缓冲区大小、阈值、超时、批大小、权重。配置时决定,按一次部署或一次拧旋钮的节奏改动——几分钟到几周。模型权重也住在这里,这一点我还会回来说。
L4,运行时决策。逐事件的选择。淘汰这一行。放行这个包。下一个跑这个线程。时时新做,每秒亿万次,即刻耗尽——决策的生命,不会长过引发它的那个事件。
这个结构是嵌套的,这才是它高于一张清单的地方:每一层定义了下一层的选择空间。设计决定哪些算法可被表达。实现决定哪些参数存在可调。参数决定哪些运行时选择可达。L1 没留余地的事,L3 做不了主。人们说一个系统「灵活」,几乎总是指它的上层给下层留了格外大的空间。
在 L1 与 L2 之间,这道接缝甚至有一个每个程序员都在用的名字:接口。L1 定义接口;L2 决定如何实现它。你可以把 LRU 换成 CLOCK 而无需与架构重新谈判,正因为架构从头到尾只为接口发过言,从未管过接口背后发生什么。
梯度
沿层级而下,两个量朝相反的方向移动。
频率每下一级就涨几个数量级——从系统一生里屈指可数的设计决策,到几千行代码,到几百个旋钮,到每秒亿万个事件。而单个决策的分量以同样的速度下跌。架构错了,重写系统;一次淘汰错了,吃一个缓存未命中。
这种反比不是巧合,它正是层级得以稳定而非任意的原因。一个必须时时刻刻做的决策,不可以单个分量很重,否则系统没法运营。一个分量极重的决策,最好足够稀少,否则没人付得起它应得的斟酌。系统这种东西,其中一桩本职就是:把分量往上推,把频率往下压。
由此得到本系列居中的技术事实。只有编译好的代码,能占据 L4。这无关口味——是算术。一个每秒做上亿次的决策,预算以纳秒计,约等于几条指令,加一次你本想避开的缓存未命中。任何要对这个决策想一想的东西——一次前向传播、一次对学习结构的查找、一次调进不在指令缓存里的运行时——都要花微秒,比这个决策本身贵三个数量级。你可以把模型一路缩小到装得下,但那时你造出的是一张多绕了几步的查找表,而你应该问问自己:为什么不直接把查找表写出来。
在模型被放进运行时的稀有场合,生产实践印证着这笔算术,而非违抗它。Google 虚拟机调度器里的学习生命周期预测器,服务的是每秒几十次——不是几十亿次——的决策;即便在这样温和的节奏下,它仍被编译进调度器自己的二进制,与之一起金丝雀发布、一起上线,预算九微秒。模型越靠近 L4,就越被迫活成那里原住民的样子:代码。
所以学习该住的地方不是 L4。是 L2 和 L3——住进代码,住进代码所读的常量。学习 L4 的行为,当然可以;在 L4 学习,几乎永远不行。
L0:不算层级的层级
如上所述的层级体系,顶上有个洞。L1 是设计,设计服务于目标——可目标从哪来?
称之为 L0:目的。系统为何存在。「更好」是什么意思。服务等级协议;你愿意用什么去换什么;哪种失败可以接受,哪种会终结这门生意。它不是一个设计决策;它是设计决策向之交账的东西。
你需要把这一层摆到明面上,而且不是出于情怀。没有它,「系统自我优化」这句话就没有指涉对象。优化什么?L0 之下的每一层都是优化问题,也就意味着 L0 之下的每一层,都握着一个自上而下递来的目标。L0 是回溯停止的地方。它是整个栈里唯一之上再无可诉诸之物的层级——这恰恰是它归人的原因,也是本系列最后一篇真正要谈的。
两根轴,否则地图无用
我目前写下的一切有个毛病:它描绘的是一个没有人的系统。
层级告诉你决策何时被冻结,却只字不提谁来冻结、按什么纪律冻结。两个系统可以层级结构完全相同而毫无相似之处——一个是人读着仪表盘手工调参,另一个是搜索过程每小时重写同一批参数。层级体系分辨不了它们。所以,需要两根正交的轴。
分配——每个点上谁做决定。记作 α:一张从决策点到决策者的映射。人、算法、模型、智能体,或某种混合。分配不是层级的属性,是系统的属性,也是系统变得更自动化时真正在变的东西。关于系统里 AI 的多数争论,其实是关于 α 的争论,却从不明说,所以吵不出结果——一个人说的是谁来写淘汰策略,另一个人说的是谁来定 SLA,双方都以为自己在争「AI」。
流程——按什么纪律。记作 ρ:决策生效之前如何验证,要过哪些关卡,出了错怎么办,多快能撤销。金丝雀发布,影子流量,分级上线,急停开关,一条已知良好、常备常热的回退路径。
这两根轴彼此独立,而独立正是有用之处。你可以把决策交给机器,同时保留一套严酷的验证流程;也可以把决策留给人,却什么流程都没有——说实话,多数生产系统正是后者,这也是「这是人拍板的」听上去比实际更让人放心的原因。α 越向机器移动,ρ 就得承担越多的分量,因为你交出去的,是一个慢吞吞、深思熟虑、多半会察觉不对劲的生物。自动化没有消除判断的必要。它把判断搬进了关卡。
我在借用什么
上面几乎没有新东西,诚实的做法是趁别人开口之前,自己说清继承了什么。
「绑定时间」不是我的词。它是编程语言里的标准概念,教科书定义几乎正中靶心:绑定被创建的时间点,或者更一般地,任何一个实现决策被做出的时间点。
而「自治」这一半,比 AI 话题更古老。2001 年,IBM 发起自主计算(autonomic computing),要的就是在授权策略之下自我管理的系统。它得到了一个在共享知识之上监测、分析、规划、执行的控制回路,和一个五级成熟度模型。那些级别锚定的是回路的哪一环仍归人所有:最底层,分析与规划都由人做;预测型系统负责分析和建议,由人批准;只有到顶层,回路才自行闭合。这就是 α 轴,早了二十年——我宁愿站在它上面,也不愿重新发明它。
这就是坐标系。下一篇用它来说清:「AI 原生」应当是什么意思,以及它不可以被允许是什么意思。
参考文献
-
Michael L. Scott. Programming Language Pragmatics, §3.1, “The Notion of Binding Time.”
-
Jianheng Ling, Pratik Worah, Yawen Wang, Yunchuan Kong, et al. LAVA: Lifetime-Aware VM Allocation with Learned Distributions and Adaptation to Mispredictions. MLSys 2025. (Model compiled into the Borg binary; 9 µs median latency, §3, §5.)
-
Paul Horn. Autonomic Computing: IBM’s Perspective on the State of Information Technology. IBM, 2001.
-
IBM. A Practical Guide to the IBM Autonomic Computing Toolkit, SG24-6665. (The MAPE-K loop, §6.1.1; the five-level maturity model, §1.3.)