ray简单介绍

news2024/12/23 4:03:45

ray使用也有一段时间了, 这篇文章总结下ray的使用场景和用法

ray可以做什么?

总结就两点:

  1. 可以将其视为一个进程池(当然不仅限于此), 可以用于开发并发应用
  2. 还可以将应用改造为分布式
    基于以上两点, 有人称之为:Modern Parallel and Distributed Python

构成

  • Ray AI Runtime
    用于开发分布式机器学习应用的工具包, 包括数据处理/模型训练和tuning/强化学习/部署服务…
  • Ray Core
    用于开发/改造并发/分布式应用程序, 大部分通过装饰器形式实现. 因此如果你想改造现有应用, 基本不用怎么修改代码.
  • Ray Clusters
    用于在云上或k8s集群上开发自动伸缩服务的分布式程序.

使用

由于笔者只使用过Ray Core功能, 因此只介绍这个模块, 其他可以参考官网ray doc

  1. 安装
pip install ray
  1. 术语
  • Task: 任务实例, 通过给函数添加装饰器实现

看下例子:

import time
import ray

@ray.remote
def square(x):
	time.sleep(5)
	return x * x

start = time.time()
tasks = [square.remote(i) for i in range(3)]
print(ray.get(tasks))
end = time.time()
print(f'time cost:{end-start}')

输出:

[0, 1, 4]
time cost:9.302684783935547

如果顺序执行square()3次, 预计需要15s, 但是使用了@ray.remote后, 总执行时间缩减到了9s(sleep时间太短会出现改造后的执行时间反而更大的现象, 这是因为ray在启动时会先进行初始化(类似于生成进程池), 这个本身也是耗时的, 本机测试大概需要4s)

上面例子可以看出, 要将一个普通函数改造为并发非常简单, 只需要加装饰器后执行func.remote(*args, **kwargs)即可, 获取函数结果使用rag.get(), 但需要注意的是, square.remote(i)是非阻塞的, 立即返回, 而remote.ray.get()是阻塞的(有点类似multipleprocessing pool中的apply_async()), 因此在启动多个task期间, 不要去get, 否则就会退化为顺序执行.

  • actor: 任务实例, 通过给类添加装饰器实现
    看下例子:
@ray.remote
class Counter:
	def __init__(self):
		self.i = 0

	def get(self):
		return self.i

	def incr(self, value):
		self.i += value
c = Counter.remote()

for _ in range(10):
	c.incr.remote(1)

print(ray.get(c.get.remote()))

输出: 10
用法和上面的task差不多.

  • objects
    在ray中, 数据或者可以产生数据的对象(如上面的task和actor)称为object, 该对象一旦生成不可改变. 这么说可能有点抽象, 举个例子, 一般大型任务由多个小任务组成, 这些小任务组成了一个pipeline, 该pipeline上的所有节点都是object, 每个obect都有自己的object ref, 相当于它的id, 在集群所有node上是唯一的. 看下计算 ( ( a + b ) × 2 ) 2 ((a+b)\times2)^2 ((a+b)×2)2例子:
import ray


@ray.remote
def simple_sum(a, b):
	return a + b


@ray.remote
class Mul:
	def __init__(self, factor):
		self.factor = factor

	def process(self, x):
		return x * self.factor


@ray.remote
def square(a):
	return a * a


if __name__ == '__main__':
	a, b = 3, 5
	simple_sum_ref = simple_sum.remote(a, b)
	mul = Mul.remote(2)
	mul_ref = mul.process.remote(simple_sum_ref)
	square_ref = square.remote(mul_ref)
	print('simple_sum_ref==>', simple_sum_ref)
	print('mul_ref==>', mul_ref)
	print('square_ref==>', square_ref)
	print('result: ', ray.get(square_ref))

输出:

simple_sum_ref==> ObjectRef(c8ef45ccd0112571ffffffffffffffffffffffff0100000001000000)
mul_ref==> ObjectRef(c2668a65bda616c17530094e1437f255eb2e95990100000001000000)
square_ref==> ObjectRef(32d950ec0ccf9d2affffffffffffffffffffffff0100000001000000)
result:  256
  • ray.put()
    生成object有两种方式, 一种如上面例子, 调用task或者actor, 便会return回来一个object, 另外一种方式就是使用ray.put(), 看下例子:
