部署大型 LLM#

   

本教程将介绍如何使用 Ray Serve LLM 在生产环境中部署和提供大型语言模型。大型 LLM 通常运行在具有多个 GPU 的多个节点上,优先考虑最高质量和功能:更强的推理能力、更广阔的知识、更长的上下文窗口、更稳健的泛化能力。本教程将部署 DeepSeek-R1,这是一个拥有 685 B 参数的大型 LLM。当您可以接受更高的延迟、复杂性和成本作为权衡,因为您需要最先进的结果时。

对于较小的模型,请参阅部署小型 LLM部署中型 LLM


大规模部署的挑战#

部署像 DeepSeek-R1 这样拥有 685 B 参数的模型会带来重大的技术挑战。在这个规模下,模型无法容纳在单个 GPU 甚至单个节点上。您必须使用张量并行(分割每个层内的张量)和流水线并行(跨设备分散层)将其分布在多个 GPU 和节点上。

通常,部署此规模的模型需要您手动启动和协调多个节点,除非您使用像 Anyscale 这样的托管平台,该平台可自动进行集群扩展和节点编排。有关更多详细信息,请参阅使用 Anyscale Services 部署到生产环境


配置 Ray Serve LLM#

大型 LLM 通常部署在具有多个 GPU 的多个节点上。为了充分利用硬件,请将 pipeline_parallel_size 设置为节点数量,将 tensor_parallel_size 设置为每个节点的 GPU 数量,这将平均分配模型的权重。

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

可选:由于 Deepseek-R1 是一个推理模型,本教程使用了 vLLM 内置的推理解析器,以正确地将其推理内容与最终响应分开。请参阅部署推理 LLM:解析推理输出

# serve_deepseek_r1.py
from ray.serve.llm import LLMConfig, build_openai_app

llm_config = LLMConfig(
    model_loading_config=dict(
        model_id="my-deepseek-r1",
        model_source="deepseek-ai/DeepSeek-R1",
    ),
    accelerator_type="H100",
    deployment_config=dict(
        autoscaling_config=dict(
            min_replicas=1,
            max_replicas=1,
        )
    ),
    ### Uncomment if your model is gated and needs your Hugging Face token to access it.
    # runtime_env=dict(env_vars={"HF_TOKEN": os.environ.get("HF_TOKEN")}),
    engine_kwargs=dict(
        max_model_len=16384,
        # Split weights among 8 GPUs in the node
        tensor_parallel_size=8,
        pipeline_parallel_size=2,
        reasoning_parser="deepseek_r1",  # Optional: separate reasoning content from the final answer
    ),
)

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

注意:在迁移到生产环境之前,请迁移到 Serve 配置文件,以便您的部署版本控制、可重现,并且更容易维护 CI/CD 管道。请参阅服务 LLM - 快速入门示例:生产指南以获取示例。


本地部署#

先决条件

  • GPU 计算访问权限。

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

注意:根据情况,您通常可以在模型的 Hugging Face 页面上请求访问权限。例如,Meta 的 Llama 模型批准可能需要几小时到几周的时间。

依赖项

pip install "ray[serve,llm]"

注意:这是一个昂贵的部署。


启动#

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

在终端中,运行

serve run serve_deepseek_r1: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-deepseek-r1", "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-deepseek-r1",
    messages=[{"role": "user", "content": "Tell me a joke"}],
    stream=True,
)

# Stream and print JSON
for chunk in response:
    # Stream reasoning content first
    if hasattr(chunk.choices[0].delta, "reasoning_content"):
        data_reasoning = chunk.choices[0].delta.reasoning_content
        if data_reasoning:
            print(data_reasoning, end="", flush=True)
    # Later, stream the final answer
    if hasattr(chunk.choices[0].delta, "content"):
        data_content = chunk.choices[0].delta.content
        if data_content:
            print(data_content, end="", flush=True)

关停#

关停您的 LLM 服务

serve shutdown -y

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

对于生产部署,请使用 Anyscale 服务将 Ray Serve 应用部署到专用集群,而无需修改代码。Anyscale 提供可扩展性、容错能力和负载均衡,使服务能够抵御节点故障、高流量和滚动更新,同时还为 DeepSeek-R1 等大型模型自动化多节点设置和自动扩展。

注意:这是一个昂贵的部署。在撰写本文时,在 us-west-2 AWS 区域使用按需实例的部署成本约为每小时 110 美元。由于此节点具有大量的节点间流量,并且跨区域流量价格昂贵(约 0.02 美元/GB),因此建议禁用跨区域自动扩展。为了方便您使用,此演示已预先配置为禁用跨区域自动扩展。

先决条件#

以下模板仅在您的自托管 Anyscale 云中的 H100 GPU 上运行,因为 Anyscale 公有云中不提供 H100。本示例在 AWS 云上使用了两个 8xH100-80 GB:208CPU-1830 GB 类型的节点。

要配置具有 1000 GB 磁盘容量的节点,请参阅 Google Cloud Platform (GCP) 的更改 GCP 集群的默认磁盘大小或 Amazon Web Services (AWS) 的更改 AWS 集群的默认磁盘大小


启动服务#

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

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

#service.yaml
name: deploy-deepseek-r1
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 
  # Change default disk size to 1000GB
  advanced_instance_config:
    ## AWS ##
    BlockDeviceMappings:
      - Ebs:
        - VolumeSize: 1000
          VolumeType: gp3
          DeleteOnTermination: true
        DeviceName: "/dev/sda1"
    #########
    ## GCP ##
    #instanceProperties:
    #  disks:
    #    - boot: true
    #      auto_delete: true
    #      initialize_params:
    #        - disk_size_gb: 1000
    #########
  
working_dir: .
cloud:
applications:
# Point to your app in your Python module
- import_path: serve_deepseek_r1:app

部署您的服务

anyscale service deploy -f service.yaml

注意:如果您的模型受限,请确保使用 --env HF_TOKEN=<YOUR_HUGGINGFACE_TOKEN> 将 Hugging Face 令牌传递给服务。

自定义 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 控制台中的服务页面检索两项。单击顶部的**查询**按钮。请参阅发送请求以获取示例请求,但请确保使用正确的端点和身份验证令牌。


访问 Serve LLM Dashboard#

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

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

  2. 导航到**指标**选项卡

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


关停#

关闭您的 Anyscale 服务

anyscale service terminate -n deploy-deepseek-r1

监控您的部署#

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 07-30 11:56:04 [kv_cache_utils.py:637] Maximum concurrency for 32,768 tokens per request: 29.06x

根据您的模型和硬件,以下是提高并发性的几种方法:

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

示例:在 2 个节点上运行 DeepSeek-R1,每个节点有 8 个 H100-80 GB GPU

  • max_model_len = 32,768 → 并发 ≈ 29

  • max_model_len = 16,384 → 并发 ≈ 58

使用精馏或量化模型
对模型进行量化或精馏可以减小其内存占用,为更多 KV 缓存腾出空间,并支持更多并发请求。例如,请参阅deepseek-ai/DeepSeek-R1-Distill-Llama-70B,了解 DeepSeek-R1 的精馏版本。

升级到具有更多内存的 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