部署小型 LLM#

   

本教程将向您展示如何使用 Ray Serve LLM 在生产环境中部署和提供小型语言模型。小型 LLM 运行在具有 1-2 个 GPU 的单个节点上,因此速度快、成本低且易于使用。本教程部署的是 Llama-3.1-8B,一个拥有 8B 参数的小型 LLM。它非常适合原型设计、轻量级应用、延迟敏感型用例、成本敏感型部署以及资源有限但效率比峰值精度更重要的环境。

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


配置 Ray Serve LLM#

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

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

# serve_llama_3_1_8b.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-8b",
        # Or unsloth/Meta-Llama-3.1-8B-Instruct for an ungated model
        model_source="meta-llama/Llama-3.1-8B-Instruct",
    ),
    accelerator_type="L4",
    deployment_config=dict(
        autoscaling_config=dict(
            min_replicas=1,
            max_replicas=2,
        )
    ),
    ### If your model isn't 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=8192),
)
app = build_openai_app({"llm_configs": [llm_config]})

注意:在迁移到生产环境之前,请迁移到使用 Serve 配置文件,以便您的部署版本可控、可复现,并易于为 CI/CD 管道维护。有关示例,请参阅 部署 LLM - 快速入门示例:生产指南


本地部署#

先决条件

  • GPU 计算访问权限。

  • (可选)如果您使用 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_8b.py 中定义您的应用程序。

在终端中,运行

export HF_TOKEN=<YOUR-HUGGINGFACE-TOKEN>
serve run serve_llama_3_1_8b: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-8b", "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-8b",
    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 Services 部署到生产环境#

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


启动服务#

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

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

# service.yaml
name: deploy-llama-3-8b
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_8b: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 Console 中的服务页面检索两项。点击顶部的 **Query** 按钮。请参阅 发送请求 中的示例请求,但请确保使用正确的端点和身份验证 token。


访问 Serve LLM Dashboard#

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

  1. 在 Anyscale 控制台中,转到您的 **Service** 或 **Workspace**。

  2. 导航到 **Metrics** 选项卡。

  3. 展开 **View in Grafana**,然后点击 **Serve LLM Dashboard**。


关停#

关停您的 Anyscale 服务

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

监控您的部署#

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 作为其后端引擎,它会根据您的配置记录其支持的*最大并发量*。

示例日志

INFO 08-06 20:15:53 [executor_base.py:118] Maximum concurrency for 8192 tokens per request: 3.53x

您可以通过多种方式提高并发性,具体取决于您的模型和硬件:

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

示例:在 A10G 或 L4 GPU 上运行 *llama-3.1-8B*

  • max_model_len = 8192 → 并发 ≈ 3.5

  • max_model_len = 4096 → 并发 ≈ 7

使用量化模型
量化您的模型(例如,量化到 FP8)会减少模型的内存占用,从而释放内存用于更多的 KV 缓存,并实现更多并发请求。

使用张量并行
使用 tensor_parallel_size > 1 将模型分布在多个 GPU 上。

注意:如果 GPU 没有强大的 GPU 互连(如 NVLink),延迟可能会增加。

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

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

deployment_config:
  autoscaling_config:
    min_replicas: 1
    max_replicas: 4

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


故障排除#

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


总结#

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

如需了解更多信息,请参加 LLM 服务基础 课程,或探索 LLM 批量推理 以处理离线工作负载。有关大型模型,请参阅 部署中型 LLM部署大型 LLM