最新n1n v2.0.1 正式上线!企业级大模型接口聚合平台 (LLM API Gateway),为您接入 500+ AI Models,价格低至 1 折, 立即尝试

使用Ray LLM深度学习容器运行多节点推理工作负载

作者
  • avatar
    姓名
    Nino
    职业
    Senior Tech Editor

将诸如DeepSeek-V3或Claude 3.5 Sonnet等海量参数的大型语言模型部署到多个GPU节点上,会带来显着的工程挑战。传统的单节点推理框架在处理拥有数千亿参数的模型时,往往会触及内存壁垒。为了克服这一限制,企业开发者正转向采用将前向预填充(Prefill)与解码(Decode)阶段进行分离的分布式架构。通过利用Amazon EKS和预构建的Ray LLM深度学习容器,工程团队现在无需从零开始手动编译复杂的软件栈,即可编排高吞吐量、低延迟的多节点推理集群。

分布式大模型推理的架构设计

在扩展推理工作负载时,在单个GPU甚至单个多GPU节点上运行单一模型实例,往往无法满足生产环境的服务等级协议(SLA)。大语言模型在计算特性上,预填充阶段(并行处理输入提示词)与解码阶段(自回归逐个生成词元)之间存在着巨大差异。

预填充操作属于计算密集型,极大地受益于跨多个GPU的大规模并行处理。相反,解码操作则属于内存带宽受限型,需要最优的KV缓存管理和快速的内部互联。通过在不同的节点池——即专用的预填充节点和专用的解码节点——之间解耦这两个阶段,企业可以最大化硬件利用率并获得可预测的延迟指标。

为了无缝连接这种分布式基础设施,您需要一个能够抽象复杂性的统一API网关。这正是现代聚合层和路由策略发挥作用的地方。对于需要跨多个基础模型实现高可用性和即时回退机制的应用,开发者经常将其自定义的集群端点与先进的大模型API聚合器(如 n1n.ai)进行集成,以确保零停机的高效运行。

前置条件与环境准备

在Amazon EKS上部署多节点Ray集群之前,请确保您的AWS环境满足以下要求:

  1. 运行Kubernetes 1.28或更高版本的活跃Amazon EKS集群。
  2. 配备高性能GPU(例如带有高速弹性Fabric适配器网络EFA的 p4de.24xlarge 或 p5.48xlarge 实例)的节点组。
  3. 配置了相应集群管理员权限的AWS CLI、kubectl 和 Helm。
  4. 用于从AWS深度学习容器注册表拉取官方Ray LLM深度学习容器的活跃账户。

分步部署指南

第一步:配置Ray集群主节点

Ray集群主节点负责协调任务调度、资源分配和工作节点注册。利用预构建的Ray LLM深度学习容器创建一个名为 ray-head.yaml 的Kubernetes部署清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ray-head
  namespace: llm-inference
spec:
  replicas: 1
  selector:
    matchLabels:
      ray.io/node-type: head
  template:
    metadata:
      labels:
        ray.io/node-type: head
    spec:
      containers:
      - name: ray-head
        image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-ray-inference:2.4.0-gpu-py310
        resources:
          limits:
            cpu: "16"
            memory: "64Gi"
            nvidia.com/gpu: "0"
          requests:
            cpu: "8"
            memory: "32Gi"
        ports:
        - containerPort: 6379
          name: gcs
        - containerPort: 8265
          name: dashboard
        - containerPort: 8000
          name: serve
        command: ["/bin/bash", "-c", "ray start --head --port=6379 --dashboard-host=0.0.0.0 --block"]

将该清单应用到您的集群中:

kubectl apply -f ray-head.yaml -n llm-inference

第二步:部署支持EFA的工作节点

接下来,部署将在多个GPU之间托管分布式模型权重的工作节点。这些工作节点Pod利用Ray的后端,通过EFA接口上的NCCL进行高效通信。创建 ray-worker.yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: ray-worker
  namespace: llm-inference
spec:
  serviceName: ray-worker
  replicas: 2
  selector:
    matchLabels:
      ray.io/node-type: worker
  template:
    metadata:
      labels:
        ray.io/node-type: worker
    spec:
      containers:
      - name: ray-worker
        image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-ray-inference:2.4.0-gpu-py310
        securityContext:
          capabilities:
            add: ["IPC_LOCK"]
        resources:
          limits:
            cpu: "32"
            memory: "256Gi"
            nvidia.com/gpu: "8"
          requests:
            cpu: "16"
            memory: "128Gi"
            nvidia.com/gpu: "8"
        command: 
          - "/bin/bash"
          - "-c"
          - >-
            ray start --address=ray-head.llm-inference.svc.cluster.local:6379 --block

部署工作节点:

kubectl apply -f ray-worker.yaml -n llm-inference

第三步:配置预填充与解码的分离

为了实现最优的解耦服务,配置您的Ray Serve应用配置文件(serve-config.yaml),将提示词摄取请求路由到预填充节点池,并将词元生成请求路由到解码节点池:

proxy_location: EveryNode
http_options:
  host: 0.0.0.0
  port: 8000
applications:
  - name: disaggregated_llm_service
    route_prefix: /v1
    import_path: ray_llm.serve:Deployment
    runtime_env:
      pip:
        - vllm==0.5.4
    args:
      model_id: "meta-llama/Meta-Llama-3-70B-Instruct"
      tensor_parallel_size: 8
      pipeline_parallel_size: 2
      prefill_node_selector:
        ray.io/node-type: "prefill-worker"
      decode_node_selector:
        ray.io/node-type: "decode-worker"

对接兼容OpenAI的端点

一旦您的Ray Serve部署成功启动并运行,它便会暴露出原生的兼容OpenAI的REST API。您可以使用标准的Python客户端库或curl命令测试多节点推理集群。对于希望将其内部集群性能与商业API进行基准测试,或寻求托管式回退解决方案的开发者来说,通过诸如 n1n.ai 这样的聚合器来路由请求,可以实现在本地EKS端点与云端大模型之间的无缝切换。

以下是如何使用Python查询您新部署的多节点端点:

import openai

client = openai.OpenAI(
    base_url="http://<your-eks-alb-ingress-ip>/v1",
    api_key="dummy-key-for-ray-serve"
)

response = client.chat.completions.create(
    model="meta-llama/Meta-Llama-3-70B-Instruct",
    messages=[
        {"role": "user", "content": "解释LLM推理中解耦预填充与解码的好处。"}
    ],
    temperature=0.7,
    max_tokens=512
)

print(response.choices[0].message.content)

性能基准测试与优化建议

在Amazon EKS上运行多节点集群时,监控网络瓶颈至关重要。以下是确保最大吞吐量的几项专业建议:

  • EFA调优:确保在容器内部正确加载了弹性Fabric适配器驱动程序和AWS OFI NCCL插件,以在张量并行权重同步期间绕过TCP开销。
  • KV缓存优化:调整vLLM内存利用率标志(--gpu-memory-utilization 0.90),以防止在并发请求高峰期间出现内存不足错误。
  • 混合路由:如果您的基础设施经历不可预测的流量高峰,可以考虑实施双重路由策略,在高峰时段将溢出流量卸载至 n1n.ai。

总结

将大语言模型部署到多节点Kubernetes集群上,已不再需要从零开始拼凑零散的开源库。通过将Amazon EKS、Ray LLM深度学习容器以及解耦的预填充-解码架构相结合,工程团队可以实现企业级的可扩展性、低延迟和高资源效率。

Get a free API key at n1n.ai