性能调优#
本节应帮助您
了解 Ray Serve 的性能特征
找到调试和调优您的 Serve 应用性能的方法
注意
本节提供了一些提高 Ray Serve 应用性能的技巧。请查看架构页面以获取有用的背景信息,包括 HTTP 代理 Actor 和部署副本 Actor 的概览。
目录
性能和基准测试#
Ray Serve 构建在 Ray 之上,因此其可扩展性受限于 Ray 的可扩展性。请参阅 Ray 的可扩展性范围,以了解有关最大节点数及其他限制的更多信息。
调试性能问题#
您最可能遇到的性能问题是请求的高延迟或低吞吐量。
在您使用 Ray 和 Ray Serve 设置监控后,这些问题可能表现为
当负载增加时,
serve_num_router_requests_total
保持不变随着查询在后台排队,
serve_deployment_processing_latency_ms
急剧上升
以下是解决这些问题的方法
确保您使用了正确的硬件和资源
您是否使用
ray_actor_options
为您的部署副本预留了 GPU (例如,ray_actor_options={“num_gpus”: 1}
)?您是否使用
ray_actor_options
为您的部署副本预留了一个或多个核心 (例如,ray_actor_options={“num_cpus”: 2}
)?您是否设置了OMP_NUM_THREADS 来提高深度学习框架的性能?
尝试对请求进行批处理。请参阅动态请求批处理。
考虑在您的 callable 中使用
async
方法。请参阅下面的部分。为您的 HTTP 请求设置端到端超时。请参阅下面的部分。
使用 async
方法#
注意
根据FastAPI 文档,def
终点函数会在一个单独的线程池中调用,因此您可能会观察到单个副本中同时运行许多请求,这种情况可能导致 OOM 或资源匮乏。在这种情况下,您可以尝试使用 async def
来控制工作负载性能。
您在 callable 中使用了 async def
吗?如果您正在使用 asyncio
并遇到上面提到的相同排队问题,您可能需要增加 max_ongoing_requests
。Serve 默认将其设置为一个较低的值 (100),以便客户端获得适当的背压。您可以在部署装饰器中增加该值;例如,@serve.deployment(max_ongoing_requests=1000)
。
设置端到端请求超时#
默认情况下,无论需要多长时间,Serve 都会让客户端 HTTP 请求运行到完成。但是,慢速请求可能会成为副本处理的瓶颈,阻塞其他等待的请求。设置一个端到端超时,以便可以终止并重试慢速请求。
您可以通过在 Serve 配置的 http_options
字段中设置 request_timeout_s
参数来设置 HTTP 请求的端到端超时。HTTP 代理会等待指定的秒数,然后终止 HTTP 请求。此配置对您的 Ray 集群是全局的,您无法在运行时更新它。使用客户端重试来重试由于瞬时故障而超时的请求。
注意
当请求超时时,Serve 会返回状态码为 408
的响应。客户端在收到此 408
响应时可以重试。
给 Serve Controller 更多时间处理请求#
Serve Controller 运行在 Ray head 节点上,负责各种任务,包括接收来自其他 Ray Serve 组件的自动扩缩容指标。如果 Serve Controller 过载(症状可能包括高 CPU 使用率和大量待处理的 ServeController.record_handle_metrics
任务),您可以通过设置 RAY_SERVE_CONTROL_LOOP_INTERVAL_S
环境变量(默认为 0.1
秒)来增加控制循环周期之间的间隔。此设置使 Controller 有更多时间处理请求,并可能有助于缓解过载。