部署中等规模的 LLM#

   

本教程展示了如何使用 Ray Serve LLM 在生产环境中部署和提供中等规模的语言模型。中等规模的 LLM 通常运行在具有 4-8 个 GPU 的单个节点上。它在性能和效率之间取得了平衡。本教程部署的是 Llama-3.1-70B,一个拥有 70B 参数的中等规模 LLM。这些模型比小型模型具有更强的准确性和推理能力,同时比超大型模型更经济实惠且资源友好。这使得它们成为需要低成本高质量的生产工作负载的可靠选择。

有关小型模型,请参阅 部署小型 LLM。有关大型模型,请参阅 部署大型 LLM


配置 Ray Serve LLM#

您可以在具有多个 GPU 的单个节点上部署中等规模的 LLM。要利用所有可用的 GPU,请将 tensor_parallel_size 设置为节点上的 GPU 数量,这将把模型的权重均匀地分布在它们之间。

Ray Serve LLM 提供了多种 Python API 来定义您的应用程序。使用 build_openai_app 从您的 LLMConfig 对象构建完整的应用程序。

在配置文件中设置您的 Hugging Face token,以访问 Llama-3.1 等受限模型。

# serve_llama_3_1_70b.py
from ray.serve.llm import LLMConfig, build_openai_app
import os

llm_config = LLMConfig(
    model_loading_config=dict(
        model_id="my-llama-3.1-70b",
        # Or unsloth/Meta-Llama-3.1-70B-Instruct for an ungated model
        model_source="meta-llama/Llama-3.1-70B-Instruct",
    ),
    accelerator_type="L40S", # Or "A100-40G"
    deployment_config=dict(
        autoscaling_config=dict(
            min_replicas=1,
            max_replicas=4,
        )
    ),
    ### If your model is not gated, you can skip `HF_TOKEN`
    # Share your Hugging Face token with the vllm engine so it can access the gated Llama 3.
    # Type `export HF_TOKEN=<YOUR-HUGGINGFACE-TOKEN>` in a terminal
    runtime_env=dict(env_vars={"HF_TOKEN": os.environ.get("HF_TOKEN")}),
    engine_kwargs=dict(
        max_model_len=32768,
        # Split weights among 8 GPUs in the node
        tensor_parallel_size=8,
    ),
)

app = build_openai_app({"llm_configs": [llm_config]})

注意:在迁移到生产环境之前,请迁移到使用 Serve 配置文件,以使您的部署版本控制、可重现,并更易于 CI/CD 管道维护。有关示例,请参阅 Serving LLMs - Quickstart Examples: Production Guide


本地部署#

先决条件

  • GPU 计算访问权限。

  • (可选) 如果使用 Meta 的 Llama 等受限模型,则需要 Hugging Face token。将其存储在 export HF_TOKEN=<YOUR-HUGGINGFACE-TOKEN> 中。

**注意:**根据组织政策,您通常可以在模型的 Hugging Face 页面上申请访问权限。例如,Meta 的 Llama 模型审批可能需要几个小时到几周不等。

依赖项

pip install "ray[serve,llm]"

启动#

请按照 配置 Ray Serve LLM 中的说明,在 Python 模块 serve_llama_3_1_70b.py 中定义您的应用。

在终端中,运行

export HF_TOKEN=<YOUR-HUGGINGFACE-TOKEN>
serve run serve_llama_3_1_70b:app --non-blocking

部署通常需要几分钟时间,因为集群会被配置、vLLM 服务器会启动,并且模型会被下载。


发送请求#

您的端点在本地的 https://:8000 上可用,您可以使用占位符认证 token 来访问 OpenAI 客户端,例如 "FAKE_KEY"

示例 curl

curl -X POST http://localhost:8000/v1/chat/completions \
  -H "Authorization: Bearer FAKE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "model": "my-llama-3.1-70b", "messages": [{"role": "user", "content": "What is 2 + 2?"}] }'

示例 Python

#client.py
from urllib.parse import urljoin
from openai import OpenAI

API_KEY = "FAKE_KEY"
BASE_URL = "https://:8000"

client = OpenAI(base_url=urljoin(BASE_URL, "v1"), api_key=API_KEY)

response = client.chat.completions.create(
    model="my-llama-3.1-70b",
    messages=[{"role": "user", "content": "Tell me a joke"}],
    stream=True
)

for chunk in response:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

关停#

关停您的 LLM 服务

serve shutdown -y

使用 Anyscale 服务部署到生产环境#

对于生产部署,请使用 Anyscale Service 将 Ray Serve 应用程序部署到专用集群,而无需修改代码。Anyscale 可确保可伸缩性、容错性和负载均衡,使服务能够抵抗节点故障、高流量和滚动更新。


启动服务#

Anyscale 提供开箱即用的镜像(anyscale/ray-llm),其中预加载了 Ray Serve LLM、vLLM 以及所有必需的 GPU/运行时依赖项。这使得无需构建自定义镜像即可轻松上手。

在新的 service.yaml 文件中创建您的 Anyscale 服务配置。

# service.yaml
name: deploy-llama-3-70b
image_uri: anyscale/ray-llm:2.49.0-py311-cu128 # Anyscale Ray Serve LLM image. Use `containerfile: ./Dockerfile` to use a custom Dockerfile.
compute_config:
  auto_select_worker_config: true 
