跳到主要内容

HAMi Enterprise 2.7.1-rc0

Chart 版本Chart 声明的 appVersion发布日期
2.7.1-rc02.7.1-rc02026 年 1 月 16 日

这是 dynamia 首个 HAMi Enterprise 版本,发布状态为预发布。本页以开源 HAMi v2.7.0 为对照。

软件变更​

相对开源 HAMi v2.7.0 的企业版扩展​

通过 Downward API 传递 NVIDIA 设备分配结果。 调度器将 GPU UUID、显存额度和算力限制写入 Pod 标注,再通过 Kubernetes Downward API 传入对应容器。常规 NVIDIA vGPU 分配路径因此可以跳过依赖节点锁查找待分配 Pod 的步骤。默认设备配置中的 nvidia.useDownward 为 true,仍需配套设备插件、企业版运行库和 NVIDIA 容器运行环境。

调整运行中容器的显存额度。 企业版监控组件接收运行时报告的显存调整请求,交由调度器检查设备可用容量;调度器更新分配记录和配额用量后,监控组件将批准的额度同步回运行时。此能力依赖配套企业版运行时、监控组件和调度器,不等同于修改 Pod 的 resources.limits,也不表示所有工作负载都会自动扩容。首版的扩容判断不额外检查命名空间 ResourceQuota 上限,不能将它作为运行时扩容的强制配额边界。

管理 NVIDIA 设备授权。 调度器将设备授权有效期纳入选卡判断,监控组件同步授权更新。调度器指标 vGPULicenseRemains 提供授权剩余秒数,可用于配置到期告警。安装与续期所需的授权资料通过约定的交付渠道获取。

提供容器显存明细。 除显存总用量和限额外,企业版监控提供以下指标,单位均为字节,应按 Gauge 当前值使用:

指标含义
hami_container_device_memory_context_bytes上下文显存占用
hami_container_device_memory_data_bytes数据显存占用
hami_container_device_memory_module_bytes模块显存占用
hami_container_device_memory_offset_bytes偏移显存占用

这些指标通过 podnamespace、podname、ctrname、vdeviceid、deviceuuid 标签关联容器与设备。采集规则应使用这些实际标签名。

已同步的开源改动​

本版本还纳入了开源 HAMi v2.7.0 之后的以下社区改动。

改动对使用和集成的影响对应开源 PR
天数智芯多型号配置按 BI-V100、BI-V150、MR-V100、MR-V50 分别配置设备数量、显存和算力资源名。需配套对应的 GPU Manager,并设置 devices.iluvatar.enabled: true(默认 false)。例如 BI-V150 使用 iluvatar.ai/BI-V150-vgpu、iluvatar.ai/BI-V150.vMem、iluvatar.ai/BI-V150.vCore。HAMi #1399
沐曦 sGPU 在线与离线任务分类Pod 标注 metax-tech.com/sgpu-app-class 可取 online 或 offline,调度时区分两类任务的设备选择;设置该标注时,每个相关容器只能申请一个 sGPU。任务执行优先级仍依赖配套沐曦组件。HAMi #1436
AMD MI300X 整卡资源接入需另行部署配套 AMD 设备插件;HAMi 根据其上报的 amd.com/gpu 容量,将整卡分配纳入调度器记录与指标。每卡显存按固定的 192000 MiB 记账;这些指标反映调度分配量,不代表实时显存或利用率遥测。本版本不提供 AMD 显存或算力切分。HAMi #1472
动态 MIG 混合规格选择在同一切分方案含多种实例规格时,按申请匹配具体实例,修复小显存申请错误占用较大实例的问题。HAMi #1518
配额用量清理Pod 进入终止状态时回收其配额用量;更新 ResourceQuota 时先清理旧配置,避免清空配额项后仍保留旧限制。HAMi #1400
按节点维护 GPU 数量分别跟踪各节点上报的 NVIDIA GPU 数量,避免不同节点之间相互覆盖设备数量记录。HAMi #1555
节点锁标注解析对包含分隔符但字段数量错误的节点锁标注返回明确错误;旧的纯时间戳格式仍可解析。企业版默认 Downward API 路径不依赖这条节点锁分配流程。HAMi #1560
节点配置与选择器修复节点配置按 JSON 文本写入 ConfigMap;NVIDIA 节点选择器统一使用 devicePlugin.nvidiaNodeSelector。迁移旧 values 时需检查键名。HAMi #1558、HAMi #1546
可选模拟设备插件可安装模拟设备插件进行无 GPU 的调度验证,默认关闭;模拟设备不执行真实 GPU 计算。HAMi #1534
可选 DRA 安装路径主 Chart 包含 hami-dra 子 Chart 0.0.1,可切换到 Kubernetes 动态资源分配路径,默认关闭。切换行为见下文。HAMi #1542

