Ray入门指南——分布式框架(待更新)

article/2025/9/11 17:36:18

1. ray库介绍

金融、工程模型需要大量使用 Pandas 和 Numpy 来做矩阵计算,需要针对 Pandas/Numpy 有更好的支持,ray库就是其中一种可以加速计算的框架。
Ray 有如下特点:

  • 分布式异步调用
  • 内存调度
  • Pandas/Numpy 的分布式支持
  • 支持 Python
  • 整体性能出众

2. ray安装

电脑是win10+python3.7.3,安装ray库,下面的顺序不能错

pip install -i https://mirrors.aliyun.com/pypi/simple/pytest-runner
pip install -i https://mirrors.aliyun.com/pypi/simple/ray

3. 初步使用的基本形式

# 导入ray,并初始化执行环境
import ray
ray.init()# 定义ray remote函数
@ray.remote
def hello():return "Hello world !"# 异步执行remote函数,返回结果id
object_id = hello.remote()# 同步获取计算结果
hello = ray.get(object_id)# 输出计算结果
print hello

4. 测试一个简单的例子

使用ray库计算100次的延迟1秒

import ray
import time
import numpy as np# 启动Ray.
ray.init()
#定义remote函数
@ray.remote
def sleep1(n):time.sleep(n)#程序开始时的时间
time_start=time.time()result_ids = []
for i in range(100):#异步执行remote函数sleep1.remote(1)#程序结束时系统时间
time_end=time.time()
#两者相减
print('totally cost',time_end-time_start)
#print(z_id)

不使用ray库计算100次的延迟1秒


import time
import numpy as npdef sleep1(n):time.sleep(n)#程序开始时的时间
time_start=time.time()
result_ids = []
for i in range(100):sleep1(1)#程序结束时系统时间
time_end=time.time()
#两者相减
print('totally cost',time_end-time_start)
#print(z_id)

在这里插入图片描述

5. 系统架构

作为分布式计算系统Ray仍旧遵循了典型的Master-Slave的设计,Master负责全局协调和状态维护;Slave执行分布式计算任务。不过和传统的分布式计算系统不同的是Ray使用了混合任务调度的思路。

在集群部署模式下Ray启动了以下关键组件:

  • GlobalScheduler(全局调度器)— Master上启动一个全局调度器用于接收本地调度器提交的任务;并将任务分发给合适的本地任务调度器执行。
  • RedisServer Master(重新分配任务)— 启动一到多个RedisServer用于保存分布式任务的状态信息(Control State),包括对象机器的映射、任务描述、任务debug信息等。
  • LocalScheduler(局部调度器)— 每个Slave上启动一个本地调度器,用于提交任务到全局调度器,以及分配任务给当前机器的Worker进程。
  • Worker(工人)— 每个Slave上可以启动多个Worker进程执行分布式任务;并将计算结果存储到ObjectStore。
  • ObjectStore(对象存储)— 每个Slave上启动一个ObjectStore存储只读数据对象;Worker可以通过共享内存的方式访问这些对象数据;这样可以有效地减少内存拷贝和对象序列化成本,ObjectStore底层由Apache Arrow实现。
  • Plasma — 每个Slave上的ObjectStore都由一个名为Plasma的对象管理器进行管理;它可以在Worker访问本地ObjectStore上不存在的远程数据对象时主动拉取其它Slave上的对象数据到当前机器。

Ray的Driver节点和和Slave节点启动的组件几乎相同;不过却有以下区别:

  • Driver上的工作进程DriverProcess一般只有一个,即用户启动的PythonShell;Slave可以根据需要创建多个WorkerProcess。
  • Driver只能提交任务却不能来自全局调度器分配的任务。Slave可以提交任务也可以接收全局调度器分配的任务。
  • Driver可以主动绕过全局调度器给Slave发送Actor调用任务(此处设计是否合理尚不讨论);Slave只能接收全局调度器分配的计算任务。

6. ray基础(待补充)

  • ray.init() 启动ray
  • ray.put(x) 获取一个对象的ID
  • ray.get(x_id) 接受一个对象ID,并从相应的远程对象创建一个Python对象。
result_ids = [ray.put(i) for i in range(10)]
ray.get(result_ids)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ray.get(result_ids[5]) 	# 5
ray.get(result_ids[1]) 	# 1
  • Ray的异步计算:可以执行任意Python函数
