文 / 汪源
MapReduce、BigTable等系统的创造者Jeff Dean于2013年1月19日在斯坦福大学演讲的内容纵贯系统软件与机器学习两大领域。通过对资源共享及其带来的响应时间波动问题、异步分布式随机梯度下降算法及其应用这两块主要内容的介绍,Jeff Dean深入展示了通用、简洁、Just Works系统的强大魅力。同时演讲中展示的在深度学习领域取得的突破尤其振奋人心。
在Google众多杰出的计算机科学家中,Jeff Dean可能是最知名的。这不仅是因为Jeff Dean设计的MapReduce和BigTable等系统人尽皆知,开风气之先,也因为Jeff Dean比较喜欢做技术演讲。虽然只涉及Google强大技术的只鳞片爪,Jeff Dean的每次演讲都足以成为我们学习模仿的对象。
2013年1月19日,Jeff Dean在斯坦福大学做了题为“Large-Scale Data and Computation: Challenges and Opportunities”的演讲,从系统领域讲到机器学习领域,内容同样让人耳目一新,非常值得细细学习。
在这次演讲中,最核心的内容有两点:一是资源共享及其带来的响应时间波动问题;二是异步分布式随机梯度下降算法及其应用。
资源共享及其带来的响应时间波动问题
首先介绍资源共享及其带来的响应时间波动问题。为提高硬件资源利用率,Google的每台服务器可能同时承担很多种任务(看来Google虽然财大气粗,也是非常关注节约硬件成本的)。如图1所示,一台服务器可能既负责存储GFS中的某些chunk和BigTable中的某些tablet及承担一些CPU密集型的计算,又可能动态按需执行一些MapReduce的任务或应用逻辑。
资源共享,虽然能极大提升资源利用率,但同时也会导致操作响应时间变得不稳定。这是因为资源利用率越高,业务负载波动导致系统局部过载的概率就越大。
对于Google这样的复杂系统,基础操作的响应时间波动带来的影响更大。如图2所示,一次Google搜索需要通用Web搜索、广告、新闻等众多服务的配合,这些服务又需要存储等基础服务的支持。这样,一次搜索就会产生极大量的基础操作,这些基础操作的响应时间波动带来的影响就会被层层放大。为理解这一点,Jeff Dean做了一个简单的计算。假设1次基础操作的平均响应时间是10ms,99%响应时间是1秒。
如果1个业务操作需要做100次这样的基础操作,那么它的平均响应时间是1秒。这看起来似乎可以接受,但如果更仔细地计算一下会发现,实际上高达(公式1)的情况下某些基础操作的响应时间将超过1秒,从而导致业务操作的整体响应时间将超过2秒。
实际上,其中有两次基础操作的响应时间超过1秒,导致业务操作的整体响应时间超过3秒的概率仍高达(公式2)。因此,业务操作的响应时间分布将呈现出显著的长尾现象,大量业务的服务质量将不尽如人意。
因此,保证基础操作的响应时间尽可能稳定变得异常重要。实现这一点的常用方法是定期调整负载均衡策略来减少系统局部过载的概率(如果全局过载那只能扩容了),当然Google也这样做了。除此之外,Jeff Dean在演讲中还重点介绍了一种称为关联请求(Tied Request)的通用策略。
关联请求的原理是把操作请求发给两个都可独立完成服务的子系统,并告知对方的信息。如果在一个子系统中操作请求完成排队开始执行,就通知对方取消执行。对方收到通知后,如果操作请求还在排队,则取消执行。当然,如果操作也已经开始执行了,则不一定能取消,这时将带来额外的系统开销。
Google的经验是在数据中因为有低延迟的通信网络,这种操作在两个子系统都执行的最差情况发生的概率可以降到很低。
关联请求策略在降低GFS读操作响应时间上取得了非常好的效果。在处理GFS读请求时,GFS客户端首先发送关联请求到其中一个复本,如果2ms之后该复本上的读操作还没有开始,则再发送关联请求到另一复本。
表1显示了使用关联请求策略改善GFS读操作响应时间的显著效果。可以看到,无论是空闲还是繁忙的系统,关联请求策略都可以将90%~99.9%响应时间降低40%左右。
同时也可以看到,优化后,繁忙系统的响应时间基本与优化前基本空闲的系统相当。关联请求策略似乎“神奇”地消除了负载增加对响应时间带来的负面影响。当然,读者可能会担心这一策略是否增加了大量额外的读操作。关于这一点,Jeff Dean透露为此增加的读操作只有约1%,非常低。
实际上,关联请求策略在降低GFS读操作响应时间中体现的效果还不是最显著的,Jeff Dean在另一个题为“Achieving Rapid Response Times in Large Online Services”的演讲中还讲到一个效果更显著的测试结果。在这个测试中,使用关联请求优化后,每千次BigTable内存读操作的平均和99%响应时间降低了约60%,99.9%响应时间更是降低了约95%。
通过如下的简单计算就可以说明关联请求策略为什么有效。同样用上述平均响应时间10ms而99%响应时间1秒的例子。如果不用关联请求策略,那么1%的情况下响应时间会超过1秒,但如果用了关联请求策略,由于两个子系统是独立的,那么超过1秒的概率就只有0.01%。
异步分布式随机梯度下降算法及其应用
再来介绍异步分布式随机梯度下降算法及其应用。Google有很多重要产品(如机器翻译、语音识别等)的核心是机器学习。
近年来很多学术成果表明使用多层复杂神经网络的深度学习(Deep Learning)技术可以有效改进很多机器学习任务的性能,并发展了GPU计算技术使得训练千万个参数级别的模型成为可能(参见Jeff Dean为第一作者发表的论文“Large Scale Distributed Deep Networks”)。但很多Google产品的数据规模实在太大,要有效应用深度学习技术,至少需要10亿参数级别的超大规模神经网络。这样,就必须依赖大规模集群的并行计算能力,才能完成Google所需的超大规模网络模型的训练。
神经网络的训练本质是一个最优化问题(实际上机器学习的大部分问题都是最优化问题),而随机梯度下降(Stochastic Gradient Descent)算法可谓求解最优化问题的不二法门。最优化问题是求解使目标函数取得最小值时的参数值(通常是个向量)。使用随机梯度下降算法求解最优化问题时,首先用某种方法选取参数的初始值,然后持续随机选取某一训练数据来更新参数值。针对选择的训练数据,每个参数值将获得与其偏导数成某固定(一般很小)比例但反向的更新,即如下面的公式所示,为目标函数,为第个参数,为更新的固定比例,一般称为学习速率。系统会重复执行上述更新过程,直到最终获得的更新量足够小,这时所得的参数值将接近最优解,算法停止(理论上讲,算法可能陷入局部最优解或无法收敛,但实际应用中很少会发生)。这一算法容易直观理解,使用与其偏导数成某固定比例但反向的量来更新,将使得目标函数稍稍趋向于0,并且偏导数越大,更新量越大,学习得“越快”。
随机梯度下降算法是机器学习中非常基础的算法,但缺乏优秀的分布式并行实现。Jeff Dean等人观察到大多数深度学习所用的网络模型可以良好地分区。基于此观察,他们设计了一个性能和容错性都非常好的分布式并行随机梯度下降算法(Asynchronous Distributed Stochastic Gradient Descent,以下称Async-SGD算法)。
现在来介绍下Async-SGD算法的基本原理。如图3所示,训练数据被分成多份(Data Shard),每份训练数据由一个模型训练集群复本(Model Workers)来处理。每个模型训练集群复本又可能包含很多台服务器,每台服务器将负责某些模型分区的训练。模型的参数统一存储在一系列参数服务器(Parameter Server)上,也做了水平分区。
由于模型可以良好地分区,每台模型训练服务器只需要访问少量的参数服务器来存取它所负责的模型分区所需的部分参数。这样,训练数据、模型、参数都可以并行处理,系统因而就具有很好的可伸缩性。同时,部分模型训练服务器宕机不会影响到其他模型训练服务器,系统的容错性也很好。模型训练服务器可进行一批多次迭代后才更新参数到参数服务器。通过调整这一“批次”大小,还能提高并行计算性能(当然这样训练出来的模型精度可能会下降)。对这一算法的细节感兴趣的读者可以参考上面提到过的“Large Scale Distributed Deep Networks”这篇论文。
基于随机梯度下降算法在机器学习中的核心地位,算法一突破,大量产品就能广泛受益。在演讲中,Jeff Dean重点讲了Async-SGD算法的3个应用,每个都是超重量级。
比如,某个神经元是一个很好的人脸检测器,而另一个神经元则是一个很好的猫脸检测器。同时,以此无监督学习的结果为起点,结合ImageNet的标签数据,也非常显著地提升了对ImageNet图像的分类性能。
除了上述介绍的两大主题,Jeff Dean的这次演讲内容广泛(PPT就长达124页),还涉及了数据中心、系统架构、Spanner等众多其他主题。因为篇幅有限,加之Jeff Dean对这些主题的介绍是点到即止,不怎么深入,这里就不一一介绍了。
启示
介绍完演讲内容,叹服之余,我想更重要的是思考Google的经验能给我们带来什么启示。
Jeff Dean能突破自己之前一直根植的系统领域,“跨界”到机器学习领域并能做出杰出的工作,我想主要就是因为他始终坚持做通用、Just Works系统的理念。如果再看一看计算机领域,应不难发现诸如关系数据库、事务处理、UNIX等系统大获成功的原因,即它们都提供了简洁优雅的抽象,从而使得系统既功能强大又易于使用。因此,对工程师和架构师来说,把系统做到通用、简洁、Just Works确实非常重要。我想,只有理解这一点,我们才算触及了Jeff Dean这次演讲的实质。
我想,从本质上说,如果希望机器的智能接近或超越人类的智能,机器所用的模型应具备与人脑相当的复杂结构;而如果有了正确的方法,更复杂的模型自然能蕴含更多的智能。因此,通过分布式计算以支撑越来越复杂的模型,将是机器学习发展的必经之路,同时也很可能是希望之路。
Google目前能训练的模型还不超过20亿个参数,Jeff Dean说希望将来能做到1000亿个参数。希望Jeff Dean能早日实现这一愿望,届时Jeff Dean可能会向我们展示更为震撼的人工智能图景。
作者汪源,网易杭州研究院副院长。长期耕耘于数据库与海量数据处理领域。现负责网易公司在多媒体、信息安全、大数据、云计算与数据库等公共技术的研发工作。
转载至http://www.programmer.com.cn/15162/