从 TorchServe 迁移至 Amazon EKS 上的 Ray Serve 深度学习容器
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
机器学习推理基础设施正在经历快速的架构演进。多年来,PyTorch 开发者一直依赖 TorchServe 作为生产环境中部署 PyTorch 模型的标准 serving 引擎。然而,随着 TorchServe 逐渐停止维护,基础设施与 MLOps 团队不得不全面接管底层 GPU 推理栈的维护工作。手动配置 CUDA 驱动、Python 环境依赖以及分布式服务层带来了巨大的运维负担与系统稳定性隐患。
为了解决这一挑战,AWS 推出了经过预先测试与官方支持的 Ray Serve 深度学习容器(AWS Ray Serve Deep Learning Containers, DLC)。将 Ray Serve 的高性能 Python 原生服务框架与 Amazon Elastic Kubernetes Service (Amazon EKS) 上的 AWS DLC 结合,能够为大语言模型(LLM)和视觉语言模型(VLM)提供云原生、企业级的推理架构。
无论是构建自研 GPU 集群,还是使用像 n1n.ai 这样的统一 API 网关来构建多服务商故障转移架构,将自建推理工作负载从 TorchServe 迁移至 Ray Serve DLC 都是升级 AI 基础设施的关键一步。
TorchServe 与 Ray Serve:架构演进对比
TorchServe 在很大程度上依赖 Java 编写的后台管理进程与 Python 工作节点进行通信。这种架构在处理传统计算机视觉和小型 NLP 任务时表现良好,但在面对生成式 AI 所需的复杂动态批处理(Dynamic Batching)、流水线并行以及多模型组合时则显得力开交。
相比之下,基于分布式计算框架 Ray 构建的 Ray Serve 完全剥离了 Java 中间层。它提供了原生 Python 执行环境、动态请求路由、基于 Actor 的状态管理,以及细粒度的资源分配机制(例如 GPU 分片共享)。
| 特性维度 | TorchServe | Amazon EKS 上的 Ray Serve DLC |
|---|---|---|
| 运行时基础 | Java 前端 + Python Worker | 原生 Python 与 Ray 微 Actor |
| 分布式扩展 | 节点级 Worker 手动管理 | 基于 KubeRay 实现集群级弹性伸缩 |
| 模型编排 | 复杂的自定义代码链 | 原生 Python 有向无环图 (DAG) |
| 容器管理 | 手动配置 CUDA 和环境依赖 | AWS 官方预先测试与维护的深度学习容器 |
| 多模态支持 | VLM 动态批处理支持有限 | 支持高吞吐量流式输出与动态批处理 |
| 资源利用率 | 粗粒度单 GPU 物理绑定 | 支持单 Worker 细粒度分片 (num_gpus=0.25) |
为什么选择 AWS Ray Serve 深度学习容器?
组装一个生产可用的 GPU 容器镜像极其繁琐,需要严格匹配 Ubuntu 系统版本、Nvidia CUDA 驱动、cuDNN 库、PyTorch 编译版本、Ray 运行时以及各类推理加速库(如 vLLM 或 Hugging Face Transformers)。任何微小版本的不匹配都可能引发内存泄漏或 CUDA 初始化崩溃。
AWS Ray Serve DLC 通过提供预先验证与优化的镜像解决了这一难题。这些容器预装了:
- 经过验证的 CUDA 与 NCCL 驱动组合;
- 针对 AWS Graviton 以及 x86 GPU 实例(如 g5、p4de、p5)编译优化的 PyTorch 二进制文件;
- 深度集成了 AWS 安全规范、IAM 权限与 CloudWatch 监控的 Ray Serve 运行时;
- 内置优化的 Triton 与 vLLM 推理引擎。
通过 KubeRay Operator 将这些容器部署到 Amazon EKS 上,可以将复杂的 GPU 编排工作转化为标准的 Kubernetes 声明式配置。
架构全景:部署视觉语言模型 (VLM)
下图展示了客户端请求如何流经基于 EKS 和 AWS Ray Serve DLC 构建的集群,以及如何配合 n1n.ai 这类统一 API 网关协同工作:
+---------------------------------------+
| 客户端应用 / SDK |
+-------------------++------------------+
|
+------------------+------------------+
| |
[ 自建私有端点 ] [ 统一 API 网关 ]
| |
v v
+------------------------+ +--------------------+
| AWS ALB / 负载均衡器 | | n1n.ai |
+-----------+------------+ | 统一 LLM 路由层 |
| +--------------------+
v |
+----------------------------------+ |
| Amazon EKS 集群 (KubeRay) | |
| +------------------------------+ | v
| | Ray Serve 头节点 (Head Node) | | +----------------+
| +--------------+---------------+ | | 第三方托管 |
| | 动态路由分配 | | LLM API 服务商 |
| v | +----------------+
| +------------------------------+ |
| | Ray 工作节点 (NVIDIA GPU) | |
| | - Ray Serve DLC 容器 | |
| | - VLM 模型实例 (Qwen-VL) | |
| +------------------------------+ |
+----------------------------------+
实战部署指南
本指南演示如何使用 KubeRay Operator 和 Ray Serve DLC 在 Amazon EKS 上部署视觉语言模型(例如 Qwen/Qwen2-VL-7B-Instruct)。
步骤 1:安装 KubeRay Operator
首先添加 KubeRay Helm 仓库并将其安装至 EKS 集群中:
helm repo add kuberay https://ray-project.github.io/kuberay-helm/
helm repo update
kubectl create namespace kuberay-system
helm install kuberay-operator kuberay/kuberay-operator --version 1.1.0 -n kuberay-system
步骤 2:创建 RayService 声明式 Manifest
创建名为 vlm_rayservice.yaml 的文件。注意此处使用的 AWS Ray Serve 深度学习容器镜像地址:
apiVersion: ray.io/v1
kind: RayService
metadata:
name: vlm-qwen-service
namespace: default
spec:
serviceUnhealthyThreshold: 300
rayClusterConfig:
rayVersion: '2.35.0'
headGroupSpec:
rayStartParams:
dashboard-host: '0.0.0.0'
template:
spec:
containers:
- name: ray-head
image: 763104351884.dkr.ecr.us-west-2.amazonaws.com/ray-pytorch-inference:2.35.0-gpu-py310-cu121-ubuntu22.04
resources:
limits:
cpu: "4"
memory: "16Gi"
requests:
cpu: "2"
memory: "8Gi"
ports:
- containerPort: 6379
name: gcs
- containerPort: 8265
name: dashboard
- containerPort: 8000
name: serve
workerGroupSpecs:
- groupName: gpu-workers
replicas: 2
minReplicas: 1
maxReplicas: 4
rayStartParams: {}
template:
spec:
containers:
- name: ray-worker
image: 763104351884.dkr.ecr.us-west-2.amazonaws.com/ray-pytorch-inference:2.35.0-gpu-py310-cu121-ubuntu22.04
securityContext:
capabilities:
add: ["SYS_PTRACE"]
resources:
limits:
cpu: "8"
memory: "32Gi"
nvidia.com/gpu: "1"
requests:
cpu: "4"
memory: "16Gi"
nvidia.com/gpu: "1"
步骤 3:编写 Ray Serve 服务应用代码
编写 Python 部署脚本(vlm_serve.py),利用 PyTorch 与 Hugging Face transformers 库进行多模态处理:
import torch
from PIL import Image
import io
import base64
from ray import serve
from transformers import AutoProcessor, Qwen2VLForConditionalGeneration
@serve.deployment(
num_replicas=2,
ray_actor_options=\{"num_gpus": 1, "num_cpus": 4\},
max_ongoing_requests=20
)
class VLMDeployment:
def __init__(self):
model_id = "Qwen/Qwen2-VL-7B-Instruct"
# 使用 bfloat16 精度加载模型以提升 GPU 推理性能
self.model = Qwen2VLForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto"
)
self.processor = AutoProcessor.from_pretrained(model_id)
print("VLM 模型初始化完成。")
async def __call__(self, request) -> dict:
json_data = await request.json()
prompt = json_data.get("prompt