import ray
import numpy as np

@ray.remote
def matrix_sum(x):
	return np.sum(x)

if __name__ == '__main__':
	a_ref = ray.put(np.array([1,2,3]))
	print(f'a_ref==>{a_ref}')
	print(ray.get(matrix_sum.remote(a_ref)))

输出:

a_ref==>ObjectRef(00ffffffffffffffffffffffffffffffffffffff0100000001000000)
6

有小伙伴会问, 直接把上面的numpy array传给task就行了, 为什么要多此一举, 使用put先生成object, 再传递过去呢?
这就涉及到ray的内存管理了, 如下图:
在这里插入图片描述在ray中, 执行任务的实体就是actor和task, 相当于multiprocessing中的worker, 和worker类似, 每个actor或task都是一个单独进程, 他们之间是不共享内存的, 但是实际任务中少不了要交换数据怎么办?通过一块叫Object Store的区域. 这块内存区域是共享的, 是用来存储object的地方, 各个actor或task产生的obect都会放在这个区域, 如果想获取obect的value, 也是从这个区域取的结果.
基于以上原因, 在某些场景, 如果为了方便共享数据, 尤其是在分布式的环境下, 如果想共享某变量, 只需要使用ray.put()将该变量转化为object, 该集群下的所有节点都可以get到该数据了.
比如我有100w张imgs, 需要在分布式的环境下分析所有imgs的数据质量(大小, 曝光等等). 可以通过将100w个imgs路径打包成一个object, ray的各个节点就可以获取到这个object, 然后每个节点各分析一部分即可.

  • ray serve
    有空再补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/350973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis多级缓存

文章目录一. 什么是多级缓存二. JVM进程缓存一. 什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能…

Linux高级IO

文章目录一、五种 IO 模型1.阻塞 IO2.非阻塞 IO3.信号驱动 IO4. IO 多路转接5.异步 IO二、高级 IO 重要概念1.同步通信和异步通信2.阻塞和非阻塞fcntl 系统调用3.其他高级 IO三、I/O 多路转接之 select1.函数原型socket 就绪的条件2.理解 select 的执行过程3.使用示例4. select…

新手小白如何入门黑客技术?

你是否对黑客技术感兴趣呢?感觉成为黑客是一件很酷的事。那么作为新手小白,我们该如何入门黑客技术,黑客技术又是学什么呢? 其实不管你想在哪个新的领域里有所收获,你需要考虑以下几个问题: 首先&#xff…

Springboot扩展点之FactoryBean

前言FactoryBean是一个有意思,且非常重要的扩展点,之所以说是有意思,是因为它老是被拿来与另一个名字比较类似的BeanFactory来比较,特别是在面试当中,动不动就问你:你了解Beanfactory和FactoryBean的区别吗…

spring cloud gateway网关和链路监控

文章目录 目录 文章目录 前言 一、网关 1.1 gateway介绍 1.2 如何使用gateway 1.3 网关优化 1.4自定义断言和过滤器 1.4.1 自定义断言 二、Sleuth--链路追踪 2.1 链路追踪介绍 2.2 Sleuth介绍 2.3 使用 2.4 Zipkin的集成 2.5 使用可视化zipkin来监控微服务 总结 前言 一、网关…

ubuntu wordpress建站

nginx 安装测试 https://blog.csdn.net/leon_zeng0/article/details/113578143 ubuntu 基于apache2安装wordpress https://ubuntu.com/tutorials/install-and-configure-wordpress#7-configure-wordpress 报错403的话,是权限没搞对,解决参考https://ww…

