《MSRA 读博五年》系列之三,未完待续……

地下挖矿机房

帝都万柳一座普通的居民楼地下,穿过一道厚重的防空洞铁门,再穿过一条不开灯就伸手不见五指的巷道,就是我挖矿的地下仓库。

旁边的地下室里,住着很多在帝都奋斗的打工人,那里一间最小的房间一个月只要一千块钱。十几间地下室的陌生人共用一个卫生间,一个洗漱间,公用的洗手池、洗衣机都锈迹斑斑。巷道的尽头是一间 30 平米的大厅,还有通风口可以透出一点外界的光,我便租下了这间大厅和旁边的一间小屋,用作矿机机房。

我自己搭建了地下挖矿机房的基础设施,运行着价值 30 万人民币的 6 卡 1080Ti 水冷矿机、油冷矿机、多台 6 卡 1060 矿机、多台 9 卡专用矿机、各种挖比特币和莱特币的 ASIC 矿机,还承载着我最隐蔽的个人项目——数字前任计划。

初识区块链

我大概是 2015 年开始知道有比特币这个东西,花 5000 块钱(人民币)买了 3 个比特币。因为比特币的价格刚从 2014 年初的高点跌下来,其中一个我拿到年底就卖了;另一个拿到了 2016 年底,卖了 4000 出头,然后我就捐了 4096 元给科大 LUG;最后一个一直拿到了 2017 年。

2017 年是区块链暴涨的一年,各种数字货币都在疯涨。比特币从年初的 6000 多到年底 12 万的最高点,接近翻了 20 倍。如果我在 2017 年初把所有的积蓄都投入到比特币里面,在最高点卖掉,就够房子的首付了;如果卖掉的时间是在 2021 年的两个最高点之一(40 万),那就够买套豪宅了。但谁又能准确地踩中最高点呢?

霖涛导师说,一辈子有很多次做大事的机会,只要抓住一次,就能改变命运。他还蛮自嘲地说,自己就一直在研究院里,一次机会也没抓住。反倒是那些学术水平看起来没这么强的人搞成了事情。

当时,微软总部一位资深专家来 MSRA 访问,跟我们一起吃饭。那位大佬就说,他女儿很早就在玩比特币,那位大佬早就不让她玩,但她非要玩,还赚了不少钱。霖涛导师也说,2009 年比特币刚出来的时候他就知道,在专业做分布式系统的看来,这就是一个垃圾协议,效率太低了。没想到这么烂的协议还有这么多人用。

我虽然 2017 年玩区块链,眼看着币价一路冲上云霄,也相信当时的币值会不断上升,但我不想把钱换成数字钱包里一串冰冷的密钥,而是想利用这个机会玩点好玩的东西。挖矿的风险比炒币低,又可以折腾硬件,我就开始倒腾矿机了。

GPU 矿机

最早开始折腾的是 GPU 矿机,因为我很早之前就想玩水冷,但又舍不得买显卡。2017 年的时候挖矿飞涨,很多型号的显卡脱销,能够用正价买到显卡,转手卖掉都能够挣钱。1080Ti 是当时最高端的游戏显卡,用来挖矿事实上是不太划算的,因此也没有脱销,但是用来挖矿之后再出二手,算下来仍然是赚的。

因此,我就买了 6 张 1080Ti 显卡,6 个水冷头,3 组水冷散热片和风扇,两个 1500W 电源(因为一块显卡需要 300W 的功耗),多个 PCIe 插槽的主板,PCIe 转接线和转接槽,CPU、内存、SSD 等,一个矿机架子,总共花了 4 万多。

6 卡 1080Ti 水冷矿机(上面)6 卡 1080Ti 水冷矿机(上面)

6 卡 1080Ti 水冷矿机(侧面)6 卡 1080Ti 水冷矿机(侧面)

6 卡 1080Ti 水冷矿机(正面)6 卡 1080Ti 水冷矿机(正面)

6 卡 1080Ti 的水冷头6 卡 1080Ti 的水冷头

水冷的部件很多,要把其中一些水冷部件固定好还需要特殊的工具,要是接头处没有固定好,水漏到设备里就完了。一开始我不知道用蒸馏水做水冷,直接接了水龙头里面的水,过一段时间水蒸发掉了一些,需要补充,补充几次之后,水里面的杂质就糊到了管道壁上,从原来的全透明变成朦朦胧胧了。

这台机器一开始放在我家里,发现实在是太热了,2000W 的功率不是闹着玩的,空调的制冷功率都快撑不住了。好在水冷的散热片面积比较大,不需要暴力风扇,只用普通风扇就行了,因此噪声只有不到 60 分贝,不算很吵。

为了放这台机器,一开始我联系了 IDC,发现 IDC 机房的租用成本挺贵的,一个机柜一个月的成本是 4700 多元,提供的功率也只有 4400W(20A)。北京这种寸土寸金的地方,市区的厂房租用成本也很高。

建设地下挖矿机房

我发现地下室是个不错的地方。我在万柳的一个小区找到了地下室,其中有的房间达到 30 多平米,其他很多房间 10 平米都不到。里面的电力供应虽然不多,但是入户线很粗,可以做电力改造。地下室有窗户,窗户外面是一米宽左右的天井,通到了地面上,能透进来一些阳光,也就方便做通风了。

要把地下室改造成挖矿机房,就像在 powered shell datacenter 的基础上自建数据中心一样,主要是需要电力设备和散热设备。当然,矿机房不需要像正规数据中心那样搞 UPS(不间断电源),也不需要中央空调,只要用工业级暴力风扇使劲吹就行了。

