异构 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 usage 和 ml.g6e.2xlarge for cluster usage,把数量提上去。
别偷懒跳过这步。 我第一次就忘了,后面创建节点组直接报 quota 不足,白等了半小时。
编译模型(这步花时间)
核心操作:用 TensorRT-LLM 把 Whisper 编译成高性能版本,打包成 Triton 格式。
bash
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 启动贼慢,排查半天才发现是这个参数。
配置环境 & 部署存储
环境变量
bash
cp config.env.example config.env
vi config.env
# 填入集群名称、Region、S3 bucket 等
S3 CSI Driver(让 Pod 能挂载 S3)
bash
./create_s3_csi_driver.sh \
-c <你的EKS集群名称> \
-r <你的region> \
-b <你的模型bucket名称>
Load Balancer Controller(让服务能对外暴露)
bash
./create_lb_controller.sh \
-v <你的VPC ID> \
-c <你的EKS集群名称>
部署 Whisper 推理服务
bash
./upload_scripts_to_s3.sh
./deploy_pv_scripts.sh
两个必须改的地方:
whisper-triton-pv-scripts.yaml里的subPath→ 改成你模型在 S3 的实际路径- Deployment 的镜像地址 → 改成你 ECR 的实际地址
踩坑: subPath 填错不报错!Pod 跑起来了,但挂载目录是空的,Triton 找不到模型,一直 CrashLoopBackOff。kubectl logs 看到 "model not found" 才反应过来。整整卡了一个小时。
验证:一条 curl 搞定
bash
kubectl get svc
找到 EXTERNAL-IP,就是 NLB 地址。
bash
curl -X POST http://<NLB地址>:8080/invocations \
-H "Content-Type: application/json" \
-d "{\"audio_data\": \"$(base64 -i test.wav)\", \"whisper_prompt\": \"\"}" | jq .
返回:
json
{
"code": 0,
"message": "Success",
"transcribe_text": " I want to play Søya."
}
到这里,Whisper 推理服务就跑通了。NLB 会自动把请求分发到 g5 和 g6e 节点上的 Pod。
监控:AMP + Grafana
生产环境不上监控等于裸奔。
开启 EKS Private Access
bash
aws eks update-cluster-config \
--name <你的集群名称> \
--region <你的region> \
--resources-vpc-config endpointPrivateAccess=true,endpointPublicAccess=true
配 AMP Scraper
EKS 控制台 → Observability → Add Scraper → 上传配置文件(改集群 ID)。
验证采集
bash
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 |
| CrashLoopBackOff | Triton 反复重启 | subPath 填错 | 检查 S3 路径 |
总结
HyperPod Cluster 方案的核心优势: 一个 EKS 集群管多种 GPU、NLB 统一入口、K8s 原生弹性伸缩、AMP+Grafana 全套监控。
配置工作比托管 Endpoint 多一些,但灵活性高很多。如果你也有异构 GPU 混合部署的需求,这个方案推荐试试。
相关链接: