开发和部署 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": "..."}]
。Translator
的translate
方法通过索引字典来提取翻译后的文本。
复制并粘贴脚本,然后在本地运行。它会将 "Hello world!"
翻译成 "Bonjour Monde!"
。
$ python model.py
Bonjour Monde!
使用 FastAPI 将此模型转换为 Ray Serve 应用需要进行三项更改
导入 Ray Serve 和 Fast API 依赖项
为带有 FastAPI 的 Serve 部署添加装饰器:
@serve.deployment
和@serve.ingress(app)
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_replicas
和 ray_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 提供了一些内置指标和日志记录,以及在应用中添加自定义指标和日志的实用工具。对于生产部署,建议将日志和指标导出到您的可观测性平台。有关更多详细信息,请参阅监控。