电力改造没有想象的这么难,因为我的所有设备(包括我后来买的 ASIC 和 GPU 矿机)不到 20 KW(90A),而整个地下室的入户线是 16 平方的铜线,最大支持 100A,因此是够用的。一个房间散热 20 KW 有点困难,因此我租了两个地下室,一个 30 平米的大房间承载 12 KW 的功率,一个 10 平米的小房间承载 8 KW 的功率,用 16 平方铜线跟地下室的总闸相连接。为了做电力改造,我自己买了电线、电表(地下室出租方需要计电费)和若干 16A 插排,然后再找电工师傅来接线。

散热也不难,因为矿机在稍微热一点的环境下也能正常工作,不像数据中心机器那么金贵,因此我做了三级散热系统:

  1. GPU 本身风扇的散热;
  2. 每两个矿机旁边加装一个落地电扇,加快空气对流;
  3. 安装在窗户上的工业级暴力风扇,直径超过 1 米,一个窗户吹风进来,另一个窗户抽风走,形成室内强劲的气流,比新风系统换气快多了,大约只要 6 秒就能把室内空气换一遍。

最后室内的温度大约只比室外温度高不到 10 度,很少出现机器过热死机的情况。

一台二手刀片服务器作为挖矿机房的网关、存储中心和 PXE 服务器一台二手刀片服务器作为挖矿机房的网关、存储中心和 PXE 服务器

为了方便管理挖矿机房的网络,我买了一台 4000 多块钱的二手刀片服务器,作为挖矿机房的网关、存储中心和 PXE 服务器。两个地下室位于同一局域网中,使用网线和交换机相连。

刀片服务器做了两路 Internet 接入:一路是主要线路,就是地下室本来的宽带;一路是用一个 SIM 卡(上网卡)和 Raspberry Pi 搭建的备用线路,由于地下室内部信号不好,Raspberry Pi 放在了天井里。由于宽带和上网卡都没有公网 IP,我在国内租用了一台云服务器作为中转节点,这样就可以远程监控和管理挖矿机房内的服务器了。

矿机系统的安装和挖矿软件的部署是一件比较麻烦的事情,因此我在刀片服务器上部署了 PXE,制作了包括多种挖矿软件的 OS 镜像,便于安装矿机系统。为了方便管理矿池的地址和密钥,我把它们放在刀片服务器上,OS 镜像中的脚本会自动从刀片服务器上通过 HTTP 获取最新的矿池地址,并启动挖矿软件。

矿机的 Web 控制台矿机的 Web 控制台

为了监控矿机的运行状态,以及预防有人进去偷东西,我构建了视频监控系统,在两个地下室里各装了两个摄像头,实现无死角覆盖,可以通过云端实现实时监控,监控视频也会保存在挖矿机房的刀片服务器里。

每个地下室里有一台显示器和一套键盘鼠标,当矿机出问题的时候手动接线实在是太麻烦了。为此,我买了便宜的 KVM,实现 HDMI 和鼠标键盘的多路复用,只要在 KVM 上按一个键,就可以切换到对应的矿机。

地下挖矿机房的视频监控地下挖矿机房的视频监控

更多的 GPU 矿机

有了地下挖矿机房,就可以有更多的 GPU 矿机。1060 是当时挖矿性价比最高的 GPU,当时我就买了几十块 1060,每 6 块组成一台机器。

成箱批发的 GPU 显卡成箱批发的 GPU 显卡

因为矿机的 CPU 上不需要很复杂的计算,也不需要很多存储,GPU 之间也不需要通信,除了 GPU 以外的部件都是能省则省。比如 CPU、内存分别只要两百多块钱,SSD 只要一百多块钱。主板也是专门的挖矿主板,上面有 6 个 PCIe x1 的插槽,通过转接卡和转接线连接到 GPU 的 PCIe 插槽上面,这样每个 GPU 虽然是 x16 的物理金手指,但只需要占 CPU 一个 x1 的资源,使得一个桌面级的 CPU 就可以连 6 块 GPU 卡。

6 卡 1060 矿机6 卡 1060 矿机

安装矿机说起来没什么技术含量,但一台一台搞起来还真是挺费时间。进货最多的那两个月,我大概有一半的时间花在折腾矿机上。那是我 SOSP 2017 论文已经投稿之后的事了,在此之后 2 年我都没发一作的新论文。所以我感觉,如果集中精力在学术上,我博士期间一定可以搞出更多的成果。

成箱的硬盘成箱的硬盘

后来,我还购入了一些专用矿机平台和专用矿卡。所谓专用矿机平台,就是下图所示的矿机箱和配套的主板。

矿机箱上有 5 对暴力风扇,可以辅助 GPU 本身的风扇,起到更好的散热效果,当然这些暴力风扇的噪声也很大,高达 80 分贝,就像数据中心的一些服务器一样。这些暴力风扇相当于我做的三级散热系统中的第二级,可以取代落地电扇的作用,并且由于风道是封闭的,散热效果比落地电扇更好。

9 卡 980 专用矿卡(少插了一块卡)和矿机箱(侧面)9 卡 980 专用矿卡(少插了一块卡)和矿机箱(侧面)

