数据采集方面,我们构建了TDBank,让原来通过接口机传文件的方式,T+1的粒度,变成了毫秒级的实时采集。在这个采集平台里面,我们自研的消息中间件,每天采集的消息条数超过6.5万亿,可以说是世界上消息量最大的消息中间件。同时,我们还有高可靠版本的消息中间件,能支持像金融、计费等高一致性的需求,保证消息不丢。
在资源调度层面,我们基于Yarn,发展了我们的Gaia调度平台,Yarn只支持CPU和内存的维度,而我们的Gaia还支持网络以及磁盘IO的维度,Yarn只支撑离线计算,Gaia能支持在线的场景,另外,我们还支持Docker,我们平台现在每天有1.5亿个container。
再拿刚才提到的推荐例子,基于第一代平台的推荐应用会碰到2个问题,一个是随着用户量,访问量的增多,产生的数据会越来越多,多到在有限的时间根本不可能批处理的计算完,还有一点是用户的行为模式变化很快,需要更快的去更新各种维度的用户画像;数据的实时采集让用户行为,实时画像的计算成为可能,这构成了流式计算的数据流,分布式的流式计算实时更新各个维度的统计量,进一步形成了推荐算法的实时训练数据,从而把上一代的 offline 的推荐系统变成了 online 的实时推荐系统。在广告的推荐应用上,我们可以看到每一次的实时加快,都带来了更大的点击率提升。
第二代的平台,实时性和体量方面,都能满足绝大多数业务需求。但随着我们的数据量越来越大,我们的瓶颈很快也出现了。
我们在Spark上做数据训练的时候,每一轮的迭代,在更新数据的时候,都会遇到网络方面的瓶颈,因为更新数据的地方是一个单点,如果数据的维度很大,这套框架就无法支撑。在我们的实际应用中,千万级的维度,都可以run得不错,但是上了亿级,性能就非常低了,甚至跑不出来。
所以,我们必须要建设一个能支持超大规模数据集的一套系统,能满足billion级别的维度的数据训练,而且,这个系统必须能满足我们现网应用需求的一个工业级的系统。它能解决big data,以及big model的需求,它既能做数据并行,也能做模型并行。
有两种思路。
一个是基于第二代平台的基础上做演进,解决大规模参数交换的问题。另外一个,就是新建设一个高性能的计算框架。
我们看了当时业内比较流行的几个产品,GraphLab,主要做图模型,容错差;Google的Distbelief,还没开源;还有CMU Eric Xing的Petuum,当时很火,不过它更多是一个实验室的产品,易用性和稳定性达不到我们的要求。
看了一圈,我们决定自研,走自研的路。我们前两代都是基于开源的,第三代则开始了自研的历程。其实在第二代,我们已经尝试自研,我们消息中间件,不论是高性能的,还是高可靠的版本,都是我们自研的。他们经历了腾讯亿万流量的考验,这也给了我们在自研方面很大的信心。
因此,第三代整体的计算框架方面,我们也走了自研的道路。第三代的平台,核心是一个叫Angel的高性能计算平台。
我们聚焦在高性能的计算框架方面,同时,也是我们往机器学习、深度学习演进的一个路线。
相比第二代,第三代的计算框架,可以支持10亿级维度的算法训练,由以前的数据并行,到可以支持模型并行。