Chart 变更​

首版主 Chart 名称为 hami,默认应用镜像为 ghcr.io/dynamia-ai/hami:v2.7.1-rc0。该标签用于调度扩展器、NVIDIA 设备插件及 vGPU 监控;内置 kube-scheduler、证书辅助组件和可选子 Chart 使用各自的镜像配置。

配置项默认值使用说明
schedulerNamehami-scheduler工作负载使用的调度器名称
scheduler.replicas1默认部署一个调度器 Pod
devicePlugin.nvidiaNodeSelectorgpu: "on"NVIDIA 设备插件部署到带有该标签的节点
devicePlugin.deviceSplitCount10默认设备共享份数
devicePlugin.deviceMemoryScaling1默认不放大可分配显存容量
devicePlugin.deviceListStrategyenvvar默认通过环境变量传递设备列表
mockDevicePlugin.enabledfalse启用时默认使用模拟插件镜像标签 0.1.0
dra.enabledfalse启用后改用 DRA 子 Chart,不再部署主 Chart 的常规调度器和 NVIDIA 设备插件

DRA 路径需满足配套驱动及 Kubernetes 的 DRA 要求,不能直接套用常规设备插件路径的企业版扩展说明。

升级说明​

安装首版或从开源版迁移​

使用约定交付的 hami-2.7.1-rc0.tgz、配套企业版运行时和授权资料。采用自定义镜像仓库或显式镜像标签时,应同步检查调度扩展器、设备插件和监控的版本,避免只替换其中一个组件。

从开源部署迁移时,按本版本配置核对节点选择、调度器接入和设备资源申请。若旧 values 使用 devicePlugin.nvidianodeSelector,改为 devicePlugin.nvidiaNodeSelector;默认选择器为 gpu: "on",遗漏自定义选择器可能使插件部署到错误的节点集合。

天数智芯的旧参数 iluvatarResourceName、iluvatarResourceMem、iluvatarResourceCore 已不再被 Chart 使用,旧 values 不会自动迁移。原先默认的 iluvatar.ai/vgpu、iluvatar.ai/vcuda-memory、iluvatar.ai/vcuda-core 改为按型号区分的资源名。迁移时需设置 devices.iluvatar.enabled: true,按实际型号同步调整 Pod 的设备数量、显存和算力资源申请,并部署使用同一套资源名称的配套 GPU Manager;仅替换 Chart、继续保留旧 Pod 资源名不能完成迁移。

devicePlugin.nodeConfiguration.config 接收 JSON 文本。配置中的 name 应填写实际节点名;默认示例名 your-node-name 不会自动匹配现场节点。设置 devicePlugin.nodeConfiguration.externalConfigName 时,使用指定 ConfigMap,Chart 不再创建这份节点配置。

检查 Downward API 与启动钩子​

默认设备配置同时设置 nvidia.useDownward: true 和 nvidia.postNvidiaSmi: true。开启 Downward API 后,后者为申请 NVIDIA 设备的容器设置执行 nvidia-smi 的 postStart 钩子。应用镜像必须能执行该命令;已有的 postStart 会被替换,不会自动合并。

需要关闭启动钩子时,在设备配置中保留 nvidia.useDownward: true,将 nvidia.postNvidiaSmi 改为 false。这两个字段不是该版本的顶层 Helm 参数。使用自定义 files/device-config.yaml 时,该文件完整替换默认设备配置,需保留其余实际使用的设备字段,不能只提交这两个字段。按修改后的配置更新调度器和设备插件,并重新创建需要改变注入行为的工作负载 Pod。