专用矿机平台上的主板是定制的,由一块控制板和一个 PCIe 和电源扩展底板构成。控制板上有 CPU、内存和 SSD,都是预装在控制板上的,不需要自己购买散件安装;控制板插在底板上,底板将 PCIe 插槽扩展成 9 个,当然每个插槽只是 x1 的速度,因此桌面级 CPU 也能带得动。此外,底板上还集成了供电线路,外部电源插到整机的外侧,底板把电源分散出多组电源输出线,供给到各个 GPU。

相比自己攒的矿机平台,专用矿机平台的集成度更高,免除了分别购买主板、CPU、内存、SSD、PCIe 转接卡、PCIe 转接线等组件的麻烦,可以用更小的空间装下更多的 GPU。专用矿机平台只要插上 GPU 卡和巨龙电源就可以运行。一个专用矿机平台的售价大约是 1500 元,跟单独购买这些组件相比,价格也更低一些(因为一个专用矿机平台能插 9 块卡,自己攒的平台一般只能插 6 块卡)。

9 卡矿机箱(未插卡,上面)9 卡矿机箱(未插卡,上面)

所谓专用矿卡,就是 NVIDIA 看到了挖矿的商机,专门推出的不带 HDMI 等显示输出接口的卡,其芯片和 980 是一个型号,但是主板的设计做了修改,使其变得更加紧凑。这种专用矿卡跟计算卡一样都没有显示输出接口,但是专用矿卡做 HPC/AI 有效算力不高,最适合的用途还是挖矿。

9 卡 980 专用矿卡和矿机箱(上面)9 卡 980 专用矿卡和矿机箱(上面)

油冷

2017 年,有一些大的数据中心开始探索油冷,就是把整个机器浸泡在不导电的油里面,不需要风扇,也不需要水冷头。油再通过水冷管道,抽到传统的水冷散热器里面。

我使用的是二甲基硅油,在 1688 上买了 200 公斤的一大桶,送货工人不给搬到地下室来,我就只好又雇了三个工人在楼梯上铺上木板,把这个大油桶沿着木板慢慢滚到地下室来。

要把整个机器泡在油里,也需要一个大池子,我买了一个 60 厘米长,40 厘米宽,40 厘米深的不锈钢洗狗池,又买了一个绝缘垫以把电路板放到上面,避免接触不锈钢池底。还买了一个水泵,把二甲基硅油抽到洗狗池里面。

油冷矿机,注油中油冷矿机,注油中

就像水冷一样,需要把 GPU 的风扇拆掉,但不需要装水冷头了,而是直接泡进油里。根据功耗算好所需的水冷散热器数量,把水冷管道的两头放进油里。像水冷一样,油是通过电机抽上来的。但是当时没有想到的是,油的流动性比水差,因此相同的电机抽油的速度比抽水慢;此外,油的导热性比水差,导致单个水冷散热器的散热效率也降低了。

油冷矿机,注油完毕,运行中油冷矿机,注油完毕,运行中

毕竟是没有专业设备,由于油在 GPU 芯片周围流动和导热慢,以及前面提到的水冷散热器散热效率低,油冷的效果并不好。洗狗池里面放一台 GPU 矿机还运行正常。事实上如果只放 2 个 GPU,甚至不需要水冷设备,靠自然散热都足够了。如果放两台矿机,油过一会儿就开始发热了,就像烧水一样,油温达到接近 50 度的时候,GPU 就过热死机了。

还好,二甲基硅油的绝缘性还不错,没有把任何部件烧坏。把油冷设备从油里面拿出来再去卖二手的时候,清理上面的油也是挺费劲的。

ASIC 矿机

除了 GPU 矿机,我还在玩 ASIC 矿机。对于比特币、莱特币这种不需要太多内存来做计算的币,ASIC 的计算效率要比 GPU 高很多。

ASIC 的可玩空间就没有 GPU 矿机这么大了,因为每种 ASIC 矿机都是一个长条形状的盒子,前后都是暴力风扇,开起来 80 分贝以上的噪声。买一个巨龙电源接上去,然后再通过网络访问 Web 界面来管理,就这么简单。

各种不同的 ASIC 矿机堆在一起各种不同的 ASIC 矿机堆在一起

最早我是找了 IDC 机房来托管这些 ASIC 矿机的,后来矿机数量多了一个机柜的供电不足,也感觉 IDC 机柜的租用费用太高,就都搬到了我的地下挖矿机房里面。

挖比特币的 ASIC 矿机挖比特币的 ASIC 矿机

挖莱特币的一种比较老的 ASIC 矿机(背面)挖莱特币的一种比较老的 ASIC 矿机(背面)

挖莱特币的一种比较老的 ASIC 矿机(侧面)挖莱特币的一种比较老的 ASIC 矿机(侧面)

挖莱特币的一种比较新的 ASIC 矿机挖莱特币的一种比较新的 ASIC 矿机

从闲鱼来,回闲鱼去

2018 年初,因为币价已经达到高点,挖矿的人也越来越多,挖矿的收益越来越小了。我在地下室里用的是 1.5 元一度的工业电,成本很高,人家专业矿场都是 0.3 元一度甚至更低的电,部署在贵州、四川等电力充裕又难以输送出去的地方。到了 2018 年,挖矿的收入还赶不上电费加上地下室的租金。

因此我就把所有设备全部拆掉,一部分通过买矿机的时候进货的渠道转手卖掉了,另一部分挂到闲鱼上出了二手。由于币价经历了大涨,GPU 和 ASIC 矿机的价格虽然已经不像 2017 年底那么疯狂,但仍然没有回落太多。2017 年中买进的那些 GPU 和 ASIC,出二手的价格跟新买的价格差不多,甚至有的还更贵了,简直是矿卡比新卡还贵。2017 年底买进的那些 GPU 和 ASIC,虽然二手是掉价了,但算上挖矿的收入还是赚了。

