NVIDIA vGPU 切分虚拟化(HAMi)
CubeStudio 采用第四范式开源的 HAMi 作为 vGPU 虚拟化方案,对单张 NVIDIA GPU 做切分共享。平台侧配置见 myapp/config.py 的 VGPU_RESOURCE({"vgpu":"nvidia.com/vgpu"},约 myapp/config.py:1270)与 VGPU_DRIVE_TYPE = "vgpu"(myapp/config.py:1276,注释标注「第四范式解决方案」)。
部署步骤
下载 HAMi chart 包:
wget https://githubfast.com/Project-HAMi/HAMi/releases/download/v2.8.0/hami-2.8.0.tgz
用 helm template 渲染出 vgpu.yaml:
helm template vgpu hami \
--set resourceName=nvidia.com/vgpu \
--set scheduler.kubeScheduler.imageTag=v1.28.15 \
--set version=v2.8.0 \
--set scheduler.overwriteEnv="false" \
-n kube-system > vgpu.yaml
说明:
resourceName=nvidia.com/vgpu与平台VGPU_RESOURCE中的资源名保持一致。scheduler.kubeScheduler.imageTag需与集群 k8s 版本匹配。仓库内已提供渲染好的样例:install/kubernetes/gpu/vgpu/vgpu.yaml(HAMi 2.8.0),以及按 k8s 版本区分的vgpu-k8s1.21.yaml、vgpu-k8s1.25.yaml。
修改 vgpu.yaml
对渲染出的 vgpu.yaml 做以下调整:
- 关闭显存超分,只做切分:将
"devicememoryscaling": 1(即不做显存虚拟化超分,仅做分隔)。该字段在仓库样例中位于install/kubernetes/gpu/vgpu/vgpu.yaml:50。 - 节点选择器:将
nodeSelector改为vgpu: "true"(仅在打了该标签的节点上启用 vGPU)。 - 命名空间:添加
namespace: kube-system。 - 服务暴露类型:服务暴露类型改为
type: ClusterIP,并去掉nodePort。 type: NodePort类型的服务改为 ClusterIP,同时注释掉externalTrafficPolicy: Local。
接入 Prometheus 监控
为 vgpu-hami-scheduler 服务添加注释,将「调度量」等信息同步到 Prometheus:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: '9395'
prometheus.io/path: /metrics
为 vgpu-hami-device-plugin-monitor 服务添加注释,将「pod 实际使用情况」信息同步到 Prometheus:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: '9394'
prometheus.io/path: /metrics
说明:上述服务名与端口与仓库样例一致——
vgpu-hami-scheduler暴露 9395、vgpu-hami-device-plugin-monitor暴露 9394(见install/kubernetes/gpu/vgpu/vgpu.yaml中对应的 Service 定义)。
Bug 修复:补充 RBAC 权限
为 vgpu-hami-scheduler 角色添加 volumeattachments 权限:
# 添加 volumeattachments 权限
- apiGroups: ["storage.k8s.io"]
resources: ["volumeattachments"]
verbs: ["get", "list", "watch"]
全部配置参考
所有配置项参考 HAMi 官方中文文档:https://github.com/Project-HAMi/HAMi/blob/v2.7.1/docs/config_cn.md