首版的 NVIDIA 分配标注按普通容器列表处理,尚未包含后续版本的空分配列表和容器索引防护。含非 GPU 容器、初始化容器或原生边车容器的组合不能据此视为已完整支持。

检查配额与监控集成​

首版尚未包含 NVIDIA 多容器配额累计修复:同一 Pod 的多个 GPU 容器可能分别通过检查,但合计申请超过命名空间剩余配额。需要这项修复的部署可查看 Chart 2.8.0-rc0;运行时显存调整的配额边界则按前文说明处理。

显存明细指标来自 vGPU 监控,vGPULicenseRemains 来自调度器。采集端需覆盖两个组件,并按当前值配置看板与告警。本版本仍保留 HostGPUMemoryUsage、HostCoreUtilization 等旧指标,不能按后续版本的指标删除清单提前移除采集规则。

查看 Chart 与 appVersion 对应关系或软件中心。

Values 说明​

以下参数说明取自 Chart 2.7.1-rc0 发布包随附的 README,保留原文。默认配置以该版本的 values.yaml 为准。

展开参数表

Global Configuration

ParameterDescriptionDefault Value
global.imageRegistryGlobal Docker image registry""
global.imagePullSecretsGlobal Docker image pull secrets[]
global.imageTagImage tag"v2.7.1"
global.gpuHookPathGPU Hook path/usr/local
global.labelsGlobal labels{}
global.annotationsGlobal annotations{}
global.managedNodeSelectorEnableWhether to enable managed node selectorfalse
global.managedNodeSelector.usageManaged node selector usage"gpu"
nameOverrideName override""
fullnameOverrideFull name override""
namespaceOverrideNamespace override""

Resource Name Configuration

NVIDIA GPU Resources

ParameterDescriptionDefault Value
resourceNameGPU resource name"nvidia.com/gpu"
resourceMemGPU memory resource name"nvidia.com/gpumem"
resourceMemPercentageGPU memory percentage resource name"nvidia.com/gpumem-percentage"
resourceCoresGPU core resource name"nvidia.com/gpucores"
resourcePriorityGPU priority resource name"nvidia.com/priority"

Cambricon MLU Resources

ParameterDescriptionDefault Value
mluResourceNameMLU resource name"cambricon.com/vmlu"
mluResourceMemMLU memory resource name"cambricon.com/mlu.smlu.vmemory"
mluResourceCoresMLU core resource name"cambricon.com/mlu.smlu.vcore"

Hygon DCU Resources

ParameterDescriptionDefault Value
dcuResourceNameDCU resource name"hygon.com/dcunum"
dcuResourceMemDCU memory resource name"hygon.com/dcumem"
dcuResourceCoresDCU core resource name"hygon.com/dcucores"

Metax GPU Resources

ParameterDescriptionDefault Value
metaxResourceNameGPU resource name"metax-tech.com/sgpu"
metaxResourceCoreGPU core resource name"metax-tech.com/vcore"
metaxResourceMemGPU memory resource name"metax-tech.com/vmemory"
metaxsGPUTopologyAwareGPU topology awareness"false"

Enflame GCU Resources

ParameterDescriptionDefault Value
enflameResourceNameVGCUvGCU resource name"enflame.com/vgcu"
enflameResourceNameVGCUPercentagevGCU percentage resource name"enflame.com/vgcu-percentage"

Kunlunxin XPU Resources

ParameterDescriptionDefault Value
kunlunResourceNameXPU resource name"kunlunxin.com/xpu"

Scheduler Configuration

