A100 GPU特性及虚拟化支持-qwen3.5提供
·
🤖 Assistant
基于您的调研和搜索结果,我为您设计一套完整的 GPU PaaS 平台动态虚拟化方案,以 HAMi 为核心框架。
GPU PaaS 平台动态虚拟化方案(基于 HAMi)
一、方案概述
HAMi(Heterogeneous AI Computing Virtualization Middleware)是 CNCF Sandbox 项目,专为 Kubernetes 环境下的异构算力管理设计 12。它通过软件层面的 vCUDA 方案,实现 GPU 显存和算力的细粒度切分与硬隔离,无需修改应用程序即可实现资源共享 32。
核心优势对比
| 特性 | NVIDIA MIG | NVIDIA Time-Slicing | HAMi |
|---|---|---|---|
| 显存隔离 | ✅ 硬件级 | ❌ 无 | ✅ 软件级硬隔离 |
| 算力隔离 | ✅ 硬件级 | ❌ 无 | ✅ 可配置(1% 粒度) |
| 支持 GPU 型号 | A100/H100 仅 | 全部 | 全部(含 T4/A10/A100) |
| 显存切分粒度 | 固定规格 | 无 | 任意 MB 级别 |
| 多卡支持 | 单卡内 | 单卡内 | ✅ 跨卡调度 |
| 性能损耗 | 无 | 低 | <10% 3 |
二、架构设计
2.1 整体架构图
┌─────────────────────────────────────────────────────────────────┐
│ Kubernetes Cluster │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ HAMi │ │ HAMi │ │ NVIDIA GPU │ │
│ │ Scheduler │ │ Device │ │ Operator │ │
│ │ (扩展调度器)│ │ Plugin │ │ (驱动/容器工具) │ │
│ └──────┬──────┘ └──────┬──────┘ └────────────┬────────────┘ │
│ │ │ │ │
│ └────────────────┼───────────────────────┘ │
│ │ │
│ ┌────────────────▼───────────────────────────┐ │
│ │ MutatingWebhook │ │
│ │ (注入 LD_PRELOAD、修正资源声明) │ │
│ └────────────────┬───────────────────────────┘ │
│ │ │
│ ┌────────────────▼───────────────────────────┐ │
│ │ Pod (AI 工作负载) │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ HAMi-Core (libvgpu.so) │ │ │
│ │ │ (拦截 cudaMalloc 等 CUDA API) │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
2.2 核心组件说明
| 组件 | 功能 | 部署位置 |
|---|---|---|
| HAMi Scheduler | 扩展 K8s 调度器,支持显存/算力感知的 Filter/Score/Bind 4 | kube-system |
| HAMi Device Plugin | 上报虚拟 GPU 资源,替代官方 NVIDIA Device Plugin 4 | 每节点 DaemonSet |
| MutatingWebhook | 拦截 Pod 创建,注入调度器名称、runtimeClassName、LD_PRELOAD 4 | kube-system |
| HAMi-Core | 容器内动态库,拦截 CUDA API 实现显存/算力限制 43 | 注入到 Pod 容器 |
三、部署方案
3.1 前置条件
3.2 部署步骤
步骤 1:标记 GPU 节点
kubectl label nodes <node-id> gpu=on
步骤 2:添加 Helm Repo
helm repo add hami-charts https://project-hami.github.io/HAMi/
步骤 3:配置并安装
创建 hami-values.yaml 配置文件:
# HAMi GPU 虚拟化配置文件
scheduler:
kubeScheduler:
imageTag: v1.27.4 # 匹配 K8s 版本
nvidia:
# 显存虚拟化比例 (1.0 = 不超分, >1.0 = 超分)
deviceMemoryScaling: 1.0
# 每个 GPU 最大任务数
deviceSplitCount: 10
# MIG 策略 ("none" / "mixed")
migstrategy: "mixed"
# 是否禁用算力限制
disablecorelimit: "false"
# 默认显存分配 (MB, 0 = 100%)
defaultMem: 0
# 默认 GPU 核心百分比 (0-100)
defaultCores: 0
# 默认 GPU 数量
defaultGPUNum: 1
执行安装:
helm upgrade -i hami hami-charts/hami -f hami-values.yaml -n kube-system
步骤 4:验证安装
kubectl get pods -n kube-system | grep hami
# 应看到 hami-device-plugin 和 hami-scheduler 均为 Running
3.3 重要注意事项
⚠️ HAMi Device Plugin 与 NVIDIA 官方 Device Plugin 不能共存,需卸载官方插件以避免资源冲突 4。
四、动态资源调度策略
4.1 资源申请模型
| 资源类型 | 资源名称 | 说明 |
|---|---|---|
| vGPU 数量 | nvidia.com/gpu | 请求的物理 GPU 数量 |
| 显存大小 | nvidia.com/gpumem | 显存限制 (MB) |
| 算力比例 | nvidia.com/gpucores | 算力百分比 (0-100) |
4.2 典型场景配置
场景 1:小模型推理(显存隔离 + 算力共享)
apiVersion: v1
kind: Pod
metadata:
name: small-model-inference
spec:
containers:
- name: inference-container
image: pytorch/pytorch:2.0-cuda11.7
resources:
limits:
nvidia.com/gpu: 1 # 1 个 vGPU
nvidia.com/gpumem: 4000 # 4GB 显存
# 不设置 gpucores = 算力共享
适用场景: 推荐系统、实时预测等小模型,单卡可并行多个模型 4。
场景 2:大模型训练(多卡 + 显存隔离)
apiVersion: v1
kind: Pod
metadata:
name: llm-training
spec:
containers:
- name: training-container
image: pytorch/pytorch:2.0-cuda11.7
resources:
limits:
nvidia.com/gpu: 4 # 4 张物理 GPU
nvidia.com/gpumem: 20000 # 每张卡 20GB 显存
nvidia.com/gpucores: 80 # 每张卡 80% 算力
关键说明: nvidia.com/gpu: 4 会被调度到 4 张物理 GPU 上,而非同一张卡的 4 个 vGPU 4。
场景 3:显存超分(提高利用率)
# 在 hami-values.yaml 中配置
nvidia:
deviceMemoryScaling: 1.5 # 16GB 显存可虚拟出 24GB
适用场景: 开发/测试环境,生产环境建议保持 1.0 2。
4.3 调度策略配置
| 策略 | 配置项 | 说明 |
|---|---|---|
| Binpack | 默认 | 优先填满单卡,减少碎片 |
| Spread | 调度器参数 | 分散到多卡,提升并行度 |
| 拓扑感知 | 企业版特性 | NVLink 感知,优化多卡通信 2 |
五、动态调整方案
5.1 运行时资源调整
⚠️ 重要限制: 目前技术(包括 HAMi/MIG/vGPU)不支持 Pod 运行中动态扩容显存。资源调整需通过以下方式实现:
方案 A:Pod 重建(推荐)
# 1. 更新 Deployment 的资源配置
kubectl edit deployment <name>
# 2. 滚动更新
kubectl rollout restart deployment <name>
方案 B:HPA + 多规格 Pod
# 定义多个 Deployment,不同显存规格
# 配合 KEDA 或自定义 HPA 根据负载切换
方案 C:弹性节点池
# 使用 Cluster Autoscaler
# 低峰期:MIG 切分为 7 片(推理)
# 高峰期:MIG 重置为整卡(训练)
5.2 节点级动态策略
通过修改节点标签和 MIG 配置实现时段化资源池:
# 白天:推理模式(7 切片)
kubectl annotate node <node> hami.io/mig-profile=7x1g.5gb
# 夜间:训练模式(整卡)
kubectl annotate node <node> hami.io/mig-profile=none
六、监控与观测
6.1 监控指标
HAMi 默认开启监控,访问端点 2:
http://<scheduler-ip>:31993/metrics
6.2 Grafana Dashboard
导入官方 Dashboard 配置 2:
- GPU 利用率
- 显存使用率
- vGPU 分配情况
- 任务排队状态
6.3 日志排查
# 查看设备注册情况
kubectl logs -n kube-system -l app.kubernetes.io/name=hami | grep "device"
# 查看 Pod GPU 分配
kubectl get pod <pod> -o jsonpath='{.metadata.annotations.hami\.io/vgpu-devices-allocated}'
七、性能考量
根据 AWS 实测数据 4:
| 场景 | 配置 | 平均算力 (GFLOPS) | 损耗 |
|---|---|---|---|
| 独占整卡 | 15GB 显存 | 4280 | - |
| HAMi 单 Pod | 7GB 显存 | 4289 | ~0% |
| HAMi 双 Pod | 各 7GB 显存 | 1751/1747 | ~18% |
结论:
八、最佳实践建议
8.1 生产环境配置
nvidia:
deviceMemoryScaling: 1.0 # 生产环境不超分
deviceSplitCount: 5 # 根据业务调整
migstrategy: "mixed" # A100 节点启用 MIG
disablecorelimit: "false" # 启用算力限制
8.2 资源配额管理
# 使用 ResourceQuota 限制命名空间总 GPU 使用
apiVersion: v1
kind: ResourceQuota
metadata:
name: gpu-quota
spec:
hard:
nvidia.com/gpu: "10"
nvidia.com/gpumem: "80000" # 总显存 80GB
8.3 优先级调度
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 4000
nvidia.com/priority: 0 # 0=高优先级,1=低优先级 [3]
8.4 避免的问题
| 问题 | 解决方案 |
|---|---|
| Pod 使用 privileged | 会导致可见所有 GPU,禁止使用 2 |
| 设置 nodeName | 调度器无法工作,改用 nodeSelector 2 |
| 同时存在两个 Device Plugin | 卸载 NVIDIA 官方插件 4 |
九、方案总结
| 维度 | 方案选择 |
|---|---|
| 虚拟化框架 | HAMi (开源/CNCF Sandbox) |
| 显存隔离 | 软件级硬隔离 (LD_PRELOAD 拦截) |
| 算力隔离 | 可配置百分比限制 |
| 动态调整 | Pod 重建 + 节点策略切换 |
| 监控 | 内置 Prometheus 指标 + Grafana |
| 适用 GPU | T4/A10/A100/H100 等全系 |
| 性能损耗 | <10% (官方基准) |
后续扩展建议
- 企业版功能:如需算力超分、抢占式调度、多集群管理,可考虑 HAMi 企业版 (Rise VAST) 2
- 调度增强:集成 Volcano 或 Kueue 实现队列管理和 Gang Scheduling 1
- WebUI 管理:部署 HAMi-WebUI (v2.4.0+) 实现可视化资源管理 2
此方案已在 AWS EKS 及多个生产环境验证,可支撑小模型推理与大模型训练的统一资源池管理 4。
更多推荐


所有评论(0)