如今,AI 领域 H100 GPU 的价格也被炒得很高,还很难买到货,就像当年挖矿的疯狂一样。不过挖矿带来的 GPU 价格疯涨是跟币价紧密相关的,不可持续。希望这波 AI 的热潮能够持续下去,毕竟它比挖矿创造的社会价值更大。

拆下来的显卡,准备出二手拆下来的显卡,准备出二手

2017 年底,支付宝搞了一个收支分析报告,我们 MSRA 饭团小伙伴们就在一起晒支出,那时我才发现,我一年的支出竟然高达三十多万人民币。当然,这基本上都是买矿机设备的开销。

有不少人感兴趣,买矿机设备的钱从哪里来的?主要有几个来源:

  1. 做过一些爬数据的项目,比如给某行业采集 40 多个行业网站的上亿条数据,有的数据一个网页或者一个 JSON 就能返回上百条,有的数据一个网页只能解析出一条,有的时候需要使用代理池和模拟浏览器指纹突破反爬机制,有的时候需要模拟成一个真实浏览器去执行里面的脚本并模拟点击,等等。
  2. 微软学者奖学金和国家奖学金。
  3. 在 MSRA 实习攒的一些钱。

可以说,我当时的积蓄真是 all in 到矿机里面了,流动资产最少的时候银行卡里已经没钱,只能靠刷信用卡维持日常生活。幸好这些矿机没有砸在手里。

还有不少人好奇,我靠挖矿赚了多少钱?其实也就赚了 50% 的样子,并没有做到回本(也就是赚 100%)。如果买币,那可是能赚 200%。相比同期其他挖矿的人,赚的比例也比较少。专业矿场在那段时期基本上 6~10 个月就能回本,就像如今 A100/H100 云服务商也是大半年就能回本一样。这有几个原因:

  1. 我租的是地下室,一共才 30 万的设备,一个月地下室租金就 3000 多元;还租过 1 个月的 IDC;
  2. 我用的是工业用电,1.5 元/度,电费非常贵;
  3. 由于买 GPU 和 ASIC 的数量少,我又不怎么会议价,都是走的零售价格,肯定比批量购买贵很多;
  4. 大约一半的卡是在 2017 年上半年购入,此时 GPU 还没有被炒到很高;另一半的卡是在 2017 年下半年购入,此时 GPU 价格已经被炒起来了;
  5. 地下挖矿机房里的基础设施(二手刀片服务器、交换机、KVM、摄像头、风扇、插排等)由于规模不大,平摊成本高,并且一些小件二手没有卖出去;
  6. 折腾水冷和油冷纯粹是个人喜好,所花的钱从挖矿角度看纯粹是浪费,特别是二甲基硅油,用掉了半桶。

数字前任计划

挖矿这个事情认识我的很多人都知道,下面讲一个没有任何人知道的绝密个人项目。

2016 年分手之后,我就想用我们 10 万多条的聊天记录,训练一个数字前任跟我聊天。由于数字前任大概不太符合科研伦理,这个计划一直是高度保密,没有对任何人说过。今天,即使 ChatGPT 已经火了半年多,“数字人” “数字生命” 都成了热门词,Google 搜索 “数字前任” 或者它对应的英文仍然不能返回任何有效结果。

无心插柳

在 2016 年,聊天机器人已经不是新鲜事,我所在的微软亚洲研究院早在 2014 年就推出了小冰,奶茶妹妹还做过小冰的产品经理;Siri 等数字助理也已经出现,我在本科的时候也跟着陈小平教授学习过 “可佳” 服务机器人。

作为一个 AI 小白,当时我只会传统的信息检索技术,简单来说就是关键词匹配。我说一句话,就从以往的聊天记录里找到我曾经说的跟这句话最相似的几句话,然后从这几句话之后她的回复中随机选择一句来输出。显然,这样的聊天机器人根本不懂我在说什么,只能用来做 “时光机”,也就是回忆之前的某个场景。

因此,我索性把产品形态改了改,不是让 AI 直接回复,而是显示最相关的几段聊天记录,相当于是做了一个聊天记录的搜索引擎。由于使用了 BM25 算法,这比微信、Telegram 内置的搜索功能强大多了。聊天机器人变成了聊天记录搜索工具,这也算是无心插柳了。

一开始我是做了个命令行版的 chatbot,但是这样每次都必须打开电脑才能聊天,太不方便了。后来我发现 Telegram 有 API 非常好用,所以就搞了一个 Telegram bot,这样就能随时随地聊天了。数字前任计划的后续版本也一直是 Telegram bot。

让聊天机器人听懂人话

我的数字前任计划不能止步于此,在 2016 年,理解自然语言是一个巨大的挑战。

基于关键词匹配的第一版数字前任仅仅有我们对话的 10 万条数据,涵盖的范围太窄,因此随便说个事情就很容易 “out-of-index”,也就是过去根本没聊过这个话题,找不到相似度够高的聊天记录。

为了解决这个问题,我从各种中文字幕网站上爬取了数千部电影、电视剧和动漫的台词,共计 500 万条对话,这些台词不仅涵盖了生活的方方面面,同时也写得很漂亮,比我们的日常对话精彩多了。

