实时机器学习框架的设计原则
介绍
传统的机器学习(ML)方法是离线操作大量数据,使用监督学习方法创建模型,然后在在线环境中使用经过训练的模型进行推理。虽然这在过去取得了巨大的成功,但一种新的应用程序正在出现。这些应用程序希望在实时环境中推断,对感官输入作出反应,执行连续的小微模拟,然后采取行动。这是基于强化学习方法的典型流程。一般来说,从真实环境中学习可能会占用大量资源,或者受到带宽的限制。因此,一种方法是更新模拟环境,并使用蒙特卡洛树搜索等方法执行许多这样的模拟。这意味着系统需要能够比实时更快地执行模拟。现有的一些框架(如Spark或TensorFlow)似乎不足以应付这种工作负载。这些框架主要支持静态数据流图构建,因为它们通常不擅长实时扩展这些数据流图。此外,以数据为中心的框架(如MapReduce)关注的是批量并行操作,而不是这种新型应用程序所需的短任务的大规模并行。这篇来自加州大学伯克利分校RISELab的论文探索了一个框架的设计原则,该框架可能需要支持这种实时需求。一个基于强化学习的代理的原型,使用下面列出的原则,执行速度比spark快63倍。
新框架的要求
可以安排这种新时代应用及其任务的新框架的要求可大致分为三类:性能,执行模型,实用性。
性能
- 1.低延迟:由于这些机器学习ML应用需要实时响应,因此需要快速的端到端响应,以毫秒为单位。(R1)
- 2.高吞吐量:由于强化学习(RL)中使用的蒙特卡罗模拟可以创建数百万个小任务,因此调度程序框架需要确保高吞吐量。(R2)
执行模型要求
- 3.动态任务创建:基于其他任务的执行流程以及任务的持续时间,动态创建新任务(例如,使用蒙特卡罗树搜索)。(R3)
- 4.异构任务:任务将根据所需资源的维度和执行的持续时间而变化。(R4)
- 5.任意数据流依赖性:新的小任务将依赖于其他任务的执行,并创建一个相互依赖且动态依赖的任务图。(R 5)
实际使用要求
- 6.容错:这在高吞吐量和低延迟环境中特别棘手。但是在任何分布式环境中都需要它(R6)
- 7.调试和分析:机器学习(ML)应用程序和依赖于强化学习的应用程序是计算密集型的。因此,快速分析性能问题非常重要。同样,分布式和随机环境中的调试功能对于更快速的故障排除非常有用。(R 7)
有了这些需求,框架的总体思想就集中在混合方法上。具有状态的集中调度器可以帮助进行容错和数据图沿袭重播,并帮助进行集群级的资源分配。与此同时,具有无状态和自底向上的本地调度器可以做出高效的本地机器级别决策,并使用数据局部性对大多数任务进行快速决策。
一个现实世界的例子
让我们看一个真实世界的例子,它将使R1到R5的要求更加具体。
机器人使用不同的机器学习(ML)组件来实时做出决策。盒子大小和颜色代表任务的持续时间和多样性。
这样的机器人需要聆听来自物理世界的多个感官输入并使用该数据来做出决定。它可能使用基于RNN的模型进行推理和策略决策。它可以使用MC树搜索来模拟更多的物理条件。在树搜索中,它可以决定遵循某些子树或忽略其他子树,这取决于它计算子树的完成所花费的时间。显然,大部分需要实时发生,以使机器人有效。
可以看出,R1对于系统的实时需求是非常必要的。R2是支持MC树搜索所必需的。R3是需要的,因为它需要不同的树分支,并产生相应的任务。R4是明显的,因为需要支持RNN推理任务-不同层的不同功能,感官输入处理,各种物理模拟。从图中可以看出,由于系统中存在复杂的数据流依赖关系,所以需要R5。
架构
基于上面的需求R1-R7和现实世界的示例,让我们首先看看需要构建哪些基本类型,这些基本类型构成了实时机器学习体系结构的基础。
System Primitives
- 任务创建需要是非阻塞的,并且在创建任务后可以返回“future”。将异步执行任务,并根据需要获得未来的任务。
- 任何函数调用都可以视为远程执行,以支持各种任务类型及其在不同硬件类型上的执行。函数调用可以将简单的数据值或futures作为参数。当future用作参数时,这意味着在提供future的任务和需要future作为输入的任务之间存在数据流依赖关系(DAG)。
- 任何任务都可以创建可能需要远程执行的新任务。这还有助于消除对原始任务正在运行的特定workers/任务的吞吐量的依赖性。
- 未来的“get”方法将在任务准备就绪时返回任务的值,这是一个阻塞调用。
- “wait”方法可以使用多个futures作为输入和超时值。它返回在超时时已完成的futures或已经完成某个任务阈值的futures。这样的wait Primitives可以帮助满足延迟要求,因为它们提供了忽略某些任务的能力,这些任务可能花费很长时间并且可能仅提供在机器学习(ML)算法中常见的边际改进。
架构
建议使用本地和全局调度程序的混合架构
在较高级别,集群中的每个节点都有一个本地调度程序,该调度程序管理多个工作进程,这些进程通过某些共享内存共享一些信息。还有一个全局调度程序负责管理集中控制信息。这使得混合调度方法成为可能。
集中式调度程序
全局调度程序使用数据库来管理系统的集中控制状态。只要数据库具有容错能力,系统就可以从组件故障中恢复。此外,pub-sub系统管理系统中不同组件可以响应的重大事件更改的更新。可以对数据库进行分片以获得更好的可伸缩性
混合调度
给定R1和R2,能够做出本地调度决策以利用数据局部性是有意义的。给定节点上的worker可以将任务提交给本地调度程序。本地调度程序可以决定在给定节点上安排任务,或者如果存在溢出,则将其提交给全局调度程序。全局调度程序正在查看整体全局状态,数据放置和资源可用性以及制定调度决策。由于任务可以创建其他任务,因此可以在本地调度这些任务以实现最佳执行。
结论
本文概述的系统设计方法似乎是设计新时代机器学习(ML)框架的好方法。