首页 > 其他分享 >Ray一个通用分布式计算框架基本使用

Ray一个通用分布式计算框架基本使用

时间:2024-01-22 09:04:18浏览次数:34  
标签:remote 框架 self 分布式计算 行动 任务 Ray ray

  Ray一个开源的通用分布式计算框架,支持传统的并行任务并支持AI模型的分布式训练,分布式任务包括有状态与无状态任务,Ray能够快速的构建分布式系统,支持按需申请CPU或GPU;Ray提供了统一的接口提供了基于任务的并行计算与基于行动器的计算,前者通常用于无状态的任务后者用于有状态的任务;Ray为一个具有高可扩展性、容错性的分布式计算集群框架;集群即可逻辑运行亦支持K8S生态与Docker环境运行;
  Ray架构分为应用层和系统层组成,应用层提供了Ray API,系统层保障Ray的高可扩展和容错性;

1.png

  应用层对应了三种类型的进程:驱动进程、工作器进程、行动器进程组成;
  驱动器 (Driver ): 执行用户程序的进程,所有操作都需要由主进程来驱动。
  工作器 (Worker ): 执行由驱动器或其他工作器调用的任务(远程函数)的无状态的进程。工作器是在系统层分配任务时自动启动的。当声明一个远程函数时,该函数将被自动发送到所有的工作器中。在同一个工作器中,任务是串行地执行的,工作器并不维护其任务与任务之间的局部状态,即在工作器中,一个远程函数执行完后,其局部作用域的所有变量将不再能被其他任务所访问。
  行动器 (Actor ): 行动器被调用时只执行其所暴露的方法。行动器由工作器或驱动器显式地进行实例化。与工作器相同的是,行动器也会串行地执行任务,不同的是行动器上执行的每个方法都依赖于其前面所执行的方法所变更的状态。

  三种进程在代码中的体现:

def f(x):
    # 工作器进程
    return x * x

@ray.remote
class Counter(object):
    def __init__(self):
        # 行动器进程
        self.value = 0

    def increment(self):
        #行动器进程
        self.value += 1
        return self.value

if __name__ == "__main__":
    #驱动器进程
    object_ref = f.remote(2)
    assert ray.get(object_ref) == 4
    counter = Counter.remote()
    ref = counter.increment.remote()
    assert ray.get(ref) == 1


  系统层由三个主要部件组成:全局控制存储器 (Global Control Store)、分布式调度器 (Distributed Scheduler)和分布式对象存储器 (Distributed Object Store)。这些部件在横向上是可扩展的,可以增减这些部件的数量,同时还具有一定容错性。

Ray安装

  Ray框架有多个组成部分,可单独或组合安装,组件包括Ray Core、Ray Data、Ray Data、Ray Train、Ray Tune、Ray Serve、Dashboard等;其中Ray Core提供了分布式应用的核心的基础部分的支持如Tasks、Actors、Objects等;Ray Train是一个可扩展的机器学习库,用于分布式训练和微调。其支持PyTorch、TensorFlow、Keras、XGBoost、LightGBM、Hugging Face Transformers等框架;

pip install -U "ray[default]"  Core, Dashboard, Cluster Launcher
pip install -U "ray[train]"  Core, Train
pip install -U "ray[all]"  Core, Dashboard, Cluster Launcher, Data, Train, Tune, Serve, RLlib


Ray集群

2.png

  Ray实现了工作负载从笔记本电脑到大型集群的无缝扩展。Ray只需调用Ray.init即可在单机上开箱即用;但如要在多个节点上运行Ray应用程序,必须首先部署Ray集群。
  Ray集群是由一组工作节点连接到一个公共Ray Head节点组成。Ray集群可以是固定大小的,也可以根据集群上运行的应用程序请求的资源自动上下缩放。Head节点运行集群控制进程如自动收缩、GCS、驱动器等,每个节点都有一组助手进程用于分布式调度与内存管理;

Ray集群启动

ray start --head

启动Work节点
ray start --address='127.0.0.1:6379'

节点退出
ray stop

集群监控地址:http://127.0.0.1:8265

Resource Status
Usage:
0.0/36.0 CPU
0B/17.76GiB memory
0B/8.04GiB object_store_memory
Demands:
(no resource demands)

3.png
4.png

往集群提交任务


ray.init(address='ray://127.0.0.1:10001')

@ray.remote
def sum(a):
    return a * 2

ret = ray.get(h.remote(100))

print(ret)

Ray两种计算模式:任务Task、行动器Actor;

任务Task

  任务执行为无状态的,任务无法修改作为本地变量传入的值,Ray远程函数为无副作用的;
编写任务流程:
  1、注册任务:在注册为任务的函数上添加@ray.remote修饰器
  2、提交任务:在调用@ray.remote修饰器的函数时需带上.remote()
  3、非阻塞提交:提交任务后立即返回ObjectRef对象
  4、阻塞获取结果:通过ray.get传入返回的ObjectRef对象获取函数返回值

行动器Actor

  有状态的的计算任务,行动器方法调用可能会修改行动器状态,属于有副作用的函数,因此同一行动器下的方法需按顺序串行调用;