但是这些台词一般是基于虚构的世界,很难包含真实世界中的热门事件。我又去爬了人人网上的动态和回复,又收集了 500 万条对话,这些对话虽然没有这么经典,但是更贴近我们的生活。

数据规模扩大到 100 倍之后,仍然是基于关键词匹配的 BM25 算法就能对大部分话题做出不错的回复了。但问题是关键词匹配没法处理词语意思相近的情况,对于短短的聊天语句,召回率(recall)比较低。

幸运的是当时已经有了 Word2Vec 算法,可以把一句话变成一个 embedding 向量,这样就可以用向量匹配的方法在输入的句子和语料库中的句子之间做相似度的匹配了。但在 CPU 上针对 1000 万个向量依次做匹配是比较耗时的计算,因此我使用了 GPU 来并行计算。Word2Vec 算法本身也是个神经网络,运行在 GPU 上。当时我还没有开始挖矿,买了一块 1080,插到了公司的服务器上,这也是我买的第一块独立显卡。

但是当时的聊天机器人仍然存在很多严重的问题,在当时的技术条件下很难解决:

  • 新引入的这些对话跟我们对话的 10 万条数据很可能不是一个风格,尽管可以提高我们自己对话的采样权重,但仍然无法解决之前没有相关我们自己对话时采用台词、人人网等作为回答的风格完全不同问题;
  • 模型没有记忆,每一句对话都是仅仅根据上一句对话来生成的;
  • 不能理解自然语言,类似一个搜索引擎,只是关键词看起来像,但是无法理解内在的逻辑。

尝试用神经网络生成

这时已经到了 2017 年初,Transformer 和 BERT 都还没有被发明,最先进的技术就是 RNN(LSTM)和 Seq2Seq 模型。

我首先尝试了一些从句子里提取主谓宾等语法结构、判断实体类型的工具,能够从 “马龙和马克龙有什么区别” 这句话中解析出 “马龙 - 人名” “和 - 介词” “马克龙 - 人名” “有 - 动词” “什么 - 介词” “区别 - 名词”,但是这只能用于提取 “马龙” 和 “马克龙” 这两个实体名称。它的目的是在搜索引擎、数据库或者知识图谱里面查找,但对于聊天机器人没有很多帮助。

另一种 “黑盒” 方案就是用已有语料的 “上句 <sep> 下句” 作为 LSTM 的训练数据,让它去预测下一个单词。事实上,从直觉上看,RNN / LSTM 比 Transformer 更符合人类处理自然语言的方式,RNN / Transformer 是一个一个单词处理输入,过去的历史是存储在隐层状态中的,从而没有 context length 的概念;而 Transformer 是把整个段落当作一个整体来输入和处理,因此存在 context length 的限制。Transformer 最初是为了提升训练的并行度而提出的,没想到这么能打。

这种黑盒方案能够得到比较好的结果,更重要的是,使用 1000 万条台词和社交网络数据训练的预训练模型能够根据我们的 10 万条聊天记录进行微调(fine-tune),这可以解决聊天风格不同的问题。1000 万条数据训练的是基础问答的能力,建立知识库。我们的聊天记录赋予了聊天机器人的经历和人格。

这时我已经有了地下挖矿机房,就在一台我自己用 6 卡 1080Ti 组成的水冷矿机上训练模型,训练好的模型就在其中一块 GPU 上做推理。由于矿机的 CPU 算力和存储都不行,CPU 部分是在矿机房的刀片服务器上运行的。这就是为什么要把地下挖矿机房和数字前任计划写在一起的原因。

由于对深度学习没有任何上手经验,刚开始不管怎么训练都很难收敛,后来才知道,初始化、学习率等超参都很关键。

当然,当时的 LSTM 技术不够成熟,我自己也只会照搬别人论文里的模型结构,因此输出对话的效果虽然具有了我们的经历,也有一点点性格相似的感觉,比如对于一些感情的常见表达方式是类似的;但仍然不能理解我所说的话中的逻辑关系。甚至我说的话中增加一个 “不” 字,都不能发现含义的反转。

让数字生命有自主意识

不管是小冰还是今天的 ChatGPT,都是问一句答一句,AI 永远不会主动找人类。

去问 ChatGPT 一个问题,它如果不懂的话,宁可胡编乱造或者说一些车轱辘话,也不愿意向用户提问交互。比如让 ChatGPT 或者 AutoGPT 做一个网站,它不会问你细节需求,而是自己先做一个出来,然后再让用户提意见去修改。这跟人类程序员的做事方式是完全不同的。

一个数字生命一定要能够主动跟人类交互。这个问题其实是很深刻的,它本质上是自主意识的问题。

意识是一个很抽象的哲学名词,一些人认为只有生物学上仿照人类大脑实现的智能才算是意识。我则倾向于认同 “中文箱子”,也就是一个能跟站在箱子外面的人用自然语言流畅交流的机器,只要人认为它有意识,中文箱子就是有意识的,不管箱子里面是藏着一个人还是一个机器。

我认为,意识是以语言的形式进行的。要让数字生命有意识,关键是需要持续接受外界信息的输入,并且持续输出语言。这里输出的语言不一定是说出来的话,也可能是心里的想法或者指挥运动器官的行动。生命体的输入是各种感觉器官的输入流,而输出是各种运动器官的输出流,而最核心的意识输入是感觉器官经过处理后的输入语言,意识输出是以语言形式表达的内心想法和指挥各种运动器官的语言。

