首页 > 编程语言 >Ray 源码分析(16)—Ray Serve

Ray 源码分析(16)—Ray Serve

时间:2025-01-14 23:04:42浏览次数:3  
标签:__ handle 16 self serve 源码 world Ray

前言

Ray Serve 是一个可扩展的模型服务库,用于构建在线推理 API。Serve 与框架无关,因此你可以使用一个单一的工具包来服务从使用 PyTorch、TensorFlow 和 Keras 等框架构建的深度学习模型,到 Scikit-Learn 模型,再到任意 Python 业务逻辑的所有内容。它具有多项用于服务大语言模型的特性和性能优化,例如响应流、动态请求批处理、多节点 / 多 GPU 服务等。

据说OpenAI背后用Serving框架也是Ray Serve,今天继续开盲盒,看看天才们都是怎么想的。

使用示例

import requests
from starlette.requests import Request
from typing import Dict

from ray import serve

# 1: Define a Ray Serve application.
@serve.deployment
class MyModelDeployment:
    def __init__(self, msg: str):
        # Initialize model state: could be very large neural net weights.
        self._msg = msg

    def __call__(self, request: Request) -> Dict:
        return {
   "result": self._msg}

app = MyModelDeployment.bind(msg="Hello world!")

# 2: Deploy the application locally.
serve.run(app, route_prefix="/")

# 3: Query the application and print the result.
print(requests.get("http://localhost:8000/").json())
# {'result': 'Hello world!'}

关键概念

Deployment

deployment是 Ray Serve 中的核心概念。一个deployment包含处理传入请求的业务逻辑或机器学习模型,并且可以扩展以在 Ray 集群中运行。在运行时,一个部署由多个副本组成,这些副本是在单独的 Ray Actor(进程)中启动的类或函数的单个副本。副本的数量可以根据传入的请求负载进行增加或减少(甚至自动缩放)。

from ray import serve
from ray.serve.handle import DeploymentHandle

@serve.deployment
class MyFirstDeployment:
    # Take the message to return as an argument to the constructor.
    def __init__(self, msg):
        self.msg = msg

    def __call__(self):
        return self.msg

my_first_deployment = MyFirstDeployment.bind("Hello world!")
handle: DeploymentHandle = serve.run(my_first_deployment)
assert handle.remote().result() == "Hello world!"

Application

Application是 Ray Serve 集群中的新玩意儿,一个Application由一个或多个部署组成。其中一个部署被视为 “入口” 部署,它处理所有入站流量。说白了,就是服务的服务,帮忙串起来所有的microservice。

可以通过指定路由前缀的 HTTP 或在 Python 中使用 DeploymentHandle 来调用应用程序。

DeploymentHandle

Ray Serve 允许多个独立的部署相互调用,从而实现灵活的模型组合和扩展。在绑定一个部署时,你可以包含对其他已绑定部署的引用。然后,在运行时,这些参数中的每一个都会转换为一个 DeploymentHandle,可用于通过原生 Python API 查询该部署。下面是一个基本示例,其中入口(Ingress)部署可以调用两个下游模型。

from ray import serve
from ray.serve.handle import DeploymentHandle

@serve.deployment
class Hello:
    def __call__(self) -> str:
        return "Hello"

@serve.deployment
class World:
    def __call__(self) -> str:
        return " world!"

@serve.deployment
class Ingress:
    def __init__(self, hello_handle: DeploymentHandle, world_handle: DeploymentHandle):
        self._hello_handle = hello_handle
        self._world_handle = world_handle

    async def __call__(self) -> str:
        hello_response = self._hello_handle.remote()
        world_response = self._world_handle.remote()
        return (await hello_response) + (await world_response)

hello = Hello.bind()
world = World.bind()

# The deployments passed to the Ingress constructor are replaced with handles.
app = Ingress.bind(hello, world)

# Deploys Hello, World, and Ingress.
handle: DeploymentHandle = serve.run(app)