ParameterDescriptionDefault Value
schedulerNameScheduler name"hami-scheduler"
scheduler.nodeNameDefine node name, scheduler will schedule to this node""
scheduler.overwriteEnvWhether to overwrite environment variables"false"
scheduler.defaultSchedulerPolicy.nodeSchedulerPolicyNode scheduler policybinpack
scheduler.defaultSchedulerPolicy.gpuSchedulerPolicyGPU scheduler policyspread
scheduler.metricsBindAddressMetrics bind address":9395"
scheduler.forceOverwriteDefaultSchedulerWhether to force overwrite default schedulertrue
scheduler.livenessProbeWhether to enable liveness probefalse
scheduler.leaderElectWhether to enable leader electiontrue
scheduler.replicasNumber of replicas1

Kube Scheduler Configuration

ParameterDescriptionDefault Value
scheduler.kubeScheduler.enabledWhether to run kube-scheduler container in scheduler podtrue
scheduler.kubeScheduler.image.registryKube scheduler image registry"registry.cn-hangzhou.aliyuncs.com"
scheduler.kubeScheduler.image.repositoryKube scheduler image repository"google_containers/kube-scheduler"
scheduler.kubeScheduler.image.tagKube scheduler image tag""
scheduler.kubeScheduler.image.pullPolicyKube scheduler image pull policyIfNotPresent
scheduler.kubeScheduler.image.pullSecretsKube scheduler image pull secrets[]
scheduler.kubeScheduler.extraNewArgsExtra new arguments["--config=/config/config.yaml", "-v=4"]
scheduler.kubeScheduler.extraArgsExtra arguments["--policy-config-file=/config/config.json", "-v=4"]

Extender Configuration

ParameterDescriptionDefault Value
scheduler.extender.image.registryScheduler extender image registry"docker.io"
scheduler.extender.image.repositoryScheduler extender image repository"projecthami/hami"
scheduler.extender.image.tagScheduler extender image tag""
scheduler.extender.image.pullPolicyScheduler extender image pull policyIfNotPresent
scheduler.extender.image.pullSecretsScheduler extender image pull secrets[]
scheduler.extender.extraArgsScheduler extender extra arguments["--debug", "-v=4"]

Admission Webhook Configuration

ParameterDescriptionDefault Value
scheduler.admissionWebhook.enabledWhether to enable admission webhooktrue
scheduler.admissionWebhook.customURL.enabledWhether to enable custom URLfalse
scheduler.admissionWebhook.customURL.hostCustom URL host127.0.0.1
scheduler.admissionWebhook.customURL.portCustom URL port31998
scheduler.admissionWebhook.customURL.pathCustom URL path/webhook
scheduler.admissionWebhook.reinvocationPolicyReinvocation policyNever
scheduler.admissionWebhook.failurePolicyFailure policyIgnore

TLS Certificate Configuration

ParameterDescriptionDefault Value
scheduler.certManager.enabledWhether to use cert-manager to generate self-signed certificatesfalse
scheduler.patch.enabledWhether to use kube-webhook-certgen to generate self-signed certificatestrue
scheduler.patch.image.registryCertgen image registry"docker.io"
scheduler.patch.image.repositoryCertgen image repository"jettech/kube-webhook-certgen"
scheduler.patch.image.tagCertgen image tag"v1.5.2"
scheduler.patch.image.pullPolicyCertgen image pull policyIfNotPresent
scheduler.patch.imageNew.registryNew certgen image registry"docker.io"
scheduler.patch.imageNew.repositoryNew certgen image repository"liangjw/kube-webhook-certgen"
scheduler.patch.imageNew.tagNew certgen image tag"v1.1.1"

Scheduler Service Configuration

ParameterDescriptionDefault Value
scheduler.service.typeService typeNodePort
scheduler.service.httpPortHTTP port443
scheduler.service.schedulerPortScheduler NodePort31998
scheduler.service.monitorPortMonitor port31993
scheduler.service.monitorTargetPortMonitor target port9395

Device Plugin Configuration

ParameterDescriptionDefault Value
devicePlugin.image.registryDevice plugin image registry"docker.io"
devicePlugin.image.repositoryDevice plugin image repository"projecthami/hami"
devicePlugin.image.tagDevice plugin image tag""
devicePlugin.image.pullPolicyDevice plugin image pull policyIfNotPresent
devicePlugin.image.pullSecretsDevice plugin image pull secrets[]

Monitor Configuration