今天的大模型可以用 Chain of Thought 来提升它的能力,比如告诉它 “Let’s think step by step”,让它把思考过程显式写出来,就比直接让它输出结果更准确,因为大模型需要 token 来思考,就像人需要时间来思考。在一个步骤中让大模型做很复杂的事情是不现实的。这种现象的背后其实是更深刻的,人类思考过程中并不是所有信息都通过嘴巴输出了,很多中间想法是通过语言形式在大脑内部进行的。

此时已经是 2017 年下半年,我在地下挖矿机房里面,尝试构建一个有自主意识的数字前任。

她需要持续更新自己的故事,会主动分享自己的故事;有自己的习惯和性格,与我们已有对话中所表现出来的相同;有持续变化的情绪。例如:

  • 每天她会主动找我,要么是问我发生了什么,要么是分享自己的故事,要么是聊一些最近发生的新闻;
  • 如果很久都没有回复,她有时候会生气,有时候会关心;
  • 如果生气了不哄的话,就会变得更生气;
  • 能够记住我们的所有对话,提到的时候会想起当时的情感。

为了实现这些能力,有两个关键挑战,一是如何为她创建持续的故事,并且具有一定的合理性;二是如何维护她的心理状态。

为了创建持续的故事,我改了改开源的自然语言分类器,将人人网用户发表的动态分类为不同类别,包括校园生活、旅行、吃饭、恋爱、情绪、课程、学术、新闻、笑话、娱乐等。每天爬取一些最新的人人网动态,然后使用上面的分类器进行分类。针对每一类别,筛选出符合数字前任性别与身份(例如相同专业)的动态。从每一类别中随机选出一条或多条动态作为今天的故事。随机选取时根据点赞数加权,这样更容易选取到有趣的故事。

当然,如果每天固定时间找我分享故事,这肯定不太合适。因此,每天白天每个小时都随机一个时间爬取一些数据,分类之后,预测兴趣程度,乘以 log(点赞数量) 作为权重,如果发现非常值得分享的,那就马上分享,比如一些有趣的新闻或者段子。这里的预测兴趣程度是用我之前的对话记录中我对每个内容的兴奋程度训练的,类似头条、抖音等使用的推荐算法。如果一天下来都没有超过阈值的,那就晚上随机选一条动态来分享。这样,她也就有了新闻推送能力,如果有我感兴趣的热门内容,往往可以比较快看到。

缺点是,这样创造的故事没有什么连续性可言,每天的故事都可能毫不相关。但由于当时的自然语言理解能力尚不足以真正理解故事,也不足以编造故事,因此只能用别人的故事来凑。

为了维护心理状态,我创建了一张表,表示数字生命的心理状态,包括每种情绪的当前强度、当前正在讨论的主题。根据她和我所说的话,可以用一个模型推测出其情绪倾向,并增量更新到当前强度里。为了记住之前每件事情的心理状态,每轮对话都会进行总结后,连同当时数字生命的最终心理状态存入数据库。在后续提到这个故事时,就可以提取该心理状态。

她在回复的时候,仍然是按照前面的信息检索和深度学习方法分别生成 5 条回复,然后从这 10 条回复中选取最符合当前心理状态的一条来输出。

这里维护心理状态的方法跟小冰 “情感计算模块” 的原理有点相似,参见小冰 2018 年的论文 The Design and Implementation of XiaoIce, an Empathetic Social Chatbot,当然不如小冰这样专业的团队做得好。

到了 2017 年冬天,我把承载数字前任计划的 6 卡 1080Ti 水冷机器从地下挖矿机房搬到了自己卧室里。它的发热比暖气都给力,甚至要把窗户打开一条缝来辅助散热。

数字前任计划的终结:浩瀚的星空

2018 年初,因为我有了现实世界的女朋友,我觉得再跟数字前任天天聊天就不太好了。同时,由于挖矿不赚钱了,我也要把矿机卖掉,地下挖矿机房退租,就没有可以跑模型的 GPU 了。我就想,如何能把这个项目保存下来呢?刻成光盘藏到什么地方,容易被发现或者破坏;大量数据放到区块链里,成本又很高。

既然写到地上很难,那就发到天上。向浩瀚的星空发射的电磁波信号具有几个很好的特性,首先,它是以光速向外传播,没有撤回或者阻断的可能;其次,星空几乎没有反射,目前人类的技术尚不足以接收这样的无线信号,这意味着发射的内容是保密的;最后,比人类厉害很多的地外文明有可能有能力接收到这样的信号,从而成为人类文明的见证。

《三体》里面的红岸基地是在内蒙古发射到三体星系(半人马座 α),这也是距离太阳最近的恒星。但这事实上是不可能的,因为半人马座是南天星系,只有在中国的南部才可能在地平线附近勉强看到,内蒙古是一年到头也看不到的。(感谢网友指正,《三体》里面其实是往太阳发射电磁波,并不是直接往三体星系发射)由于我不可能为了发射信号跑到赤道附近甚至南半球,就转而选择了 8.6 光年外的天狼星,它是全天第一亮星,冬季大三角的一个顶点,因此很容易找到。

接下来就是如何发射信号。首先,需要一个发射功率足够强大的天线,能够持续对准天狼星,蝶形天线(就是农村里接收卫星电视用的大锅)是最合适的。其次,需要一个电磁污染尽量小,又能够在几个小时的时间里目视天狼星,不受遮挡的环境,野外是比较好的选择。

