veRL代码阅读-2.Ray
看VeRL代码之前发现代码里主要使用了ray框架来进行调度和通信. 所以先对ray进行初步学习, 后续有空闲时间再细看下Ray的代码.
框架原理
构成
架构图如下, ray里主要分为系统层面的layer和应用层的layer.

系统层layer:
GCS(Global Control Store): 中心数据存储,是 Worker 之间传递消息的纽带, 储存了代码, 输入参数, 返回值.
Scheduler: 分成Global和Local两种, 严重怀疑VeRL论文里说的中心节点其实就是这个Global. 待确认. Local是每个单机上的调度器(又名Raylet), worker通过Local和Global进行通信. 下图是一个交互示意图:

Object Store: 主要作用是通过RPC传递worker间的数据,

应用层Layer:
- Driver: 执行用户程序的进程
- Worker: 无状态的执行remote task的进程, worker是框架自动启动的. 当用户声明了一个remote方法时, 这个remote方法会被发布到所有的worker上
- Actor: 有状态进程(这里的actor概念和rl里的actor不一样注意一下),在被调用时只执行其暴露的函数。与worker不同的地方在于,actor需要worker或driver显式实例化, 特殊点在于每个方法的执行依赖于前一个方法产生的状态
调用流程
以一个remote请求发送和获取结果为例. 发送的步骤依次为:
driver把remote函数提交给localScheduler -> localScheduler把任务告知global -> globalScheduler查询GCS拿到对应的函数参数存的位置 -> global把这个任务调度有参数b的Node2 -> Node2的LocalScheduler检查所有的参数是不是本地都有 -> 把没有的参数查GCS,从而知道需要的参数存在哪个节点上 -> 从对应的节点拉取本地没有的参数 -> 所有入参数据ready后, 执行计算步骤 -> 把计算的结果存到本地的ObjectStore里

接收计算结果(ray.get)的步骤:
通过localScheduler在ObjectStore里检查返回的future对象\(id_c\)是否在本地 -> 向GCS查询\(id_c\)的存储位置, 如果这时候\(id_c\)还没产出, N1就会往GCS注册一个回调, 当产出时通知 -> N2完成计算后把结果存储到本地ObjectStore, 把\(id_c\)的meta信息添加到GCS, 这时候就会触发之前注册的回调 -> GCS通知N1数据可用,并且发送位置信息 -> N1向N2发送RPC请求拉取\(id_c\), 整个过程完成.