"远程函数"
@ray.remote #在普通函数基础上添加@ray.remote 
def add2(a, b):return a + b
x_id = add2.remote(1, 2)
ray.get(x_id)  # 3
  • 远程函数:不返回实际值,它们总是返回对象ID,返回的对象ID可以是多个。
  • ray.error_info() 可以获取任务执行时产生的错误信息。
  • ray.wait() 支持批量的任务等待
# 启动5个remote函数调用任务
results = [f.remote(i) for i in range(5)]
# 阻塞等待4个任务完成,超时时间为2.5s
ready_ids, remaining_ids = ray.wait(results, num_returns=4, timeout=2500)

上述例子中,results包含5个ObjectID,使用ray.wait()操作可以一直等待有4个任务完成后返回;并将完成的数据对象放在第一个list类型返回值内;未完成的ObjectID放在第二个list返回值内。如果设置了超时时间;那么在超时时间结束后仍未等到预期的返回值个数;则已超时完成时的返回值为准。

  • 动态任务图:Ray应用程序或作业中的基础基元是一个动态任务图,这与TensorFlow中的计算图非常不同,TensorFlow中一个计算图代表一个神经网络,并且在单个应用程序中执行多次。 在Ray中任务图代表整个应用程序;并且只执行一次,任务图不是事先知道的,是在应用程序运行时动态构建的,执行一个任务可能会触发创建更多任务。

  • 任务之间的依赖关系:下面的第二个任务在第一个任务完成之前不会执行,第三个任务在第二个任务完成之前不会执行。在这个例子中,没有体现并行,体现的是任务之间的依赖关系。

@ray.remote
def f(x):return x + 1
x = f.remote(0)
y = f.remote(x)
z = f.remote(y)
ray.get(z) # 3
  • 有效的聚合函数:左边是线性聚合方式,右边是树型聚合方式。

    代码实现:
import time
import ray
@ray.remote
def add(x, y):time.sleep(1)return x + y
"====================线性聚合,时间复杂度O(n) ========================="
id1 = add.remote(1, 2)
id2 = add.remote(id1, 3)
id3 = add.remote(id2, 4)
id4 = add.remote(id3, 5)
id5 = add.remote(id4, 6)
id6 = add.remote(id5, 7)
id7 = add.remote(id6, 8)
result = ray.get(id7)
"===================树型聚合,时间复杂度 O(log(n))======================"
id1 = add.remote(1, 2)
id2 = add.remote(3, 4)
id3 = add.remote(5, 6)
id4 = add.remote(7, 8)
id5 = add.remote(id1, id2)
id6 = add.remote(id3, id4)
id7 = add.remote(id5, id6)
result = ray.get(id7)
  • Actor待补充。

目前参考资源:
https://blog.csdn.net/weixin_43255962/article/details/88689665
https://blog.csdn.net/luanpeng825485697/article/details/88242020


http://chatgpt.dhexx.cn/article/w0uFUfm5.shtml

相关文章

springboot分布式框架搭建

搭建框架需要工具默认基于 maven 的分布式工程,我们知道在一个项目中,多个微服务是属于同一个工程,只不过是提供不同的服务而已,因此使用 maven 分布式工程来搭建微服务架构。搭建基于 maven 分布式的 Spring Cloud 微服务工程架构…

分布式事务及分布式框架Seata

分布式事务 分布式事务是什么? 》本地事务是一个单元的sql,分布式事务也是一个单元的sql,他们区别在于,分布式事务的sql分布在了不同服务上,这里的服务指微服务和数据库服务 ?为什么强调服务是微服务和数…

分布式计算框架Map/reduce

简介: MapReduce是一个基于集群的高性能并行计算平台,MapReduce是一个并行计算与运行的软件框架,MapReduce是一个并行程序设计模型与方法.特点: ①分布可靠,对数据集的操作分发给集群中的多个节点实现可靠性,每个节点周期性返回它完成的任务和最新的状态 ②封装了实现细节&a…

什么是分布式架构

一、分布式架构定义 什么是分布式架构 分布式系统(distributed system) 是建立在网络之上的软件系统。 内聚性:是指每一个数据库分布节点高度自治,有本地的数据库管理系统。 透明性:是指每一个数据库分布节点对用户…

分布式架构图解

一、分布式架构图解 1)传统servletjsp模式 2)分布式架构  需要按照功能点把系统拆分,拆分成独立的功能。单独为某一个节点添加服务器。需要系统之间配合才能完成整个业务逻辑。叫做分布式。  分布式架构:多个子系统相互协作…

分布式框架

应用架构 单一应用架构ORM 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。 适用于小型网站,小型管理系统,将所有…

juicer.js @each中的index 索引+1操作