ParameterDescriptionDefault Value
devicePlugin.monitor.image.registryMonitor image registry"docker.io"
devicePlugin.monitor.image.repositoryMonitor image repository"projecthami/hami"
devicePlugin.monitor.image.tagMonitor image tag""
devicePlugin.monitor.image.pullPolicyMonitor image pull policyIfNotPresent
devicePlugin.monitor.image.pullSecretsMonitor image pull secrets[]
devicePlugin.monitor.ctrPathContainer path/usr/local/vgpu/containers
devicePlugin.monitor.extraArgsMonitor extra arguments["-v=4"]
devicePlugin.monitor.extraEnvsMonitor extra environments{}

Device Plugin Other Configuration

ParameterDescriptionDefault Value
devicePlugin.deviceSplitCountInteger type, default value: 10. Maximum number of tasks assigned to a single GPU device10
devicePlugin.deviceMemoryScalingDevice memory scaling ratio1
devicePlugin.deviceCoreScalingDevice core scaling ratio1
devicePlugin.runtimeClassNameRuntime class name""
devicePlugin.createRuntimeClassWhether to create runtime classfalse
devicePlugin.migStrategyString type, "none" means ignore MIG functionality, "mixed" means allocate MIG devices through independent resources"none"
devicePlugin.disablecorelimitString type, "true" means disable core limit, "false" means enable core limit"false"
devicePlugin.passDeviceSpecsEnabledWhether to enable passing device specsfalse
devicePlugin.extraArgsDevice plugin extra arguments["-v=4"]
devicePlugin.nodeConfiguration.configNode configuration for device plugin by jsonAn example of default configuration.
devicePlugin.nodeConfiguration.externalConfigNameNode configuration for device plugin by external congimap""
devicePlugin.extraEnvsDevice plugin extra environments{}

Device Plugin Service Configuration

ParameterDescriptionDefault Value
devicePlugin.service.typeService typeNodePort
devicePlugin.service.httpPortHTTP port31992

Device Plugin Deployment Configuration

ParameterDescriptionDefault Value
devicePlugin.pluginPathPlugin path/var/lib/kubelet/device-plugins
devicePlugin.libPathLibrary path/usr/local/vgpu
devicePlugin.nvidiaNodeSelectorNVIDIA node selector{"gpu": "on"}
devicePlugin.updateStrategy.typeUpdate strategy typeRollingUpdate
devicePlugin.updateStrategy.rollingUpdate.maxUnavailableMaximum unavailable count1

Device Configuration

AWS Neuron

ParameterDescriptionDefault Value
devices.awsneuron.customresourcesCustom resources["aws.amazon.com/neuron", "aws.amazon.com/neuroncore"]

Kunlunxin

ParameterDescriptionDefault Value
devices.kunlun.enabledWhether to enabletrue
devices.kunlun.customresourcesCustom resources["kunlunxin.com/xpu"]

Mthreads

ParameterDescriptionDefault Value
devices.mthreads.enabledWhether to enabletrue
devices.mthreads.customresourcesCustom resources["mthreads.com/vgpu"]

NVIDIA

ParameterDescriptionDefault Value
devices.nvidia.gpuCorePolicyGPU core policydefault
devices.nvidia.libCudaLogLevelCUDA library log level1

Huawei Ascend

ParameterDescriptionDefault Value
devices.ascend.enabledWhether to enablefalse
devices.ascend.imageImage""
devices.ascend.imagePullPolicyImage pull policyIfNotPresent
devices.ascend.extraArgsExtra arguments[]
devices.ascend.nodeSelectorNode selector{"ascend": "on"}
devices.ascend.tolerationsTolerations[]
devices.ascend.customresourcesCustom resources["huawei.com/Ascend910A", "huawei.com/Ascend910A-memory", ...]

Iluvatar

ParameterDescriptionDefault Value
devices.iluvatar.enabledWhether to enablefalse
devices.iluvatar.customresourcesCustom resources["iluvatar.ai/BI-V150-vgpu", "iluvatar.ai/BI-V150.vMem","iluvatar.ai/BI-V150.vCore", ...]