# `DeploymentHandle`s can also be used to call the ingress deployment of an application.
assert handle.remote().result() == "Hello world!"

Ray Serve Autoscaler vs Ray Autoscaler

Ray Serve 自动缩放器是一个位于 Ray 自动缩放器之上的应用程序级自动缩放器。具体来说,这意味着 Ray Serve 自动缩放器会根据请求需求要求 Ray 启动一定数量的副本 Actor。如果 Ray 自动缩放器判定没有足够的可用资源(如 CPU、GPU 等)来安置这些 Actor,它会请求更多的 Ray 节点。然后,底层的云服务提供商将响应并添加更多节点。同样,当 Ray Serve 进行缩容并终止副本 Actor 时,它会尽可能让多个节点处于空闲状态,以便 Ray 自动缩放器可以移除它们。架构图如下:

在这里插入图片描述

源码分析

api

  • 所有暴露给用户的代码都放在了:https://github.com/ray-project/ray/blob/master/python/ray/serve/api.py

Deployment

接口定义

# 表示该API是公共的且稳定性为“稳定”
@PublicAPI(stability="stable")
def deployment(
    # 要转换为部署的可调用对象(函数或类),可以为None
    _func_or_class: Optional[Callable] = None,
    # 应用程序内唯一标识此部署的名称。如果未提供,则使用类或函数的名称
    name: Default[str] = DEFAULT.VALUE,
    # 此部署的版本,默认值为DEFAULT.VALUE
    version: Default[str] = DEFAULT

标签:__,handle,16,self,serve,源码,world,Ray
From: https://blog.csdn.net/weixin_43956669/article/details/145086108

相关文章

  • 美食推荐系统的设计与实现-毕业设计-附源码
              文末获取源码和万字论文,制作不易,感谢点赞支持。图片无法加载的情况可看文末私我获取        毕业设计(论文)题目:美食推荐系统的设计与实现      摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的......
  • 基于Java的愤怒的小鸟游戏的设计与实现【源码+文档+部署讲解】
    目录摘要Abstract1 绪论1.1游戏开发的背景1.2典型的Java游戏介绍1.2.1Minecraft介绍1.2.2SuperMarioBros介绍1.2.3 TheSims介绍1.3 游戏开发的意义2开发环境2.1开发语言2.2开发工具2.3JDK介绍2.4Java Awt介绍2.5 Java Swi......
  • flask框架团购轻量级网站毕设源码+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于团购轻量级网站的研究,现有研究主要以大型团购平台或综合电商平台中的团购板块为主,专门针对轻量级团购网站的研究较少。在国内外,大......
  • windows server2016搭建AD域服务器
    @目录一、背景二、搭建AD域服务器步骤三、生成可供java程序使用的keystore文件四、导出某用户的keytab文件五、主机配置hosts文件六、主机确认是否能ping通本人其他相关文章链接一、背景亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置......
  • not_the_same_3dsctf_2016 1
    打开ida能看到栈溢出,返回地址填到get_secret函数里面,可以看到get_secret函数是直接读取了flag的,现在就需要把它输出即可。输出我们可以利用代码里面的printf,因为printf从缓冲区打印出东西需要满足条件,比如有换行符或缓冲区已满或程序正常退出。这里我们用exit让程序正常退出,s......
  • JSP连锁洗衣店管理系统svhw2(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、项目背景随着生活节奏的加快,连锁......
  • JSP离退休管理系统7z292--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、研究背景与意义随着人口老龄化趋......
  • JSP老年人日间照料中心管理系统a498n--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、研究背景与意义随着老龄化社会的......
  • flask框架实验报告提交评阅系统毕设源码+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景随着教育信息化的不断发展,各类教学管理系统的需求日益增长。关于教学管理系统的研究,现有研究主要以综合教学管理平台为主,专门针对实验......
  • flask框架水务报修处理系统毕设源码+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景在当今社会,随着城市化进程的加速,水务系统的正常运行对居民生活和城市发展的重要性不言而喻。关于水务管理方面的研究,现有研究主要以水......