空间误差分析:统一的应用导向处理(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…

深度学习算法面试常问问题(二)

X86和ARM架构在深度学习侧的区别? X86和ARM架构分别应用于PC端和低功耗嵌入式设备,X86指令集很复杂,一条很长的指令就可以完成很多功能;而ARM指令集很精简,需要几条精简的短指令完成很多功能。 影响模型推理速度的因…

mysql分库分表概念及原理、ShardingSphere实现mysql集群分库分表读写分离

一:分库分表概念 1.1 为什么要对数据库进行分表 索引的极限:单表数据量达到几十万或上百万以上,使用索引性能提升也不明显。 分表使用门槛:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 分表适用…

MIT 6.S965 韩松课程 04

Lecture 04: Pruning and Sparsity (Part II) 文章目录Lecture 04: Pruning and Sparsity (Part II)剪枝率分析每层的敏感度自动剪枝微调和训练稀疏网络彩票假说稀疏度的系统支持不均衡负载M:N 稀疏度本讲座提纲章节 1:剪枝率分析每层的敏感度AMC: AutoML for Model…

C#:Krypton控件使用方法详解(第四讲) ——kryptonLabel

今天介绍的Krypton控件中的kryptonLabel,下面开始介绍这个控件的属性:首先介绍控件中的外观属性:Cursor属性:表示功能为鼠标移动过这个控件的时候显示光标的类型。Text属性:表示显示的文本内容。其他属性不做过多的介绍…

编写 Cypher 代码续

编写 Cypher 代码 过滤查询 查看图中的唯一性约束索引 SHOW CONSTRAINTS查看图中关系的属性类型 CALL db.schema.relTypeProperties()查看图中节点的属性类型 CALL db.schema.nodeTypeProperties()查看数据模型 CALL db.schema.visualization()用 WHERE 子句添加过滤条件 查询执…

28k入职腾讯测试岗那天,我哭了,这5个月付出的一切总算没有白费~

先说一下自己的个人情况,计算机专业,16年普通二本学校毕业,经历过一些失败的工作经历后,经推荐就进入了华为的测试岗,进去才知道是接了个外包项目,不太稳定的样子,可是刚毕业谁知道什么外包不外…

jsp营养配餐管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp营养配餐管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使…

企业带宽控制管理

在企业中保持稳定的网络性能可能具有挑战性,因为采用数字化的网络可扩展性和敏捷性应该与组织的发展同步。随着基础设施的扩展、新应用和新技术的引入,网络的带宽容量也在增加。 停机和带宽过度使用是任何组织都无法避免的两个问题,为了解决…

最新版海豚调度dolphinscheduler-3.1.3配置windows本地开发环境

0 说明 本文基于最新版海豚调度dolphinscheduler-3.1.3配置windows本地开发环境,并在windows本地进行调试和开发 1 准备 1.1 安装mysql 可以指定为windows本地mysql,也可以指定为其他环境mysql,若指定为其他环境mysql则可跳过此步。 我这…

IB学科学习方法分享,看看不同学科怎么学习?(二)

分享人:李 分享学科:物理HL (个人选课:HL:数学 物理 VA。SL:英语 中文 经济。) IB物理学习内容:(IB物理有HL和SL之分,SL学习的是核心内容,HL则…

通过IP地址如何解决反欺诈?

IP地址在反欺诈方面可以提供有用的信息。以下是一些常见的方法:地理定位:根据IP地址,可以确定访问者的地理位置。这可以帮助您确定是否来自欺诈者通常不在的地理区域的IP地址。可疑行为:通过分析来自某个IP地址的活动,…

802.1x认证方式(EAP中继认证与EAP终结认证)

文章目录1、前言2、协议说明3、报文分析EAP中继模式:MD5-challengeEAP终结模式:MD5-challengeRadius CHAP认证原理参考资料:1、前言 802.1x协议是基于Client/Server的访问控制和认证协议。 它可以限制未经授权的用户/设备通过接入端口(access port)访问LAN/WLAN。在…

element-ui日期控件el-canlender学习笔记

需求&#xff1a;点击日历控件中的某一天&#xff0c;弹出弹出框添加这一天的活动。 任务分析&#xff1a; 点击日历控件的某一天&#xff0c;获取当前日期信息 代码实现&#xff1a; <el-calendar v-model"nowDate" ><templateslot"dateCell"sl…