working_dir: .
cloud:
applications:
  # Point to your app in your Python module
  - import_path: serve_llama_3_1_70b:app

部署您的服务。请确保将 Hugging Face token 转发到命令中。

anyscale service deploy -f service.yaml --env HF_TOKEN=<YOUR-HUGGINGFACE-TOKEN>

自定义 Dockerfile
您可以通过构建自己的 Dockerfile 来自定义容器。在您的 Anyscale 服务配置中,使用 containerfile(而不是 image_uri)引用 Dockerfile。

# service.yaml
# Replace:
# image_uri: anyscale/ray-llm:2.49.0-py311-cu128

# with:
containerfile: ./Dockerfile

有关每个镜像包含的内容的详细信息,请参阅 Anyscale 基础镜像


发送请求#

anyscale service deploy 命令输出显示了端点和身份验证 token。

(anyscale +3.9s) curl -H "Authorization: Bearer <YOUR-TOKEN>" <YOUR-ENDPOINT>

您也可以从 Anyscale 控制台的服务页面检索两者。点击顶部的查询按钮。有关示例请求,请参阅 发送请求,但请确保使用正确的端点和认证 token。


访问 Serve LLM Dashboard#

有关启用 LLM 特定日志记录的说明,请参阅 监控您的部署。要从 Anyscale 服务打开 Ray Serve LLM 仪表板,

  1. 在 Anyscale 控制台中,转到您的服务工作区

  2. 导航到指标选项卡。

  3. 点击在 Grafana 中查看,然后点击Serve LLM Dashboard


关停#

关闭您的 Anyscale 服务。

anyscale service terminate -n deploy-llama-3-70b

监控您的部署#

Ray Serve LLM 通过 Serve LLM Dashboard 提供全面的监控。此仪表板可视化了关键指标,包括:

  • 首次 token 时间 (TTFT):生成第一个 token 之前的延迟。

  • 每个输出 token 的时间 (TPOT):每个生成 token 的平均延迟。

  • Token 吞吐量:每秒生成的总 token 数。

  • GPU 缓存利用率:使用的 KV 缓存内存百分比。

  • 请求延迟:端到端请求持续时间。

要启用引擎级指标,请在您的 LLM 配置中设置 log_engine_metrics: true。从 Ray 2.51.0 开始,此选项默认启用。

以下示例显示了如何启用监控

llm_config = LLMConfig(
    # ... other config ...
    log_engine_metrics=True,  # Enable detailed metrics
)

访问仪表板#

要查看 Anyscale 服务或工作空间中的指标:

  1. 导航到您的 **Service** 或 **Workspace** 页面。

  2. 打开 **Metrics** 选项卡。

  3. 展开 **View in Grafana**,然后选择 **Serve LLM Dashboard**。

有关每个指标的详细解释以及如何为您的工作负载解释这些指标,请参阅 理解 LLM 延迟和吞吐量指标

有关全面的监控策略和最佳实践,请参阅 可观察性和监控指南


提高并发性#

Ray Serve LLM 使用 vLLM 作为其后端引擎,该引擎会记录它根据您的配置所能支持的最大并发数

8xL40S 的示例日志

INFO 08-19 20:57:37 [kv_cache_utils.py:837] Maximum concurrency for 32,768 tokens per request: 17.79x

以下是提高并发性的几种方法,具体取决于您的模型和硬件。

减小 max_model_len
降低 max_model_len 会减少 KV 缓存所需的内存。

示例:在 8xL40S 上运行 Llama-3.1-70B

  • max_model_len = 32,768 → 并发 ≈ 18

  • max_model_len = 16,384 → 并发 ≈ 36

使用量化模型
量化您的模型(例如,到 FP8)可以减小模型的内存占用,为更多 KV 缓存腾出内存,并支持更多并发请求。

使用流水线并行
如果单个节点不足以处理您的工作负载,请考虑使用 pipeline_parallel_size > 1 将模型的层分布到多个节点上。

升级到具有更多内存的 GPU
一些 GPU 可提供显著更多的 KV 缓存空间,并开箱即用支持更高的并发量。

通过更多副本进行扩展
除了调整每个副本的并发量外,您还可以通过增加配置中的副本数量来*水平*扩展。
增加副本数量会增加您的服务在持续或突发流量下能够处理的总并发请求数。

deployment_config:
  autoscaling_config:
    min_replicas: 1
    max_replicas: 4

有关调整策略、硬件指导和提供配置的更多详细信息,请参阅 选择用于 LLM 服务的 GPU在 Anyscale 服务上调整 LLM 的参数


故障排除#

如果您在部署 LLM 时遇到问题,例如内存不足错误、身份验证问题或性能缓慢,请查阅 故障排除指南,以解决常见问题。


总结#

在本教程中,您已经从开发到生产,使用 Ray Serve LLM 部署了一个中等规模的 LLM。您学会了如何配置和部署服务、发送请求、监控性能指标以及优化并发性。

要了解更多信息,请参加 LLM Serving Foundations 课程,或探索 LLM 批量推理 以处理离线工作负载。有关小型模型,请参阅 部署小型 LLM,或有关大型模型,请参阅 部署大型 LLM