问题描述:想在index1的值显示出来而不是做字符串拼接,如我做的楼号, 想显示2楼,3楼,4楼 解决方法:在index前加一个加号即可。 !{index1}楼 效果: 简单介绍juicer模板: Juicer 是…

Jmetercookie管理器

Jmeter中cookie自动存储 1,新建一个测试计划,然后添加一个"HTTP Cookie 管理器"(用来存储cookie) 2,新建一个线程组,添加一个Sampler-->“HTTP 请求”(用来登录用的),添加一个Samp…

利用3D-DNA流程组装基因组

利用3D-DNA流程组装基因组 使用二代数据或三代数据得到contig后,下一步就是将contig提升到染色体水平。有很多策略可以做到这一点,比如说遗传图谱,BioNano(看运气), HiC, 参考近源物种。 如果利用HiC进行准染色体水平,那么目前常见…

Hic-pro的结果文件转化为.hic文件,在juicebox中实现可视化

hic数据经过Hic-pro处理后,会生成allvalidpairs文件,这是所有有效配对的文件。一般想要可视化的话,比较复杂。这时我们就可以把它转化为.hic文件,放到juicebox中就很好的可视化。 juicer中的pre命令是用来做这个事情的。只要你的…

Java-juc

1. 进程和线程 进程: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个基本单位。例如:打开一个 .exe文件就是一个进程、打开360安全软件就是一个进程 线程 线程是进程的一个实体,是进…

Junit

Junit单元测试 简介:本文主要讲解,如何使用Eclipse,进行单元测试。 1.准备工作:搭建实验环境(EclipseJunitAnt) Eclipse:http://www.eclipse.org/ JUnit:http://www.junit.org/ Ant&#x…

juicer使用案例

代码结构&#xff1a; 编写main.html&#xff1a;引入方式可从bootcdn直接copy script标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge&…

juicer

UPDATE: juicer-0.3.1-dev published github.com. 让我们从一段代码说起&#xff0c;假设有一段这样的JSON数据&#xff1a; var json{name:"流火",blog:"ued.taobao.org" };我们需要根据这段JSON生成这样的HTML代码&#xff1a; 流火 (blog: ued.taoba…

Juicer软件的安装详解

欢迎关注”生信修炼手册”! 软件安装是生物信息实战中最基础的技能之一&#xff0c;只有确保软件安装无误&#xff0c;后续使用起来才会得心应手&#xff0c;不会有很多的bug。juicer软件提供了Hi-C数据一键化分析的pipeline, 这样高度的封装使得用户操作起来更加简便&#xff…

Juicer实战详解

欢迎关注”生信修炼手册”! Juicer软件的运行是非常简单的&#xff0c;只需要设置几个参数就可以了&#xff0c;本文利用官网的小的测试测试数据集来展示该软件的基本用法。 1. 下载测试数据 从以下链接下载测试数据集 https://github.com/aidenlab/juicer/wiki/Running-Juicer…

Juicer: 辅助基因组组装

Juicer: 辅助基因组组装 Juicer 导读 本文主要对处理HiC数据的Juicer程序进行一个简短的介绍&#xff0c;并展示如何利用Juicer进行基因组组装中染色体挂载的第一步。 1. 介绍 算法介绍 Juicer[1] 是一款能够提供一键式分析Loop-Resolution的程序。 特点 只需一次单击&#xff…

如何同步数据库数据

第一步 打开mysql的客户端 这里使用navicat&#xff0c;连接数据库&#xff0c;等到navicat主页面&#xff0c;双击需要操作的数据库连接 第二步 登录到数据库主页面后&#xff0c;点击左侧的数据库链接&#xff0c;打开数据库&#xff0c;可以看到可以操作的所有数据库 第三…

Logstash数据同步

Logstash 是 Elastic 技术栈中的一个技术&#xff0c;它是一个数据采集引擎&#xff0c;可以从数据库采集数据到 ES 中。可以通过设置 自增 ID 主键 或 更新时间 来控制数据的自动同步&#xff1a; 自增 ID 主键&#xff1a;Logstatsh 会有定时任务&#xff0c;如果发现有主键…

数据同步-数据库间的双向同步

当业务侧需要MongoDB降配、活动数据迁移时都需要应用切换数据库实例进行发版&#xff0c;发版过程中需最大程度保证新旧数据库数据一致&#xff0c;这就涉及到了一种同步技术-数据双向同步。在同步过程中遇到了一些可能会产生问题或引发思考的点&#xff0c;希望利用这篇文档进…