有望取代Spark的实时机器学习框架Ray
一个新的项目旨在为实时处理开发一种速度更快的框架,可用来支持用Python编写的机器学习应用。
加州大学伯克利分校实时智能安全执行实验室(RISELab)的研究人员已开发出了一种新的分布式框架,该框架旨在让基于Python的机器学习和深度学习工作负载能够实时执行,并具有类似消息传递接口(MPI)的性能和细粒度。这种框架名为Ray,看起来有望取代Spark,业界认为Spark对于一些现实的人工智能应用而言速度太慢了;过不了一年,Ray应该会准备好用于生产环境。
Ray是率先从RISELab诞生的技术之一,加州大学伯克利分校的这个研究组织取代了曾大获成功的AMPLab,后者开发出了一大批引人入胜的分布式技术,这些技术影响了高性能和企业计算,包括Spark、Mesos、Tachyon及其他技术。
计算机科学教授迈克尔·乔丹(Michael Jordan)是昔日AMPLab、今日RISAab的顾问之一,最近他在加州圣何塞举行的Strata + Hadoop World大会上讨论了Ray的核心原则和驱动因素。
乔丹在3月16日的主题演讲中说:“之所以开发Spark,是由于我的学生抱怨Hadoop差强人意。他们抱怨,每当在逻辑回归之类的操作中进行迭代,总是要面临很长的延迟。”
乔丹继续说:“马泰·扎哈里亚(Matei Zaharia)是实验室的学生之一,他听到他们抱怨后说‘我会帮助你们解决这个问题。我会构建某种缓存系统,那意味着你不必一直去使用磁盘。这就是Spark的起源。”
他的学生们注意到扎哈里亚开发Spark后突然变得“多重要、多有名”;扎哈里亚后来顺理成章地与他人创办了Databricks,并成为了加州大学伯克利分校的对手:斯坦福大学的助理教授。
乔丹说:“所以现在是着眼于下一代技术的时候。他们说‘我们绝不会将一个项目交给搞系统的人。我们准备自己来搞。“所以这下一个项目由机器学习学生来搞,开发之初就抱着要取代Spark的目的。”
Ray由RISELab的两名博士:菲利浦·莫里兹(Philipp Moritz)和罗伯特·西原(Robert Nishihara)开发而成。研究人员竭力构建一种框架,可以结合在实际环境下运行机器学习或基于深入学习的应用所需要的许多不同元素。据乔丹声称,研究人员将应用程序分解成了各组成部分,了解如何实际构建一个允许实时决策机制的端到端系统。
乔丹说:“你需要灵活性。你需要的不光光是组建神经网络之类的东西,还需要规划、搜索和模拟。这带来了种种复杂的任务依赖关系。单单编写MapReduce类型的范例(paradigm,又可译成模式)就不是很容易。这种范例能编写得出来,但是如果你有大不一样的异构工作负载和任务,它执行起来不会非常高效。它需要适应算法的性能,因为系统在不断学习。”
很显然,乔丹指派Spark来完成MapReduce风格的编程。虽然Spark的速度比MapReduce快得多,但它仍然是MapReduce面向批处理的工作流程范例的一些核心元素。他表示,Ray避免了Spark使用的“块同步”(block synchronous)范例,改用了速度更快的范例。
据乔丹声称,Ray的速度很快,处理单个任务时延迟只有微秒。它还可以处理异构硬件,一些应用工作负载在CPU上执行,另一些工作负载在在GPU上运行。Ray有许多调度程序可以统筹安排这一切。
它还会借鉴MPI的任务依赖属性,MPI是低级分布式编程环境,高性能计算(HPC)领域的人士使用MPI来构建模型,模拟工作负载运行起来非常快。乔丹说:“我们其实也想达到那样级别的性能。我们不是要取代MPI。但是我们希望能够获得与MPI一样好的性能,但是要简单得多,强大得大,而且不太依赖分布式平台。”
乔丹在Strata大会上演示期间展示了Ray如何帮助数字机器人学会跑步。
乔丹将让集群中的各个节点保持计算状态,但是状态会尽可能少,这将最大限度地提高稳定性。他补充道:“不过需要注意可以在诸任务之间共享的状态计算(stateful computation)。然后,我们显然想要容错机制,我们也会实现序列化运行,那样我们就能轻松共享数据了。”
Ray框架目前正在开发中,不过还不是已完成的项目。有兴趣的朋友可以看一看该项目放在Github上的初期测试版代码(https://github.com/ray-project/ray)。
Ray对于开发一系列需要利用实际数据进行快速决策的应用将大有用处,比如自主驾驶或某些新兴形式的人工智能辅助医疗所需要的那种应用。由于对这个领域做出的巨大贡献,乔丹已被戏称为“机器学习界的迈克尔·乔丹”,他认为Ray最大的影响力将体现在强化学习(reinforcement learning)领域,而不是监督式学习系统。由于用来解决计算机视觉和分类问题的深度学习和神经网络大行其道,监督式学习系统随之流行起来。
他说:“当你开始更接近实际的决策时,不是仅仅想要模仿人类,而是想要找出最好的决策。那就是强化学习范例。强化学习其实缺乏一种很好的系统级支持。”
Ray是用C ++编写的,基本上旨在加快用Python开发的机器学习算法的执行速度。
Python脚本提交并执行作业(job),Ray使用Python的语法特性来表示对象和作业是如何运行的。如果你为某个函数添加了@ray.remote,这表明该函数可以跨集群异步执行。函数运行时,它会立即返回一个对象ID,之后可以查询该ID,获得该函数生成的任何最终结果。Ray的说明文档表明了可以如何结合Python的列表推导(list comprehension),运行一系列函数,并自动返回结果。