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

- 姓名
- 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环境满足以下要求:
- 运行Kubernetes 1.28或更高版本的活跃Amazon EKS集群。
- 配备高性能GPU(例如带有高速弹性Fabric适配器网络EFA的
p4de.24xlarge或p5.48xlarge实例)的节点组。 - 配置了相应集群管理员权限的AWS CLI、
kubectl和 Helm。 - 用于从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