开发和部署 ML 应用#

在本地开发和在生产环境中部署 Ray Serve 应用的流程包括以下步骤

  • 将机器学习模型转换为 Ray Serve 应用

  • 在本地测试应用

  • 构建用于生产部署的 Serve 配置文件

  • 使用配置文件部署应用

将模型转换为 Ray Serve 应用#

此示例使用一个文本翻译模型

# File name: model.py
from transformers import pipeline


class Translator:
    def __init__(self):
        # Load model
        self.model = pipeline("translation_en_to_fr", model="t5-small")

    def translate(self, text: str) -> str:
        # Run inference
        model_output = self.model(text)

        # Post-process output to return only the translation text
        translation = model_output[0]["translation_text"]

        return translation


translator = Translator()

translation = translator.translate("Hello world!")
print(translation)

名为 model.py 的 Python 文件使用 Translator 类将英文文本翻译成法文。

  • Translator__init__ 方法中的 self.model 变量存储了一个使用 t5-small 模型翻译文本的函数。

  • 当对英文文本调用 self.model 时,它会返回一个字典格式的翻译法文文本,格式为 [{"translation_text": "..."}]

  • Translatortranslate 方法通过索引字典来提取翻译后的文本。

复制并粘贴脚本,然后在本地运行。它会将 "Hello world!" 翻译成 "Bonjour Monde!"

$ python model.py

Bonjour Monde!

使用 FastAPI 将此模型转换为 Ray Serve 应用需要进行三项更改

  1. 导入 Ray Serve 和 Fast API 依赖项

  2. 为带有 FastAPI 的 Serve 部署添加装饰器:@serve.deployment@serve.ingress(app)

  3. bind Translator 部署到传递给其构造函数的参数

有关其他 HTTP 选项,请参阅设置 FastAPI 和 HTTP

import ray
from ray import serve
from fastapi import FastAPI

from transformers import pipeline

app = FastAPI()


@serve.deployment(num_replicas=2, ray_actor_options={"num_cpus": 0.2, "num_gpus": 0})
@serve.ingress(app)
class Translator:
    def __init__(self):
        # Load model
        self.model = pipeline("translation_en_to_fr", model="t5-small")

    @app.post("/")
    def translate(self, text: str) -> str:
        # Run inference
        model_output = self.model(text)

        # Post-process output to return only the translation text
        translation = model_output[0]["translation_text"]

        return translation


translator_app = Translator.bind()

请注意,代码为部署配置了参数,例如 num_replicasray_actor_options。这些参数有助于配置部署副本的数量以及每个副本的资源需求。在本例中,我们设置了 2 个模型副本,每个副本占用 0.2 个 CPU 和 0 个 GPU。有关部署上可配置参数的完整指南,请参阅配置 Serve 部署

在本地测试 Ray Serve 应用#

要在本地测试,请使用 serve run CLI 命令运行脚本。此命令接收一个格式为 module:application 的导入路径。从包含保存为 model.py 脚本的本地副本的目录运行此命令,以便它可以导入应用

$ serve run model:translator_app

此命令运行 translator_app 应用,然后阻塞将日志流式传输到控制台。您可以使用 Ctrl-C 终止它,这将关闭应用。

现在通过 HTTP 测试模型。访问以下默认 URL

http://127.0.0.1:8000/

发送包含英文文本的 JSON 数据的 POST 请求。此客户端脚本请求翻译“Hello world!”

# File name: model_client.py
import requests

response = requests.post("http://127.0.0.1:8000/", params={"text": "Hello world!"})
french_text = response.json()

print(french_text)

当 Ray Serve 应用部署后,使用 serve status CLI 命令检查应用和部署的状态。有关 serve status 输出格式的更多详细信息,请参阅检查生产环境中的 Serve

$ serve status
proxies:
  a85af35da5fcea04e13375bdc7d2c83c7d3915e290f1b25643c55f3a: HEALTHY
applications:
  default:
    status: RUNNING
    message: ''
    last_deployed_time_s: 1693428451.894696
    deployments:
      Translator:
        status: HEALTHY
        replica_states:
          RUNNING: 2
        message: ''

构建用于生产部署的 Serve 配置文件#

要在生产环境中部署 Serve 应用,您需要生成 Serve 配置 YAML 文件。Serve 配置文件是集群的唯一真实来源,允许您在一个位置指定系统级配置和应用。它还允许您以声明方式更新应用。serve build CLI 命令将导入路径作为输入,并使用 -o 标志保存到输出文件。您可以在 Serve 配置文件中指定所有部署参数。

$ serve build model:translator_app -o config.yaml

serve build 命令会添加一个默认的应用名称,可以修改。生成的 Serve 配置文件如下所示

proxy_location: EveryNode

http_options:
  host: 0.0.0.0
  port: 8000

grpc_options:
  port: 9000
  grpc_servicer_functions: []

applications:

- name: app1
  route_prefix: /
  import_path: model:translator_app
  runtime_env: {}
  deployments:
  - name: Translator
    num_replicas: 2
    ray_actor_options:
      num_cpus: 0.2
      num_gpus: 0.0

您还可以将 Serve 配置文件与 serve run 一起用于本地测试。例如

$ serve run config.yaml
$ serve status
proxies:
  1894261b372d34854163ac5ec88405328302eb4e46ac3a2bdcaf8d18: HEALTHY
applications:
  app1:
    status: RUNNING
    message: ''
    last_deployed_time_s: 1693430474.873806
    deployments:
      Translator:
        status: HEALTHY
        replica_states:
          RUNNING: 2
        message: ''

更多详细信息,请参阅Serve 配置文件

在生产环境中部署 Ray Serve#

使用 KubeRay operator 在 Kubernetes 生产环境中部署 Ray Serve 应用。将上一步生成的 YAML 文件直接复制到 Kubernetes 配置中。KubeRay 支持零停机升级、状态报告和生产应用容错。有关更多信息,请参阅在 Kubernetes 上部署。对于生产用途,建议实施设置头节点容错的推荐实践。

监控 Ray Serve#

使用 Ray Dashboard 获取 Ray 集群和 Ray Serve 应用状态的高级概览。Ray Dashboard 在本地测试期间和生产环境中的远程集群上都可用。Ray Serve 提供了一些内置指标和日志记录,以及在应用中添加自定义指标和日志的实用工具。对于生产部署,建议将日志和指标导出到您的可观测性平台。有关更多详细信息,请参阅监控