异构 GPU 混合部署 Whisper,我用 HyperPod 一个集群搞定了

10 阅读4分钟

异构 GPU 混合部署 Whisper,我用 HyperPod 一个集群搞定了

老板要语音转文字服务,g5 和 g6e 混着用,托管 Endpoint 搞不定。最后用 SageMaker HyperPod + TensorRT-LLM + Triton 跑通了全流程,这是我的实战记录。

故事的起点

"语音转文字,三天上线。"

老板说得轻巧,我心里发苦。Whisper 模型我熟,但上生产不是跑个 notebook 那么简单。推理要快、服务要稳、GPU 还得省着用。

更头疼的是,g5 实例不够用了,得混上 g6e。两种 GPU 架构不一样,部署方案得重新想。

最终方案:亚马逊云科技 SageMaker HyperPod Cluster + TensorRT-LLM 编译 + Triton 推理服务

一个 EKS 集群管所有 GPU 节点,NLB 统一对外,还带监控。下面是完整实战过程。

先说为什么放弃了托管 Endpoint

我一开始用的 SageMaker 托管 Endpoint。单机型部署没问题,但两种 GPU 混合部署就卡住了:

  • 一个 Endpoint 只能挂一种机型。 g5 一个、g6e 一个,两个 Endpoint 分开管。
  • 请求路由得自己做。 两个 Endpoint 各有 QPS 上限,扩缩容节奏不同步,客户端怎么分发流量全靠自己。

说白了,运维复杂度直接翻倍。

HyperPod Cluster 换了个思路:直接给你一个托管的 EKS 集群,不同 GPU 建不同节点组,Kubernetes 原生调度。弹性伸缩用 Karpenter,监控用 AMP + Grafana。

前期准备:别跳过这几步

Quota 先提

去 Service Quotas 找 SageMaker 下面的 ml.g5.2xlarge for cluster usageml.g6e.2xlarge for cluster usage,把数量提上去。

别偷懒跳过这步。 我第一次就忘了,后面创建节点组直接报 quota 不足,白等了半小时。

编译模型(这步花时间)

核心操作:用 TensorRT-LLM 把 Whisper 编译成高性能版本,打包成 Triton 格式。

git clone https://github.com/aws-samples/finetune-and-deploy-whisper-models.git
cd finetune-and-deploy-whisper-models/deployment/sagemaker_triton_tensorrt_llm/hyperpod_hybrid

大坑警告: g5 用的 A10G,g6e 用的 L40S,两个架构的 TensorRT-LLM 编译产物不通用。必须分别编译。我第一次只编译了一份,g6e 节点上模型直接加载失败,debug 了两个多小时才搞清楚。

编译完把模型传 S3、镜像推 ECR。

创建 HyperPod 集群

进 SageMaker 控制台 → HyperPod → Clusters → Create,选 Custom Setup。

关键配置:

  • VPC: 新建或已有都行
  • EKS 版本: 选较新的
  • Storage: 本次不用 FSx,选 none
  • Observability: 先关掉,后面手动配
  • Operator: training/MLops 的 operator 先别勾,省资源

Instance group 是重点:

建两个节点组——g5.2xlarge 和 g6e.2xlarge。进 Advanced configuration,把 Threads per core 改成 2

踩坑: 默认值是 1,不改的话 CPU 只用了一半的超线程能力。我第一次部署 Pod 启动贼慢,排查半天才发现是这个参数。

配置环境 & 部署存储

环境变量

cp config.env.example config.env
vi config.env
# 填入集群名称、Region、S3 bucket 等

S3 CSI Driver(让 Pod 能挂载 S3)

./create_s3_csi_driver.sh \
  -c <你的EKS集群名称> \
  -r <你的region> \
  -b <你的模型bucket名称>

Load Balancer Controller(让服务能对外暴露)

./create_lb_controller.sh \
  -v <你的VPC ID> \
  -c <你的EKS集群名称>

部署 Whisper 推理服务

./upload_scripts_to_s3.sh
./deploy_pv_scripts.sh

两个必须改的地方:

  1. whisper-triton-pv-scripts.yaml 里的 subPath → 改成你模型在 S3 的实际路径
  2. Deployment 的镜像地址 → 改成你 ECR 的实际地址

踩坑: subPath 填错不报错!Pod 跑起来了,但挂载目录是空的,Triton 找不到模型,一直 CrashLoopBackOff。kubectl logs 看到 "model not found" 才反应过来。整整卡了一个小时。

验证:一条 curl 搞定

kubectl get svc

找到 EXTERNAL-IP,就是 NLB 地址。

curl -X POST http://<NLB地址>:8080/invocations \
  -H "Content-Type: application/json" \
  -d "{\"audio_data\": \"$(base64 -i test.wav)\", \"whisper_prompt\": \"\"}" | jq .

返回:

{
  "code": 0,
  "message": "Success",
  "transcribe_text": " I want to play Søya."
}

到这里,Whisper 推理服务就跑通了。NLB 会自动把请求分发到 g5 和 g6e 节点上的 Pod。

监控:AMP + Grafana

生产环境不上监控等于裸奔。

开启 EKS Private Access

aws eks update-cluster-config \
  --name <你的集群名称> \
  --region <你的region> \
  --resources-vpc-config endpointPrivateAccess=true,endpointPublicAccess=true

配 AMP Scraper

EKS 控制台 → Observability → Add Scraper → 上传配置文件(改集群 ID)。

验证采集

pip3 install awscurl

WORKSPACE_ID="<你的AMP Workspace ID>"
REGION="us-east-1"
ENDPOINT="https://aps-workspaces.${REGION}.amazonaws.com/workspaces/${WORKSPACE_ID}"

awscurl --service aps --region $REGION \
  "${ENDPOINT}/api/v1/query?query=nv_inference_request_success" | python3 -m json.tool

Grafana 面板

创建 Amazon Managed Grafana Workspace,关联 Prometheus 数据源,导入仪表板 JSON。

能看到的指标包括:推理请求速率、平均延迟、GPU 利用率/显存/功耗、吞吐量、队列等待时间等。

踩坑清单

现象根因修复
Quota 不足节点组创建失败没提额度Service Quotas 申请
模型加载失败g6e 上 Triton 报错用了 g5 编译产物分别编译
Pod 启动慢起一个 Pod 要好几分钟Threads per core=1改成 2
CrashLoopBackOffTriton 反复重启subPath 填错检查 S3 路径

总结

HyperPod Cluster 方案的核心优势: 一个 EKS 集群管多种 GPU、NLB 统一入口、K8s 原生弹性伸缩、AMP+Grafana 全套监控。

配置工作比托管 Endpoint 多一些,但灵活性高很多。如果你也有异构 GPU 混合部署的需求,这个方案推荐试试。

相关链接: