ray-serve

Ray Serve 在线推理部署:副本、GPU、自动扩缩与滚动更新。

补充说明

Ray Serve 把普通 Python 类或 FastAPI 应用包装成可扩缩的 deployment,由 Ray 集群调度到多节点多 GPU。适合组合预处理、模型推理和后处理的多阶段服务。

基础集群操作见 ray;本页聚焦 Serve 的部署配置和生产行为。

安装与启动

pip install -U "ray[serve]"
ray start --head --num-gpus 8 --dashboard-host 0.0.0.0

客户端 Ray 版本必须与集群一致,混合版本会在连接或序列化阶段失败。

常用示例

定义带 GPU 副本和自动扩缩的服务:

cat > app.py <<'PY'
from fastapi import FastAPI
from ray import serve

app = FastAPI()

@serve.deployment(
    ray_actor_options={"num_gpus": 1},
    max_ongoing_requests=8,
    autoscaling_config={"min_replicas": 1, "max_replicas": 4,
                        "target_ongoing_requests": 4, "upscale_delay_s": 30},
)
@serve.ingress(app)
class Generator:
    def __init__(self) -> None:
        from transformers import pipeline
        self.pipe = pipeline("text-generation", model="Qwen/Qwen2.5-7B-Instruct",
                             device_map="cuda", torch_dtype="auto")

    @app.post("/generate")
    def generate(self, payload: dict) -> dict:
        out = self.pipe(payload["prompt"], max_new_tokens=payload.get("max_new_tokens", 128),
                        do_sample=False)
        return {"text": out[0]["generated_text"]}

generator = Generator.bind()
PY

生产部署时固定工作目录和依赖,并在部署后验证:

cat > serve.yaml <<'YAML'
applications:
  - name: llm
    import_path: app:generator
    runtime_env:
      working_dir: .
      pip: "-r requirements.txt"
YAML

serve deploy serve.yaml
curl -s localhost:8000/-/health
curl -X POST localhost:8000/generate -H 'Content-Type: application/json' \
  -d '{"prompt": "解释 CrashLoopBackOff", "max_new_tokens": 64}'

serve run 适合本地开发,退出终端服务就停;serve deploy 提交到持久化集群并支持滚动更新。

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 为什么副本没有分到 GPU?
  2. serve run 和 serve deploy 的区别是什么?
  3. 自动扩缩为什么要看 target_ongoing_requests 而不是 QPS?
答案
  1. deployment 没有声明 ray_actor_options={"num_gpus": 1},Ray 就不会为该 actor 预留 GPU。声明后还要确认集群 ray start --num-gpus 的 GPU 总量足够。
  2. serve run 是开发模式,前台运行并在退出时停止服务;serve deploy 把 YAML 提交给已运行的 Ray 集群,适合生产并支持滚动更新。
  3. Ray Serve 按每个副本当前的进行中请求数扩缩,该指标直接反映排队和显存压力。QPS 相同但请求耗时不同,所需副本数完全不同。

相关条目