笔趣阁(xbiquge2345.com)更新快,无弹窗!
江遥抬头看着黑板,脑子里却忽然闪过很多并不属于这堂课的东西。蚂蚁不会等全体集合后再统一出发,鸟群转弯时也不可能先召开一次会议;城市里的五个传感器更不会保证每一秒都同时上传;甚至她和原既白现在的聊天,也越来越不像以前那样有一段完整、同步的晚上。她发出一句话时,他可能正在考试;他凌晨做完实验后留下的结果,她第二天早晨才看到。两个人并没有因此“失去联系”,只是联系早就不再依赖同一个时刻。
这个联想很快被她压下去。课堂上的问题首先还是课堂上的问题。
上午后半段,十五个人被分成三组,每组都要设计一套在这种“没人统一喊口令”的情况下仍能工作的局部规则。江遥所在这一组很快提出一个直观方案:每个节点收到邻居新值后,不直接替换自己的数,而只往对方靠一点;消息越旧,影响越小。这样就算偶尔收到迟到信息,也不至于一下把自己拖回很远。
第一次模拟效果不错。
第二次,顾老师让一个节点断开了三分钟。
剩下五个仍然逐渐接近,等那个失联节点重新接入以后,系统又开始调整。江遥原以为这是好事,可很快发现另一个问题:失联节点带回来的是一个和其他人差距很大的旧值,它重新加入以后,相当于整个系统突然又被塞进一块过去。大家当然可以慢慢把它拉回来,可如果节点不断掉线、重连,所谓“最终一致”就变得越来越难判断。
沈策说:“那就把掉太久的人权重降低。”
方禾马上反问:“降低多少?如果掉线的是最重要的数据呢?”
“数字哪有重要不重要?”
“现在是平均值没有。换成别的问题就有。”
江遥没有参加这两句争论,她正看着那条重新接入的时间线。她忽然想到,如果一个系统允许局部不断加入、退出,可能真正应该追求的就不是“某一刻所有人完全一样”。在持续变化的世界里,绝对一致或许本身就是不现实的目标。更有意义的问题可能是:即使每个人看到的都是稍微不同、稍微滞后的世界,整体是否还能保持在一个不会失控的范围内?
她把这个想法说出来以后,简宁先皱眉:“那不是降低标准吗?”
“也可能是换标准。”江遥说,“如果系统永远在动,你要求所有人任何时候都完全一样,可能本来就做不到。比如一群人往前走,每个人的位置肯定不一样,但可以保持同一个大方向。”
陆徊说:“那得先定义多不一样还算没散。”
“对。”
几个人又绕回计算。
顾老师一直到最后才点评。他没有宣布谁的方案最好,只指出三组都犯了一个相似错误:一开始大家总想恢复那个已经被拿掉的中央节奏,给消息编号、补时钟、等待慢节点,本质上都在试图重新制造“大家一起走”的条件。这些办法有时当然必要,但如果系统规模足够大、延迟无法控制,等最慢的人本身就会变成代价。
“有时候,”他说,“你们不是要把现实改造成一个同步系统,而是要学会在不同步里工作。”
这句话让江遥在灰色本子上停了很久。
她没有抄。
因为它太像一句适合被单独划线的话,她现在对这种句子已经本能地有点警惕。她只把上午那六条时间线继续补完整,在旁边写下两个问题:**什么时候必须等别人?什么时候不等也可以继续?**
---
原既白那边,几乎在同一周遇到了一个更加难看的版本。
自动测试系统经过前几轮改造以后,终于可以连续运行,不再因为磁盘写满或者单个任务卡死就整体停摆。宋弈于是做了一件他们之前一直没有胆子做的事:把两个不同版本的模型同时接进去,让测试器并行跑。
本意很简单。他们想比较同一批自动生成的测试,在模型A和模型B上分别会发现什么弱点。按原既白最初设计,每个任务生成一张测试图片以后,同时发给两个模型,两边都返回结果,再统一写入数据库。只要把模型版本记清楚,后面便能比较。
第一晚看起来一切正常。
第二天上午,结果开始出现无法解释的矛盾。
同一张图片在日志里有三次记录,两次显示模型A判断正确,一次却显示模型B输出;某些测试任务标记的是A版本,真正调用的模型进程却已经在半小时前被替换成新权重;还有一批图片生成时依据的是旧模型的弱点,等真正进入评测队列,模型已经更新,结果当然和搜索时完全对不上。
宋弈看着数据库里那些互相打架的记录,第一反应是:“是不是写错标签了?”
查了半天,标签本身没有写错。
真正的问题出在时间。
模型训练、测试生成、任务调度和结果写入四件事并不是按一条整齐的流水线一步一步发生。