使用方法
- task模式, 也就是上面说的worker, 适合无状态的逻辑执行
@ray.remote #定义无状态分布式任务
def add(x, y):
return x + y
# 异步提交任务,立即返回 future 对象(对象引用)
future = add.remote(1, 2)
results = ray.get([future]) #走上一章节说的get模式从remote拉取结果
- Actor模式, 能够维护状态并封装方法。适合需要有状态的场景,如参数服务器、计数器. 特点是同一个Actor的方法调用按顺序执行,保证状态一致性, 而不同Actor实例之间可以并行执行
@ray.remote # 使用 @ray.remote 将类转换为分布式 Actor, 实例在其生命周期内可以维持状态
class Counter:
def __init__(self):
self.value = 0
def increment(self):
self.value += 1
return self.value
def get_value(self):
return self.value
counter = Counter.remote() # 创建 Actor 实例, 存储在GCS里
future1 = counter.increment.remote() # 第一次增加
future2 = counter.increment.remote() # 第二次增加
future3 = counter.get_value.remote() # 获取当前值
print(ray.get([future1, future2])) # 输出: [1, 2]
print(ray.get(future3)) # 输出: 2
- 主要接口:
| 接口 | 功能 |
|---|---|
| ray.put() | 通过对象存储实现跨节点数据访问, put到remote的同时在GCS注册, 返回对象引用 |
| ray.get() | 同上, 功能变为数据拉取 |
| ray.exceptions & @ray.remote(max_retries=3) | 异常处理与重试, 搭配使用提升容错 |
| @ray.remote(num_gpus=1) def gpu_task(): |
静态资源配置 |
| future = task.options(num_cpus=2, num_gpus=1).remote() | 动态资源配置 |
| ray.kill(Actor) | 强制终止 Actor 实例 |
| refs = [task.remote(i) for i in range(4)] ready_refs, remaining_refs = ray.wait(refs, num_returns=len(refs)) |
等待异步提交的任务完成 |
参考
ray论文: https://arxiv.org/abs/1712.05889
veRL代码阅读-2.Ray的更多相关文章
- 代码阅读分析工具Understand 2.0试用
Understand 2.0是一款源代码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实可以大大提高代码阅读效率.由于Understand功能十分强大,本文不可能详尽地介绍它的所有功能,所 ...
- Android 上的代码阅读器 CoderBrowserHD 修改支持 go 语言代码
我在Android上的代码阅读器用的是 https://github.com/zerob13/CoderBrowserHD 改造的版本,改造后的版本我放在 https://github.com/ghj ...
- Linux协议栈代码阅读笔记(二)网络接口的配置
Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...
- [置顶] Linux协议栈代码阅读笔记(一)
Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...
- 图形化代码阅读工具——Scitools Understand
Scitools出品的Understand 2.0.用了很多年了,比Source Insight强大很多.以前的名字叫Understand for C/C++,Understand for Java, ...
- Python - 关于代码阅读的一些建议
初始能力 让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法.技巧和业务流程等频繁地阻碍和打断. 建议基本满足以下条件,再开始进行代码阅读: 具备一定的语言基础:熟悉基础语法,常用的函数 ...
- MediaInfo代码阅读
MediaInfo是一个用来分析媒体文件的开源工具. 支持的文件非常全面,基本上支持所有的媒体文件. 最近是在做HEVC开发,所以比较关注MediaInfo中关于HEVC的分析与处理. 从Meid ...
- Tools - 一些代码阅读的方法
1 初始能力 让阅读思路清晰连贯,保持在程序的流程架构和逻辑实现上,不被语法.编程技巧和业务流程等频繁地阻碍和打断. 语言基础:熟悉基础语法,常用的函数.库.编程技巧等: 了解设计模式.构建工具.代码 ...
- Bleve代码阅读(二)——Index Mapping
引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...
- Python3练习题系列(08)——代码阅读方法及字典跳转表理解
问题:分析下面代码 cities['_find'] = find_city city_found = cities['_find'](cities, state) 分析过程: 一个函数也可以作为一个变 ...
随机推荐
- bug|electron-vue 使用 electron-builder 打包,执行 yarn run build 报错原因
问题 & 解决 官方BUG:tasks 重复: yarn run build yarn run v1.22.22 $ node .electron-vue/build.js && ...
- 面试题-JVM性能调优
前言 JVM性能调优是一个很大的话题,很多中小企业的业务规模受限,没有迫切的性能调优需求,但是如果不知道JVM相关的理论知识,写出来的代码或者配置的JVM参数不合理时,就会出现很严重的性能问题,到时候 ...
- 【电脑】重装Win10之后无法唤醒和正常关机(Y9000P 2022)
问题: Y9000P 2022 改Windows10后经常关机关不全(自带键盘灯亮,电源指示灯不灭),这还不是最重要的,它一会儿不用到时间自动休眠后还经常唤醒不了 解决: 两个问题,总结一下: 一.关 ...
- 【跟K8S学设计】Informer全分析-Reflector(上)
鉴于Informer架构及其处理逻辑蕴含了丰富的实战技术,本文将分为上下两章进行深入探讨. 上篇将专注于解析Informer中的Reflector组件,而下篇则会详尽分析Indexer模块.通过这种结 ...
- AnnotationAwareAspectJAutoProxyCreator后置处理器的BeanDefinition定义信息导入和其对象实例创建过程
步骤1 我们从配置类上的@EnableAspectJAutoProxy 注解入手,进入发现这个注解上又有一个@Import(AspectJAutoProxyRegistrar.class)注解, 了解 ...
- 请求参数的绑定(获取请求数据)、请求参数是一个POJO
一. @Controller @RequestMapping("/parem") public class ParamController { /** * springmvc接受请 ...
- 什么是 Java 中的直接内存(堆外内存)?
Java 中的直接内存(堆外内存) 在 Java 中,直接内存(Direct Memory)指的是不受 JVM 堆管理的内存区域,也称为堆外内存.直接内存的使用通常与 Java NIO(New I/O ...
- FastAPI与Tortoise-ORM实现关系型数据库关联
title: FastAPI与Tortoise-ORM实现关系型数据库关联 date: 2025/04/21 10:51:41 updated: 2025/04/21 10:51:41 author: ...
- windows里的一些常用的dos命令
--------------------------------------------- 1. 中断命令执行 Ctrl + Z 2. 文件/目录 cd 切换目录 例:cd // 显示当前目录 ...
- 没几个人需要了解的JDK知识,我却花了3天时间研究
目前国内发布自己JDK版本的几家公司: 腾讯和阿里是因为有Java应用和云业务,所以在优化发布自己的版本 华为也是因为Java应用和云业务,不过因为还有服务器业务,所以还有Java课题的跑分需求,如S ...