初窥Ray框架
ccwgpt 2024-11-18 09:34 19 浏览 0 评论
随着各行各业数字化的不断推进,AI需要处理的数据越来越多,单一服务器已经难以满足当前产业的发展需求,服务器集群成为企业用AI处理数据的标配硬件,而分布式计算成为人工智能应用的标配软件。
从图1可以看出,现今有很多开源的分布式计算框架,从模型的训练、调参到部署;从NLP、CV到RS;这些框架覆盖到了AI产业生命周期的各个方面。本文就选取其中的Ray框架进行简单的介绍。
Ray 是伯克利大学在2017年开源的分布式计算框架,对应的论文是《Ray: A Distributed Framework for Emerging AI Applications》。强化学习任务需要与环境进行大量的交互(毫秒级),且在时间上支持异构性。该框架专门为机器学习与强化学习设计,相较于其他框架,ray具有以下优势:
- 轻量级
- 可快速构建
- 通用性强
- 性能优异
下面就这四个优点为大家进行详细介绍。
1. Ray框架的优势
1.1 轻量级
相较于传统的分布式框架(尤其是hadoop、spark等),Ray可以直接通过pip进行安装,且对系统版本无要求。
pip install -U ray
Ray是一个简单的分布式策略,而非完整的生态,因而不需要复杂的构建。
另一方面,轻量而优秀的框架往往可以作为企业数据处理的基础框架,企业不断在该框架的基础上增加生态,从而形成企业独有的应用生态。
1.2 可快速构建
如hadoop等传统框架,要对原有的单机程序进行分布式化,需要修改整个代码逻辑,以MapReduce的编程方案重构各个计算模块,这使得hadoop等传统框架有着良好的可编辑性,算法工程师可以根据业务需求进行详细的修改。强大的可编辑性也带来了学习成本高,代码重构困难等诸多问题。人工智能日新月异,模型在不断更迭,敏捷开发成为了很多AI企业的开发模式,AI应用的复杂构建会大大影响整个项目的推进。
如下代码,将一个简单的单机程序函数,转换为Ray分布式的函数,只是在原有函数的基础上加入了ray.remote的装饰器,便完成了分布式化的工作。
### 原始单机代码
def f(x):
return x * x
futures = [f.remote(i) for i in range(4)]
print(ray.get(futures))
### Ray分布式代码
import ray
ray.init()
@ray.remote
def f(x):
return x * x
futures = [f.remote(i) for i in range(4)]
print(ray.get(futures))
1.3 通用性强
近年tensorflow、torch等深度学习框架成为人工智能应用的模型框架,考虑到产业应用场景,这些框架都给出了各自分布式训练和部署的方案,且这些方案的计算资源利用率较高。大型的项目往往由数个算法模型组成,为了快速开发,算法工程师往往采用开源的代码构建,而这些开源的代码采用的深度学习框架很可能互不相同,针对单一框架的分布式方案难以适用。
除此之外,ONNIX等为代表的框架,倾向于将所有框架的模型统一到单一的解决方案上,由于很多前沿的深度学习模型对神经元进行了复杂的修改,无法适配到通用的算子上,需要算法工程师手写算子,从而拖慢了开发速度。Ray将机器学习模型、numpy数据计算、单一的函数抽象成通用的计算,实现了对各种深度学习框架、机器学习框架的适配。
另外,Ray对强化学习的应用进行了专门的生态构建。
1.4 性能优异
图2为Ray、Horovod以及tensorflow原生的分布式方案训练ResNet-101模型的比较,纵轴为每秒平均迭代的图片数,可以看出Ray略微优于Horovod框架。
图3为Clipper和Ray在模型调用上吞吐量的比较,两者均用同一网络模型,可以看出Ray优于Clipper。
Ray并没有做到每个分布式场景都优于其他框架,但Ray集合训练、调参以及部署为一体,仍能保持不错的性能,因而值得学习和使用。
得益于Ray框架良好的性能,Ray广泛用于工业界(如蚂蚁金服),要先学会使用Ray必先了解Ray的构成,下一小节就Ray的构成进行介绍。
2. Ray的使用
2.1 Ray的构成
Ray大致由四部分组成:
- Tune: 超参数调整模块
- RLlib: 强化学习模块
- RaySGD: 分布式训练模块
- Ray Serve: 应用服务部署模块
Ray涉及了AI应用的整个生命周期:训练、调参、部署,并对强化学习场景进行了专门的优化。由于个人使用经验有限,这里只介绍Ray的Serve模块。
2.2 Ray的启动
如图4,Ray由一个头节点(Head node)和一组工作节点(Worker node)组成。启动Ray需要首先启动头节点,并为工作节点提供头节点的地址以形成集群。头节点负责管理和分配工作节点的任务,工作节点负责执行任务并返回结果。经过测试,头节点和工作节点可以为同一台计算机。
Ray的启动由两个步骤组成:启动头节点、注册工作节点到头节点。
以下是头节点的启动代码和关闭代码。
import ray
ray.init() # 启动
assert ray.is_initialized() == True
ray.shutdown() # 关闭
assert ray.is_initialized() == False
注:启动脚本应当加入关闭代码,如果没有,ray程序可能一直在进程中运行。
Ray框架采用Actor模型,相较于传统的共享内存模型,Ray不存在状态竞争、可以方便的组建集群、能更好的控制状态。每个Actor即每个工作节点的注册方式如下。
import ray
ray.init(address=头节点地址) # 启动
assert ray.is_initialized() == True
ray.shutdown() # 关闭
assert ray.is_initialized() == False
2.3 Ray Serve
Ray Serve可以类比clipper,主要用于模型的部署服务,并支持多种深度学习框架,官方给出的示例有:
- Keras and Tensorflow Tutorial
- PyTorch Tutorial
- Scikit-Learn Tutorial
这里以tensorflow2为例,来说一下如何用ray来部署模型服务。
步骤一:定义一个模型服务类
如下是模型服务类的简易代码,和Flask等框架部署AI服务类似。由于Ray使用gRPC作为通信协议,速度更快,Ray还在gRPC基础上进行了优化,有些场景快于原生的gRPC通信。
class TFMnistModel:
def __init__(self, model_path):
import tensorflow as tf
self.model_path = model_path
# 加载模型
self.model = tf.keras.models.load_model(model_path)
async def __call__(self, starlette_request): # 异步调用
# transform HTTP request -> tensorflow input
input_array = np.array((await starlette_request.json())["array"])
reshaped_array = input_array.reshape((1, 28, 28))
# tensorflow input -> tensorflow output
prediction = self.model(reshaped_array)
# 返回结果
# tensorflow output -> web output
return {
"prediction": prediction.numpy().tolist(),
"file": self.model_path
}
步骤二:模型部署到Ray Serve
如下代码中,start函数用于启动服务,create_backend函数用于启动模型,create_endpoint函数启动服务。在Ray中,模型和服务是分离的,可以多个服务调用同一个模型,以支持复杂的调用逻辑。
"tf:v1"为模型的名称,"tf_classifier"为服务的名称,route参数为路由,这些参数都可自由定义。
client = serve.start()
client.create_backend("tf:v1", TFMnistModel, TRAINED_MODEL_PATH)
client.create_endpoint("tf_classifier", backend="tf:v1", route="/mnist")
步骤三:请求测试
resp = requests.get(
"http://localhost:8000/mnist",
json={"array": np.random.randn(28 * 28).tolist()})
print(resp.json())
3. 结语
一个优秀的框架往往包含了众多先进的设计理念。Ray框架在构建时,参考了许多先进的设计理念,如混合调度策略、GCS 管理等等,这些设计理念使得框架本身完善而又先进。Ray广泛用于AI企业的分布式计算场景,从众多框架中脱颖而出,值得学习。
我们是行者AI,我们在“AI+游戏”中不断前行。
快来【公众号 | xingzhe_ai】,和我们讨论更多技术问题吧!
- 上一篇:任务调度框架 Quartz 用法指南「超详细」
- 下一篇:脚本“72”变
相关推荐
- 如何使用PIL生成验证码?(pi验证教程)
-
web项目中遇到使用验证码的情况有很多,进行介绍下使用PIL生成验证码的方法。安装开始安装PIL的过程确实麻烦各种问题层出不绝,不过不断深入后就没有这方面的困扰了:windows安装:直接安装Pil...
- Python必学!3步解锁asyncio异步编程 性能直接狂飙10倍!
-
还在用传统同步代码被IO阻塞卡到崩溃?别当“代码苦行僧”了!Python的asyncio模块堪称异步编程的“开挂神器”,处理高并发任务就像开了涡轮增压!不管是网络爬虫、API接口开发还是文件批量处理,...
- Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务
-
定时任务的典型落地场景在各行业中都很普遍,比如支付系统中,支付过程中因为网络或者其他因素导致出现掉单、卡单的情况,账单变成了“单边账”,这种情况对于支付用户来说,毫无疑问是灾难级别的体验,明明自己付了...
- Python学习怎么入门?附真实学习方法
-
Python技术在企业中应用的越来越广泛,因此企业对于Python方面专业人才的需求也越来越大,那对于之前对Python没有任何了解和接触的人而言,想要从零开始学习并不是一件容易的事情,接下来小U就为...
- PySpider框架的使用(pyspider 教程)
-
PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...
- 大学计算机专业 学习Python学习路线图(最新版)
-
这是我刚开始学习python时的一套学习路线,从入门到上手。(不敢说精通,哈哈~)希望对大家有帮助哈~大家需要高清得完整python学习路线可以【文末有获取方式】【文末有获取方式】一、Python入门...
- 阿里巴巴打造的400集Python视频合集免费学起来,学完万物皆可爬
-
第一阶段Python入门章节1:Python入门章节2:编程基本概念章节3:序列章节4:控制语句章节5:函数章节6:面向对象编程第二阶段Python深入与提高章节1:异常处理章节2:游戏开发-坦克大...
- Nginx Gunicorn在服务器中分别起什么作用
-
大部分人在gunicorn前面部署一层nginx的时候也的确没有想过为什么,他们只是觉得这样显得他们比较专业,而且幻想着加了一层nginx反向代理之后性能会有提升,恕我直言,请你们带上脑子,一个单纯的...
- Python培训怎么学?Python基础技术总结!值得一看
-
Python培训如今越来越被更多人所接受,相比自学参加Python培训的好处也是显而易见,但Python毕竟属于后端编程开发的主流语言,其知识机构还是比较庞大的,那Python培训怎么学?以及Pyth...
- 使用Tornado部署Flask项目(tornado async)
-
Tornado不仅仅是一个WEB框架,也可以是一个WEB服务器。在Tornado中我们可以使用wsgi模块下的WSGIContainer类运行其他WSGI应用如:Fask,Bottle,Djang...
- Python Web框架哪个好用?(python3 web框架)
-
问:PythonWeb框架哪个好用? 答: 1.Django Django是Python世界中最出名、最成熟的Web框架。Django功能全面,各模块之间结合紧密,(不讲其他的)Djang...
- Vue3.0+Tornado6.1发布订阅模式打造异步非阻塞实时=通信聊天系统
-
“表达欲”是人类成长史上的强大“源动力”,恩格斯早就直截了当地指出,处在蒙昧时代即低级阶段的人类,“以果实、坚果、根作为食物;音节清晰的语言的产生是这一时期的主要成就”。而在网络时代人们的表达欲往往更...
- Python开源项目合集(第三方平台)(python第三方开发工具)
-
wechat-python-sdk-wechat-python-sdk微信公众平台Python开发包http://wechat-python-sdk.readthedocs.org/,非官方...
- IT界10倍高效学习法!用这种方式,一年学完清华大学四年的课程
-
有没有在某一个瞬间,让你放弃学编程刚开始学python时,我找了几十本国内外的python编程书籍学习后,我还是似懂非懂,那些书里面到处都是抽象的概念,复杂的逻辑,这样的书,对于专业开发者来说,在平常...
- 如何将Python算法模型注册成Spark UDF函数实现全景模型部署
-
背景Background对于算法业务团队来说,将训练好的模型部署成服务的业务场景是非常常见的。通常会应用于三个场景:部署到流式程序里,比如风控需要通过流式处理来实时监控。部署到批任务中部署成API服...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何使用PIL生成验证码?(pi验证教程)
- Python必学!3步解锁asyncio异步编程 性能直接狂飙10倍!
- Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务
- Python学习怎么入门?附真实学习方法
- PySpider框架的使用(pyspider 教程)
- 大学计算机专业 学习Python学习路线图(最新版)
- 阿里巴巴打造的400集Python视频合集免费学起来,学完万物皆可爬
- Nginx Gunicorn在服务器中分别起什么作用
- Python培训怎么学?Python基础技术总结!值得一看
- 使用Tornado部署Flask项目(tornado async)
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)