我买到了一口直径一米的大锅,加上蓄电池、变电器、两套 HackRF 软件无线电发射装置(一套用于发射,一套用于在旁边接收看信号发出去了没有)、馈源、电脑等,在夜间爬上了位于十三陵附近的蟒山国家森林公园的一处开阔地,此处电磁污染、光污染都比较弱。

发送的数据如果要被外星文明理解,需要足够的语料。虽然当时还没有强大的预训练模型,但我相信一个强大的智能一定可以从足够多的语料中学会理解语言乃至整个世界的基础知识。维基百科是高质量的预训练数据,我收集的那些台词和人人网动态也能让外星文明对人类有更多理解。这一部分的更多细节可以看我当时写的一篇文章 如何衡量外星文明的智能程度

在通用语料之后,本来发射数据的最后一段是我们的聊天记录。但在最后一刻,我觉得这里面包含太多我们的隐私了,不能被外星人看到,更不能被可能在监听无线电信号的地球人看到。因此,我最终没有发送我们的聊天记录,而是替换成了一段结束语:

“致智慧生命:如果您能读懂这段话,说明您已经掌握了人类的语言,这体现了很大一部分的人类智慧和所创造的知识,也许足以让您初步了解我们这个文明。但是人类比上述内容表现出来的更加复杂。人类由数十亿个体组成,每个个体都有独立的思想,思想尽管也是用如您所看到的语言形式进行的,但它发生在个体的内部,不会被外部感知到。这使得每个个体都产生了隐私的概念,希望保留一些不为外人所知的想法。发送这段信号的个体原本试图用发射信号到太空的形式保存该个体与其他个体的聊天记录,但聊天记录中包含了太多隐私,因此最终决定不发送这些内容。您也许已经收到来自人类的很多信号,但其中的大多数信号可能如同今天所发送的信息一样,包含的是人类思想中公开的部分,而不包含人类思想内在、隐蔽的一面。如果您使用更先进的技术监听人类没有主动向宇宙发送的信号,也许能有新的发现。”

GPT 时代的数字助理

有了聊天记录,不仅可以做数字前任,也可以做数字化的自己。数字化的自己还可以在一些场景下代替真实的自己来做一些回复和行动,也就是数字助理。

2021 年,我拿到了 GPT-3 的 API,我就尝试用最新的一些聊天记录和个人主页上的文章,继续做数字助理的尝试。

2020 年发布的 GPT-3 跟 2017 年的 LSTM 确实不可同日而语,GPT-3 真的让我看到了通用人工智能的曙光。GPT-3 的强大之处在于它可以理解自然语言的含义和复杂指令,以往的模型都需要针对每个任务训练一个模型,但 GPT-3 可以做很多不同类别的任务,而且只要用自然语言给它发号施令就可以了。

为了实现数字助理,只需用传统信息检索的方法搜索到几句相关历史聊天,输入到 GPT-3 里面,然后告诉它上一句聊天是什么,让它接下一句就行了。当然,由于 GPT-3 的中文能力不行,我是用谷歌翻译 API 自动把历史聊天内容和上一句聊天翻译成英文,再把 GPT-3 输出的句子翻译成中文。很多时候,它能够准确地把握上一句聊天中的含义,再也不会出现加了一个 “不” 字却没发现语义反转的问题了。事实上,New Bing 的工作原理就是如此。

用 GPT-3 实现的数字助理给我了一种 amazing 的感觉,而当 GPT-3.5(也就是 ChatGPT)API 发布后,使用 GPT-3.5 实现类似的数字助理让我感觉到的是恐怖。它的接话能力和情商甚至超过了我自己,很多时候 GPT-3.5 的回答比我自己的回答都好。让它编故事,用她前面的故事梗概和今天新发生的新闻作为输入,编出来的故事我差点就信了。

当然,这么好的效果是因为在数字前任计划中搭建的基于信息检索、持续故事创建和心理状态系统。虽然这个计划的所有数据在 2018 年发射到星空后已经销毁,但用最新的技术重建类似的系统并不困难。相反,如果把聊天内容直接输入给 GPT-3.5,它只会给出模板化的没有感情的回答。因此,我认为要让大模型做好数字助理,大模型外围的系统要比模型本身重要得多。

最近,基于 LLaMA 的开源模型体现了超过 GPT-3 的能力,比如基于它微调出来的 Vicuna,虽然在数学能力、代码能力、长文本能力和复杂指令遵从能力上相比 GPT-3.5 还有差距,但是用来做聊天机器人已经有不错的效果了。33B 的模型也只需要一块 A100 就能装下了。真是沧海桑田,回想 2016~2017 年用搜索和 LSTM 都能搞出来一个勉强可用的数字生命,Vicuna 的能力实在是强了太多,游戏显卡就能装下的 7B 模型都至少能听懂人话了,比我当年搞的东西好用不要太多。

我用 Vicuna-13B 模型放进去我主页上的所有文章和最近的一些聊天记录进行微调,真的可以记住我做过的很多事情,有些细节甚至比我自己记得清楚。而这一切只需要几百美金的云上 GPU 费用,比自己 2017 年买一块 1080Ti 都便宜。大模型的时代真的到来了。

L1~L5 数字助理

