技术开发 频道

Just Works:Jeff Dean斯坦福演讲启示

  【IT168 评论】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 的任务或应用逻辑。

Just Works:Jeff Dean斯坦福演讲启示
▲图 1 服务器承载的任务

  资源共享,虽然能极大提升资源利用率,但同时也会导致操作响应时间变得不稳定。这是因为资源利用率越高,业务负载波动导致系统局部过载的概率就越大。

  对于 Google 这样的复杂系统,基础操作的响应时间波动带来的影响更大。如图 2 所示,一次 Google 搜索需要通用 Web 搜索、广告、新闻等众多服务的配合,这些服务又需要存储等基础服务的支持。这样,一次搜索就会产生极大量的基础操作,这些基础操作的响应时间波动带来的影响就会被层层放大。为理解这一点,Jeff Dean 做了一个简单的计算。假设 1 次基础操作的平均响应时间是 10ms,99% 响应时间是 1 秒。

Just Works:Jeff Dean斯坦福演讲启示
▲图 2 Google 一次搜索所依赖的服务

  如果 1 个业务操作需要做 100 次这样的基础操作,那么它的平均响应时间是 1 秒。这看起来似乎可以接受,但如果更仔细地计算一下会发现,实际上高达的情况下某些基础操作的响应时间将超过 1 秒,从而导致业务操作的整体响应时间将超过 2 秒。

  实际上,其中有两次基础操作的响应时间超过 1 秒,导致业务操作的整体响应时间超过 3 秒的概率仍高达。因此,业务操作的响应时间分布将呈现出显著的长尾现象,大量业务的服务质量将不尽如人意。

  因此,保证基础操作的响应时间尽可能稳定变得异常重要。实现这一点的常用方法是定期调整负载均衡策略来减少系统局部过载的概率(如果全局过载那只能扩容了),当然 Google 也这样做了。除此之外,Jeff Dean 在演讲中还重点介绍了一种称为关联请求(Tied Request)的通用策略。

  关联请求的原理是把操作请求发给两个都可独立完成服务的子系统,并告知对方的信息。如果在一个子系统中操作请求完成排队开始执行,就通知对方取消执行。对方收到通知后,如果操作请求还在排队,则取消执行。当然,如果操作也已经开始执行了,则不一定能取消,这时将带来额外的系统开销。

  Google 的经验是在数据中因为有低延迟的通信网络,这种操作在两个子系统都执行的最差情况发生的概率可以降到很低。

  关联请求策略在降低 GFS 读操作响应时间上取得了非常好的效果。在处理 GFS 读请求时,GFS 客户端首先发送关联请求到其中一个复本,如果 2ms 之后该复本上的读操作还没有开始,则再发送关联请求到另一复本。

  表 1 显示了使用关联请求策略改善 GFS 读操作响应时间的显著效果。可以看到,无论是空闲还是繁忙的系统,关联请求策略都可以将 90%~99.9% 响应时间降低 40% 左右。 

Just Works:Jeff Dean斯坦福演讲启示
▲表 1 使用关联请求策略改善 GFS 读操作响应时间的显著效果

  同时也可以看到,优化后,繁忙系统的响应时间基本与优化前基本空闲的系统相当。关联请求策略似乎“神奇”地消除了负载增加对响应时间带来的负面影响。当然,读者可能会担心这一策略是否增加了大量额外的读操作。关于这一点,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)算法可谓求解最优化问题的不二法门。最优化问题是求解使目标函数取得最小值时的参数值(通常是个向量)。使用随机梯度下降算法求解最优化问题时,首先用某种方法选取参数的初始值,然后持续随机选取某一训练数据来更新参数值。针对选择的训练数据,每个参数值将获得与其偏导数成某固定(一般很小)比例但反向的更新,即如下面的公式所示,为目标函数,为第个参数,为更新的固定比例,一般称为学习速率。

Just Works:Jeff Dean斯坦福演讲启示

  系统会重复执行上述更新过程,直到最终获得的更新量足够小,这时所得的参数值将接近优秀的解决方案,算法停止(理论上讲,算法可能陷入局部优秀的解决方案或无法收敛,但实际应用中很少会发生)。这一算法容易直观理解,使用与其偏导数成某固定比例但反向的量来更新,将使得目标函数稍稍趋向于0,并且偏导数越大,更新量越大,学习得“越快”。

  随机梯度下降算法是机器学习中非常基础的算法,但缺乏优秀的分布式并行实现。Jeff Dean 等人观察到大多数深度学习所用的网络模型可以良好地分区。基于此观察,他们设计了一个性能和容错性都非常好的分布式并行随机梯度下降算法(Asynchronous Distributed Stochastic Gradient Descent,以下称 Async-SGD 算法)。

  现在来介绍下 Async-SGD 算法的基本原理。如图 3 所示,训练数据被分成多份(Data Shard),每份训练数据由一个模型训练集群复本(Model Workers)来处理。每个模型训练集群复本又可能包含很多台服务器,每台服务器将负责某些模型分区的训练。模型的参数统一存储在一系列参数服务器(Parameter Server)上,也做了水平分区。