编写行动器流程:
  1、注册行动器:在注册行为器的类上加上@ray.remote装饰器
  2、实例化行动器:实例化类实例时需在类名后加上.remote()
  3、提交方法调用:调用行动器方法需加上.remote()
  4、非阻塞提交:提交后返回一个ObjectRef对象,同一行动器实例下方法会按提交顺序执行
  5、阻塞获取结果:通过ray.get传入ObjectRef获取结果

class Computer(object):
    def __init__(self):
        self.value = 0

    def increment(self):
        self.value += 1
        return self.value

computer = Computer.remote()

ref = computer.increment.remote()

ray.get(ref) 


下面程序会提交三个任务:

5.png

import ray

@ray.remote
def multiply(x,y):
    return np.dot(x,y)

@ray.remote
def zeros(size):
    return np.zeros(size)

x = zeros.remote((10,10))
y = zeros.remote((10,10))

z = multiply.remote(x,y)

z = ray.get(z)

print(z)


7.png

  单节点12CPU,申请超过12CPU时任务就会分布到其他节点上,如申请20CPU,任务20个epochs,那20个epochs将分布到20CPU上执行,申请20CPU时Ray会申请创建21个Actor其中20个为RayTrainWorker训练工作用;

参考资料
https://arxiv.org/pdf/1712.05889.pdf
Ray v2 Architecture - Google 文档

文章首发地址:https://mp.weixin.qq.com/s/EqlpdYMdfC4glAnOAq9PNQ

标签:remote,框架,self,分布式计算,行动,任务,Ray,ray
From: https://www.cnblogs.com/softlin/p/17976571

相关文章

  • 无涯教程-CodeIgniter - MVC框架
    CodeIgniter基于模型-视图-控制器(MVC)开发模式。MVC是一种将应用程序逻辑与表示分离的软件方法。Model    - 代表数据模型,主要跟数据库打交道,实现无涯教程的CURD封装。View      - 是前台展示给用户看的界面。Controller - Model和View的桥梁......
  • 使用Gin框架往数据库插入记录
    首先往数据库插入数据,就需要连接数据库(笔者此处使用的是PostgreSQL)因此在项目中引入如下依赖(这两个依赖版本号不一致,可能会出现异常)gorm.io/driver/postgres  //依赖是用于连接和操作PostgreSQL数据库gorm.io/gorm  //对象关系映射(ORM)库,简化Golang程序与数据库......
  • ohos.router (页面路由) 框架
    UIAbility概述UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互。UIAbility也是系统调度的单元,为应用提供窗口在其中绘制界面。每一个UIAbility实例,都对应于一个最近任务列表中的任务。一个应用可以有一个UIAbility,也可以有多个UIAbility,如下图所示。例如浏览器......
  • 模块,包,库,框架的使用
    一、模块Module 模块是一个变量、数组、函数和类的集合。另外,模块是一种以.py为后缀的文件,用于表示程序的一部分,模块的名称是该.py文件的名称。模块的名称**作为一个全局变量__name__**的取值可以被其他模块获取或导入。 模块的导入通过ipmort来实现,导入模块的方式如下: i......
  • 【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析
    专栏介绍学习JVM需要一定的编程经验和计算机基础知识,适用于从事Java开发、系统架构设计、性能优化、研究学习等领域的专业人士和技术爱好者。前提准备编程基础:具备良好的编程基础,理解面向对象编程(OOP)的基本概念,熟悉Java编程语言。数据结构与算法:对基本的数据结构和算法有一定了解,理......
  • ValueError: Found array with dim 4. None expected <= 2.
     Traceback(mostrecentcalllast): File"train.py",line109,in<module>   out,eval_res=tasks.eval_forecasting(model,data,train_slice,valid_slice,test_slice,scaler,pred_lens,n_covariate_cols,args.max_train_length-1) Fil......
  • Scrapy爬虫框架
    网络爬虫框架:ScrapyScrapy是一个非常优秀的爬虫框架,通过Scrapy框架,可以非常轻松的实现强大的爬虫系统。一、Scrapy简介Scrapy主要包括如下6个部分:ScrapyEngine:用来处理整个系统的数据流,触发各种事件。Scheduler:从URL队列中取出一个URL。Downloader:从internet上下载web资源......
  • go gin 必须使用 dive 标记,它告诉 required 校验 深入到 slice、array 这样的子结
    packagemainimport( "fmt" "net/http" "github.com/gin-gonic/gin")typeuserstruct{ Namestring`json:"name"binding:"required"` Emailstring`json:"email"binding:"required,email"`......
  • selenium4框架学习
    selenium4框架学习https://blog.csdn.net/qq_45158700/article/details/135363339浏览器驱动&selenium文档下载SeleniumwithPython中文翻译文档:https://selenium-python-zh.readthedocs.io/en/latest/下面链接中为103.0.5060.53版本的浏览器和对应的chromedriver​ 链接:ht......
  • 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.0版已发布
    关于MobileIMSDKMobileIMSDK是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持UDP 、TCP 、WebSocket 三种协议,支持iOS、Android、H5、小程序、Uniapp、标准Java平台,服务端基于Netty编写。工程开源地址是:1)Gitee码云地址:https://gitee.com/ja......