24 年字节那个训练投毒的当事人田柯宇,
现在在创业做世界模型,还拿到大结果了
不久前团队刚拿到了三千万美元的投资。
字节辞退起诉、一审判赔 50 万的实习生,
现在摇身一变,
成了顶尖论文作者和明星 Founder夸脏哦

我愿称之为真人版夜神月。
前几天他上了elsewhere的播客。
主持人问他,这件事是偶然还是必然。
他想了一会儿,把当时的行为叫做
「朴素的正义」。

原话是
就像走在大街上遇到什么事情,
我可能会有比较冲动的方式去做。
《死亡笔记》中夜神月也是在捡到笔记本第一天起,
就没觉得自己在犯罪。

也是在同一天,
五位当年同组的受害者实名发了一份材料。
两份材料看下来,基本事实是相同的,但也有一些地方有出入
下面我讲的,是受害者那边记下来的版本。

先说他是个什么样的人
田柯宇 2021 年进字节实习,
在这之前他已经在商汤待了三年,还是商汤当时年纪最小的实习生。
他本科学材料的,后来转去软件工程,
转系之前就把核心课自学完了。
大二大三那会儿,
他就在 NeurIPS 上发过两篇一作。
2024 年,他又拿到了 NeurIPS 最佳论文。
NeurlIPS是人工智能和机器学习领域规模最大、影响力最高的国际顶级学术会议之一与ICML、ICLR并称机器学习领域三大顶会
4 月,字节启动视频生成项目 Goku,他跟着进了反馈群。
此后五个月,他一边参加故障排查会议,
一边对集群下手,前后共改了八个地方。
导致团队越查越糊涂。
工程师定位到某台机器,重启想复现,结果程序又好了。
北京、上海、西雅图三地团队轮班值守,
24 小时盯着训练进程,每天早晚开会交接。
给当时同组的人心态都搞崩了,有人甚至怀疑这些排查到底还有没有意义。
他们一直在找的技术原因,
其实,造成问题的人,就坐在排查现场。
夜神月人间体说是
在掌握信息不对等的前提下
他永远快一步知道要查什么
然后提前把现场收拾干净

后来调查有了进展
7 月 30 日早上,
有人在一次日常 debug时顺手翻了源码,
发现被修改的迹象
查机器记录,除了 owner 只有田柯宇登过。
第二天,7 月 31 日,
另一名同事在他的个人目录下翻出了那批代码,发现不对劲
8 月安全部门介入问询,随后辞退。
2026 年,一审判赔 50 万元,
受害者的材料中
把田柯宇的攻击手段分成八类,
都有一个共同点,
就是把人为破坏伪装成随机的软件故障、
数值异常或基础设施问题。

第一类,优化器
优化器AdamW,这段代码训练时负责更新模型参数的。
田在里面塞了个开关,叫 maximize,
原版是 False,被他改成 True,于是每一步都往反方向走。
还有个更隐蔽的版本,写在 adamw2.py 里,只在部分机器上生效,
结果是训练照常跑,反而更难收敛了

第二类,梯度裁剪
程序里有一道保险叫梯度裁剪,
是计算一个系数(clip_coef)把梯度压住,
太大的时候这个系数会小于 1,
把梯度按比例压小
防止模型单步更新幅度太大。
他把这段代码改成 clip_coef 永远等于 2,也就是不管梯度猛不猛,每次都强行放大两倍。

最阴的是,
函数对外返回的数值还是正常的
所以日志看起来一切正常。
第三类,分布式通信。
上千张卡一起训练,机器之间靠两个通信操作交换数据,
all_gather和reduce_scatter。
每次通信前,代码都会检查一遍当前进程在不在通信组里。

他往这个检查里塞了个随机数,
让进程以 2⁻¹⁸ 到 2⁻²¹ 的概率返回不在,直接跳过这次数据交换。
概率低到一台机器一千个进程,
跑一天也只踩中一两次,
而且随机种子还取自纳秒时间和内存地址,压根复现不了。
第四类,数据采样。
每一轮训练的读取顺序由一个 seed 决定,
原版写的是 self.seed + self.epoch,
写死的,所以每台机器算出来都一样。
他把这个 seed 换成了 time.time_ns(),
也就是当前时间的纳秒数。

结果就是每台机器读到的数据都不一样,
有的样本被重复读,有的样本一次都没读到。
数据顺序本该是确定的,改成时间之后每次都不一样,
第五类,命令后门。
后门写在 wait.py 里。
会一直盯着共享盘上的一个目录,一旦发现新文件,
就把里面的文本当成 shell 命令执行,
再把结果写回去。
相当于随时可以给集群下发命令。
还有个 kill.py,
负责把这个后门写进 init.py,训练一启动就自动运行。
整个过程不碰外网,常规的网络监控看不见,
而且命令通道藏在训练账户日常挂载的盘上,还只在个别进程上运行。

第六类,定向杀进程。
kill.py 还有另一个用法。
它会检查当前的实验编号 TRIAL_ID 和机器编号 NODE_ID,
对上了就执行 pkill torchrun 和 pkill python,直接杀掉训练进程。
少数进程退出,整个分布式任务跟着卡死。

第七类,checkpoint 加载。
checkpoint 是训练中途存下来的存档,
是模型当前的参数,下次接着跑要从这里读
田加了一个 nonan 文件,
使其在系统读取存档时自动修改。
训练崩过之后,存档里会混进一些非法数值(NaN和Inf)
正常读取到这里会直接报错。
nonan 把这些数值悄悄替换成 0。
本该报错的地方不报错,
模型看着是读取成功了,
但状态其实已经被动过。

第八类,安装方式。
前七类改的都是运行中的程序,第八类,直接用 sudo mv 替换系统里已经装好的 PyTorch 库文件。
事后还用 os.utime 把文件的修改时间改回原样,再用 chown 和 chmod 把属主、权限位都还原。
排查时看时间戳也看不出来

整篇证据看下来,
和田柯宇在访谈中说的有些不符,
他是不认自己有做这些攻击行为的。
但单从他拿到年度最佳论文来说,
确实是位技术大佬,
所以他创业做的世界模型可能还是有点实力的。
字节成最大输家了,让田柯宇赔了 50 万,
相当于是把他在字节三年实习赚的钱吐出来而已。
人摇身一变就成了明星创业者,
这个世界还是太颠了。
晓风乾丨 大四 Base北京 AI产品在职
想缩小科技带来的信息差 分享很酷的AI玩法。
希望得到您的点赞转发爱心三连支持,
如果有更多想法或者问题欢迎交流~







