全国免费咨询:

13245491521

VR图标白色 VR图标黑色
X

中高端软件定制开发服务商

与我们取得联系

13245491521     13245491521

2018-08-09_如何基于Ray使用15行代码实现参数服务器

您的位置:首页 >> 新闻 >> 行业资讯

如何基于Ray使用15行代码实现参数服务器 编译 | 无明编辑 | VincentAI 前线导读:参数服务器是很多机器学习应用程序的核心部分,它们的作用是保存机器学习模型的参数(例如,神经网络的权重),并将它们提供给客户端(客户端通常是处理数据和参数更新的应用程序)。 参数服务器(类似数据库)通常作为独立的系统进行构建和发布。这篇文章描述了如何基于 Ray 用几行代码实现一个参数服务器。 将参数服务器从“系统”变成“应用程序”,极大简化了参数服务器的部署过程。另外,应用程序和库实现自己的参数服务器,使参数服务器的行为变得更加灵活和可配置(因为应用程序可以使用几行 Python 代码来实现)。 Ray 是 Python 的一个并行分布式通用框架,提供了统一的并行任务能力和 actor 抽象,并通过共享内存、零拷贝序列化和分布式调度来实现高性能。Ray 还为 AI 应用程序提供了高性能库,例如超参数调整和强化学习。 更多优质内容请关注微信公众号“AI 前线”(ID:ai-front)什么是参数服务器?参数服务器是一种键值存储,用于在集群上训练机器学习模型。其中值是机器学习模型(例如神经网络)的参数,而键是模型参数的索引。 例如,在电影推荐系统中,每个用户和每部电影都有一个键。对于每个用户和每部电影,都有相应的用户特定参数和电影特定参数。在语言建模应用程序中,单词可以作为键,它们的词袋可以作为值。在最简单的情况下,参数服务器中可能有一个对应的键,并允许一次性获取和更新所有参数。我们将展示如何使用 Ray 来实现这样的参数服务器(仅需 15 行代码)。 @ray.remote 定义了一个服务,可以将它实例化为一个远程服务或 actor。 我们假设这里的更新操作是一个梯度,应该被添加到参数向量中。当然,这只是一个最简单的例子,实际当中可以做出很多不同的事情。 参数服务器通常作为远程进程或服务存在,并通过远程过程调用与客户端发生交互。要将参数服务器实例化为远程 actor,我们可以执行以下操作。 这个 actor 的方法返回一个 future。如果想要获取实际的值,可以使用阻塞式调用 ray.get。例如: 现在,假设我们想要启动一些 worker 任务,用于持续计算渐变并更新模型参数。每个 worker 都将在一个循环中运行,并完成三件事: 获取最新参数。 计算参数的更新。 更新参数。 这个 Ray 远程函数(尽管 worker 也可以是 actor)看起来如下所示。 然后我们可以按如下方式启动一些 worker 任务。 然后我们从驱动程序进程中获取参数,并可以看到 worker 正在更新它们。 Ray 在这里起到的作用在于,它可以像创建 Python 类一样轻松启动远程服务或 actor。actor 的句柄可以被传给其他 actor 和任务,让它们之间直接进行消息传递和通信。 额外的扩展进行跨多个参数服务器的分片:当你的参数很大且群集也很大时,单个参数服务器可能就不够用了,因为网络带宽可能会成为瓶颈(特别是如果有很多 worker 的话)。 在这种情况下,可以在多个参数服务器上对参数进行分片。这可以通过启动多个参数服务器 actor 来实现。文后的代码示例中演示了如何执行这个操作。 控制 actor 的分配:可以借助 Ray 对任意资源需求的支持将特定的 actor 和任务指定给不同的机器。例如,如果一个 worker 需要 GPU,那就使用 @ray.remote(num_gpus=1) 来声明它,当然,也可以定义任意的自定义资源。 统一任务和 actorRay 之所以能够有效地支持参数服务器应用程序,在很大程度上是因为它统一的并行任务和 actor 抽象。 主流的数据处理系统(如 Apache Spark)允许无状态任务(没有副作用的函数)操作不可变数据。这种假设简化了整个系统的设计,让应用程序更容易获得正确的结果。 但是,在多个任务之间共享可变状态是机器学习应用程序中反复出现的问题。这些状态可以是指神经网络的权重、第三方模拟器的状态,或与物理世界交互的封装。 为了支持这类应用程序,Ray 引入了 actor 抽象。actor 以串行的方式执行方法(因此没有并发问题),并且每个方法都可以任意改变 actor 的内部状态。这些方法可以被其他 actor 和任务(甚至是同一群集上的其他应用程序)调用。 actor 抽象与任务并行抽象的统一让 Ray 变得非常强大,因为它继承了这两种方法的优点。Ray 使用底层动态任务图在同一框架中实现 actor 和无状态任务。因此,这两个抽象是完全可互操作的,可以在其他任务和 actor 中创建新的任务和 actor。它们两个都返回 future,可以传给其他任务或 actor 进行调度或引入数据依赖。所以说,Ray 应用程序继承了任务和 actor 最好的特性。 关键概念动态任务图:远程函数调用和 actor 方法调用将创建任务,并将它们添加到动态增长的任务图中。Ray 的后端负责跨群集(或单台多核机器)调度和执行这些任务。任务可以由“驱动程序”或其他任务创建。 数据:Ray 使用 Apache Arrow 数据格式来序列化数据。通过共享内存在同一台机器上的 worker 和 actor 之间共享对象,这就避免了复制或反序列化。这种优化对于提升性能来说至关重要。 调度:Ray 使用了分布式调度的方式。每台机器都有自己的调度程序,用于管理该机器上的 worker 和 actor。应用程序和 worker 将任务提交给同一台计算机上的调度程序,然后这些任务被重新分配给其他 worker 或传给其他本地调度器。因此,Ray 可以实现比集中式调度程序更高的吞吐量,这对于机器学习应用程序来说非常重要。 结 论参数服务器通常作为独立的系统进行实现和发布,这种方式的强大之处在于,我们仅用几行代码就可以实现一个参数服务器,并且让部署使用了参数服务器的应用程序和修改参数服务器的行为变得更加简单。例如,如果我们想要对参数服务器进行分片、更改更新规则、在异步和同步更新之间进行切换、忽略掉队的 worker 等等,只需要使用额外的几行代码来完成这些操作。 这篇文章描述了如何使用 Ray 实现一个参数服务器。不过,actor 是一种更通用的概念,可用在涉及有状态计算的应用程序中,如记录日志、流式处理、模拟、模型服务、图形处理等等。 运行代码要运行完整的应用程序,请首先使用 pip install ray 安装 Ray,然后就可以运行下面的代码,这些代码实现了一个分片的参数服务器。 Ray 项目地址:https://github.com/ray-project/ray 英文原文: https://ray-project.github.io/2018/07/15/parameter-server-in-fifteen-lines.html 如果你喜欢这篇文章,或希望看到更多类似优质报道,记得给我留言和点赞哦!

上一篇:2018-08-07_抛弃RNN吧!序列建模有前馈网络就够了 下一篇:2024-10-30_中国存储厂,杀入顶分桌

TAG标签:

18
网站开发网络凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设网站改版域名注册主机空间手机网站建设网站备案等方面的需求...
请立即点击咨询我们或拨打咨询热线:13245491521 13245491521 ,我们会详细为你一一解答你心中的疑难。
项目经理在线

相关阅读 更多>>

猜您喜欢更多>>

我们已经准备好了,你呢?
2022我们与您携手共赢,为您的企业营销保驾护航!

不达标就退款

高性价比建站

免费网站代备案

1对1原创设计服务

7×24小时售后支持

 

全国免费咨询:

13245491521

业务咨询:13245491521 / 13245491521

节假值班:13245491521()

联系地址:

Copyright © 2019-2025      ICP备案:沪ICP备19027192号-6 法律顾问:律师XXX支持

在线
客服

技术在线服务时间:9:00-20:00

在网站开发,您对接的直接是技术员,而非客服传话!

电话
咨询

13245491521
7*24小时客服热线

13245491521
项目经理手机

微信
咨询

加微信获取报价