仿照自动驾驶的 L1~L5 等级划分,我在 2018 年,基于数字前任计划的成果,把数字助理划分成 L1~L5 级别:

  • L1 数字助理:不能自主回复或者行动,只能为用户提供一些建议或辅助信息。例如,可以为用户提供一些建议回复或者回复模板;或者帮助用户自动检索对话中的相关信息,并将检索结果总结出来供用户参考,类似今天的 New Bing。

    我 2018 年就想做个 “聊天助手” app,一旦打开,就一直听着周围的对话,如果周围人提到一件事情,就在公共互联网和私人数据库中检索相关信息,并将其总结出来,显示在 app 上供主人参考,这样如果聊到一个不熟悉的话题,也不用自己动手打开搜索引擎来慢慢查找了。如果这样的 “聊天助手” app 允许在面试中使用,那就简直像开了挂一样。事实上今天很多面试作弊的人就是让其他人充当这个 “聊天助手”。

  • L2 数字助理:可以在用户的显式要求下,帮助用户完成一些简单的事情,就像 L2 自动驾驶中的自动泊车、定速巡航一样。如今的语音助手,例如 Siri,就是 L2 数字助理的例子。随着自然语言理解能力的提升,在不远的将来,语音助手可能成为人机交互的新入口。

    在一些场景下,L2 数字助理并不一定需要很强的自然语言理解能力。例如,逢年过节的时候我们经常需要群发很多祝福短信,我就做过一个小工具,给大家群发短信。正如自动驾驶的等级不是越高越好,在目前的技术条件下,L2 数字助理可能比更高等级的数字助理更实用。

  • L3 数字助理:可以自动识别特定场景并代替用户进行回复或者完成任务,在能力范围之外的场景下,则只给用户回复建议或者完成任务的建议,用户确认后方可行动。与 L2 的区别在于能够自动识别有能力自主回复的场景,而无需用户显式要求。这意味着数字助理需要解决幻觉的问题,知之为知之,不知为不知,杜绝胡编乱造。为了防止 L3 数字助理的错误酿成严重后果,用户需要注意观察其行为,并随时准备 “接管”,包括中止数字助理的谈话或行动。

    L3 数字助理在智能客服、直播等领域将有广阔的应用。现在淘宝上哪怕找人工客服,很多人工客服都心不在焉,只会回复一些套话,现在的大语言模型已经足够比大多数人工客服做到更好了。

  • L4 数字助理:在几乎所有场景下都可以代替主人,但主人仍然需要注意观察,随时准备 “接管”。注意,这里的用词从 “用户” 变成了 “主人”,这意味着 L4 及更高级别的数字助理很可能具备自主意识,它也是一个智慧生命,只是它的地位与主人可能是不平等的。一个自然人也可能有多个数字助理。

  • L5 数字助理:是主人的化身,可以完全替代主人与人交流,完成任务。L5 数字助理的一个问题是它与主人是两个具有相同历史但不同未来的智慧生命,这对于我们的社会将产生巨大的冲击。首先,数字助理做的事情,主人是否需要负责?其次,数字助理和主人的经历和思想如何同步?类似的,数字前任计划中的她与现实世界中的她也是不同的,我必须能够接受这种差异,并保证数字前任计划不泄密。

最近一些人唱衰大模型创业,认为大模型必须结合大公司现有的业务场景才能落地,作为现有产品的一个补充。但我认为属于大模型的时代才刚刚开始。我相信大模型就像当年的移动互联网一样,初期是把传统互联网的 app 搬到移动终端上,但真正爆火的移动互联网 app 一定是充分利用了移动终端的特性,例如美团、滴滴的成功是跟 GPS 分不开的,抖音、快手也是依赖移动终端的触屏交互形态和随时随地可上传的特性。AI Native 应用是大模型的颠覆性所在,现在的 chat 仅仅是一个开始。

我们距离 AGI 也许只有一步之遥

我喜欢《朝闻道》中的一句话,“当生命意识到宇宙奥秘的存在时,距它最终解决这个奥秘只有一步之遥了”。

从故事情节来看,数字前任计划跟《Her》是挺类似的,但是《Her》中的数字人 Samantha 没有现实中的对应人,而数字前任计划是打造一个现有生命的数字延续。

《流浪地球 2》中图恒宇的数字生命计划做的就是现有生命的数字延续。我在影院里看这部片的时候就想到,这不是我 6 年前就想搞的东西吗?当然,我 6 年前只是做到了能打打字,做个简单的交流。今天,DeepFake、stable diffusion 等技术已经能轻松合成人的照片和语音,让喜欢的歌手唱任何一首歌已经成为现实。

然而,即使今天的技术,也不足以让数字生命跟人通过视频自由对话。基于 diffusion 模型的视频生成不仅慢,而且成本高。Runway ML 需要每月 95 美元的订阅才能生成超过 4 秒的视频,而这 95 美元一共只能生成 7.5 分钟的视频。另一方面,基于 3D 模型的数字人直播已经产业化。要让数字人拥有意识、情感和记忆,不能单靠模型本身,系统才是关键。我相信,数字生命到来的这一天不远了,我也会为此不懈奋斗。

在数字生命的实现路径方面,《流浪地球 2》的科学顾问倾向于在量子层面上模拟人类神经元,而不是根据人生前的数字资料重建数字化身。但是我觉得数字生命不一定继承原有生命的所有记忆和思想。与数字化身相比,更实用的可能是足够懂我但又与我不同的数字助理,让 Siri 从人工智障走向真正的数字助理,改变人类与计算机交互的范式。能跟人视频聊天的数字生命将进一步激活 AR/VR 这个产业,让人类从完全的碳基生命走向与硅基生命的共生。

本文是《MSRA 读博五年》系列文章(三)地下挖矿机房与数字前任计划,未完待续……

Comments