Just Works:Jeff Dean斯坦福演讲启示
▲图 3 异步分布式随机梯度下降

  由于模型可以良好地分区,每台模型训练服务器只需要访问少量的参数服务器来存取它所负责的模型分区所需的部分参数。这样,训练数据、模型、参数都可以并行处理,系统因而就具有很好的可伸缩性。同时,部分模型训练服务器宕机不会影响到其他模型训练服务器,系统的容错性也很好。模型训练服务器可进行一批多次迭代后才更新参数到参数服务器。通过调整这一“批次”大小,还能提高并行计算性能(当然这样训练出来的模型精度可能会下降)。对这一算法的细节感兴趣的读者可以参考上面提到过的“Large Scale Distributed Deep Networks”这篇论文。

  基于随机梯度下降算法在机器学习中的核心地位,算法一突破,大量产品就能广泛受益。在演讲中,Jeff Dean 重点讲了 Async-SGD 算法的 3 个应用,每个都是超重量级。

  •应用于语音识别中的声学模型。通过 800 台服务器近 5 天的训练,Async-SGD 算法产生的声学模型将语音识别的词错误率(Word Error Rate)降低了 30%。这一效果抵得上过去 20 年的语音识别研究成果。在最新的 Android 4.1 版里已经包含了这一模型。

  •应用于语言模型。通过对 Google News 多达 70 亿单词的庞大语料库的训练,所得语言模型的复杂度(Perplexity)接近5-gram(高 15%),且与5-gram 联合使用时比纯5-gram 低了多达 33%。语言模型是决定语音识别性能的关键指标,低 33% 的复杂度意味着后续处理时要考虑的词汇量平均将减少1/3,这对语音识别性能提升的帮助无疑是巨大的。

  •应用于 YouTube 视频帧和 ImageNet 图像的无监督/半监督式特征学习。使用 1000 万张取自 YouTube 视频帧的图像训练了多达 11.5 亿参数、最上层神经元多达 6 万个的超大神经网络,自动获得了非常多的图像特征提取/判别器。

  比如,某个神经元是一个很好的人脸检测器,而另一个神经元则是一个很好的猫脸检测器。同时,以此无监督学习的结果为起点,结合 ImageNet 的标签数据,也非常显著地提升了对 ImageNet 图像的分类性能。

  除了上述介绍的两大主题,Jeff Dean 的这次演讲内容广泛(PPT 就长达 124 页),还涉及了数据中心、系统架构、Spanner 等众多其他主题。因为篇幅有限,加之 Jeff Dean 对这些主题的介绍是点到即止,不怎么深入,这里就不一一介绍了。

  启示

  介绍完演讲内容,叹服之余,我想更重要的是思考 Google 的经验能给我们带来什么启示。

  •首先,我认为 Jeff Dean 非常好地展示了如果能在通用核心领域取得突破,应用价值将极其巨大;而 Jeff Dean 在演讲中强调,好的通用系统应该提供高层次的抽象从而简洁易用,用 Jeff Dean 的原话来说就是 Just Works。Jeff Dean 所创造的 MapReduce、BigTable、Spanner 等产品,正是他这一理念的完美体现。

  Jeff Dean 能突破自己之前一直根植的系统领域,“跨界”到机器学习领域并能做出杰出的工作,我想主要就是因为他始终坚持做通用、Just Works 系统的理念。如果再看一看计算机领域,应不难发现诸如关系数据库、事务处理、UNIX 等系统大获成功的原因,即它们都提供了简洁优雅的抽象,从而使得系统既功能强大又易于使用。因此,对工程师和架构师来说,把系统做到通用、简洁、Just Works 确实非常重要。我想,只有理解这一点,我们才算触及了 Jeff Dean 这次演讲的实质。

  •其次,我认为 Jeff Dean 在演讲中所展示的机器学习的图景非常振奋人心。Jeff Dean 等人的工作表明超大规模神经网络的训练问题可以通过分布式计算有效解决,并且一旦解决这一核心问题,很多机器学习任务的性能将前进一大步。

  我想,从本质上说,如果希望机器的智能接近或超越人类的智能,机器所用的模型应具备与人脑相当的复杂结构;而如果有了正确的方法,更复杂的模型自然能蕴含更多的智能。因此,通过分布式计算以支撑越来越复杂的模型,将是机器学习发展的必经之路,同时也很可能是希望之路。

  Google 目前能训练的模型还不超过 20 亿个参数,Jeff Dean 说希望将来能做到 1000 亿个参数。希望 Jeff Dean 能早日实现这一愿望,届时 Jeff Dean 可能会向我们展示更为震撼的人工智能图景。

3
相关文章