跳到主要内容

HAMi Enterprise 2.9.0-rc0

HAMi Enterprise v2.9.0-rc0 增加 AMD 显存与算力份额请求、Ascend 软切分调度接口及瀚博设备适配,并调整监控指标名称、设备配置结构和调度器主备实例的流量路由。已有部署需重点检查监控规则、自定义设备配置及配套设备插件。

版本信息​

项目内容
企业版HAMi Enterprise v2.9.0-rc0
发布日期2026-05-15
企业版升级对照版本v2.8.0-rc1
开源对照版本HAMi v2.9.0
Helm Charthami,版本 2.9.0-rc0
Chart 声明的 appVersion2.9.0-rc0
默认企业版组件镜像标签v2.9.0-rc0

软件变更​

相对企业版 v2.8.0-rc1 的变化​

  • 设备调度:AMD 从按节点容量识别整卡改为读取设备插件注册信息,新增显存和算力份额请求;Ascend 增加软切分模式的调度与运行时配置接口;新增瀚博整卡和 die 模式的调度适配及 UUID 选择。三类设备均需另行部署匹配的设备插件,主 Chart 不包含这些插件。
  • 监控接口:常用调度和 vGPU 监控指标改为 hami_ 前缀,并调整标签名称。新增旧指标兼容开关,默认关闭;三项显存细分指标不在兼容范围内。完整映射见「监控规则迁移」。
  • 显存自动扩容:已有功能增加显式启用条件,只处理业务容器中直接配置 CUDA_MEMORY_AUTO_ADJUST: "true" 的扩容反馈。
  • 调度器主备路由:主、备实例的就绪探针均可成功返回,Service 改为通过 hami.io/scheduler-role: leader 选择主实例。已有选主能力继续保留;就绪状态不再表示该实例是主实例。
  • 分配与恢复:修复多容器设备注解的索引保留、MIG 重配置后的 CDI 文件更新,以及终止中 Pod 和设备注册恢复的部分状态处理;修正百分比显存请求的评分计算和零容量处理。

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

能力企业版提供的行为与使用条件
企业授权管理延续按设备实例或设备型号数量管理授权、查看到期状态的能力。不同设备后端的授权支持范围需与交付方案一致。
NVIDIA 容器分配与显存自动扩容延续通过 Downward API 向容器传递设备、显存和算力分配信息,以及显存扩容请求与额度更新能力。扩容需匹配的企业版运行时,受调度器记录的可分配显存约束,仅适用于普通业务容器。
AMD 份额调度相比开源基线的整卡处理,增加注册设备信息、显存与算力请求、型号筛选及分配信息协同;需匹配新的设备注册协议。
Alibaba PPU 调度接入延续 PPU 资源请求、设备选择及命名空间配额检查。需另行部署配套 PPU 插件与运行时;本版默认 Chart 的资源映射限制见「AMD 与 PPU 集成」。
AWS Neuron 资源计量延续企业版的核心数量与显存分摊口径,与开源基线存在差异。从开源平台迁移时,需核对既有配额、资源统计及设备类型映射。

除 AMD 份额调度外,上表能力已在此前企业版中提供。NVIDIA 的 Downward API 分配路径也已存在,本版默认设备配置仍启用 useDownward 和 postNvidiaSmi。

已同步的开源改动​

以下为本次纳入的主要开源改动。配置方式和企业版使用边界以本文升级说明为准。

改动对使用和集成的影响对应开源 PR
瀚博设备调度增加整卡、die 模式和 UUID 选择的调度接入,需配套厂家设备插件#1645
Webhook 标签过滤按命名空间和 Pod 标签限制准入处理范围,保留已有排除条件#1653
监控指标规范化调整指标及标签名称,并提供部分旧指标兼容输出#1644
Ascend 软切分与运行时接口增加 HAMi-core 模式、算力请求、RuntimeClass 及环境变量处理;运行库与设备插件需另行配套#1771、#1804、#1812、#1837、#1738
自定义库目录的预加载配置使预加载文件采用 devicePlugin.libPath,避免仍引用固定默认目录#1714
终止中 Pod 的资源占用Pod 删除过程中保留设备占用记录,避免提前释放调度缓存中的资源#1719
零容量评分保护对设备或节点容量为零的情况增加保护,避免产生无效评分#1820
设备注册恢复修正握手时间解析,并允许超过冷却时间的已删除设备重新注册#1816、#1843
MIG 与 CDI 配合在相应分配路径中,MIG 配置改变后更新并检查 CDI 文件;修正 A100 80GB 的 MIG 规格#1826、#1847

Chart 变更​

  • 新增 legacyMetrics,默认 false;设为 true 时,调度器和 vGPU 监控进程同时追加输出所支持的旧指标。
  • 新增 scheduler.admissionWebhook.namespaceSelector 和 objectSelector,支持 matchLabels、matchExpressions。自定义条件与已有条件共同生效,仍排除标记 hami.io/webhook: ignore 的命名空间或 Pod。
  • 调度器、NVIDIA Device Plugin、vGPU 监控进程的组件级 image.tag 非空时,优先于 global.imageTag;组件级标签为空时使用全局标签。对应配置项为 scheduler.extender.image.tag、devicePlugin.image.tag、devicePlugin.monitor.image.tag。
  • 合并新旧 Kubernetes 版本的调度配置模板。Kubernetes 1.22 及以上的调度 ConfigMap 名称不再带 -newversion;由 Chart 管理的挂载同步更新。自行引用旧 ConfigMap 名称的部署需调整引用。
  • NVIDIA Device Plugin 的 DaemonSet 改为 hostNetwork: false。直接依赖宿主机网络地址采集监控的配置需改用监控 Service 的端点,并检查相应网络策略;原有 Service 和 ServiceMonitor 接口继续保留。
  • 新增 devices.ascend.hamiVnpuCore(默认 false)及 devices.ascend.runtimeClassName(默认空字符串),补充 Ascend 算力资源和 910C 设备配置。devices.ascend.enabled 仍默认关闭。
  • scheduler.overwriteEnv 开始用于生成 NVIDIA 设备配置,并用于新增的 Ascend 配置。默认仍为 "false";启用会影响未申请对应设备的容器可见设备环境变量,使用前需核对原有环境变量约定。
  • 可选 hami-dra 子 Chart 从 0.1.0 升级到 0.2.0。dra.enabled 仍默认关闭;启用后切换到 DRA 部署路径,不同时安装原有调度扩展器。DRA 驱动镜像有独立版本配置,不由主应用标签统一确定。

升级说明​

安装包与配套组件​

通过约定的交付渠道获取 hami-2.9.0-rc0.tgz、企业版镜像以及所用设备的插件和运行时。该版本 Chart 名称仍为 hami。升级时保留现有 Helm release 名称和命名空间,并将已有自定义 values 合并到新版本配置中。

如果组件级镜像标签曾固定为旧版本,仅修改 global.imageTag 不会覆盖它们。应更新三个组件级标签,或清空这些标签后使用全局标签。

监控规则迁移​

升级前更新看板、告警、记录规则和标签筛选。过渡期间可设置 legacyMetrics: true,同时输出新指标与受支持的旧指标;迁移完成后可关闭旧指标输出。自行启动二进制的部署需分别为调度器与 vGPU 监控进程设置 --legacy-metrics=true。

原调度指标新指标
GPUDeviceMemoryLimithami_gpu_memory_limit_bytes
GPUDeviceCoreLimithami_gpu_core_limit_ratio
GPUDeviceMemoryAllocatedhami_gpu_memory_allocated_bytes
GPUDeviceSharedNumhami_gpu_shared_count
GPUDeviceCoreAllocatedhami_gpu_core_allocated_ratio
nodeGPUOverviewhami_node_gpu_overview
nodeGPUMemoryPercentagehami_node_gpu_memory_allocated_ratio
nodeGPUMigInstancehami_node_gpu_mig_instance_info
vGPUMemoryAllocatedhami_vgpu_memory_allocated_bytes
vGPUCoreAllocatedhami_vgpu_core_allocated_ratio
QuotaUsedhami_resource_quota_used
原监控指标新指标兼容开关是否保留旧名称
HostGPUMemoryUsagehami_host_gpu_memory_used_bytes是
HostCoreUtilizationhami_host_gpu_utilization_ratio是
vGPU_device_memory_usage_in_byteshami_vgpu_memory_used_bytes是
vGPU_device_memory_limit_in_byteshami_vgpu_memory_limit_bytes是
Device_memory_desc_of_containerhami_container_device_memory_bytes是
Device_utilization_desc_of_containerhami_container_device_utilization_ratio是
Device_last_kernel_of_containerhami_container_last_kernel_elapsed_seconds是
MigInfohami_mig_device_info是
vGPU_device_memory_context_size_byteshami_vgpu_memory_context_bytes否
vGPU_device_memory_module_size_byteshami_vgpu_memory_module_bytes否
vGPU_device_memory_buffer_size_byteshami_vgpu_memory_buffer_bytes否

新指标还采用以下标签名称;应同时修改查询中的筛选、分组和关联条件。

原标签新标签
nodeid、nodenamenode
deviceuuid、deviceidx、devicetypedevice_uuid、device_index、device_type
devicecores、sharedcontainers、devicememorylimitdevice_cores、shared_containers、device_memory_limit
podnamespace、quotanamespacenamespace
podname、ctrname、containeridxpod、container、container_index
quotaName、mignamequota_name、mig_name
vdeviceid、instanceidvdevice_index、instance_id
显存描述中的 context、module、datacontext_size、module_size、buffer_size

GPUDeviceSharedNum 的兼容输出也新增了 devicetype 标签。企业版 vGPULicenseRemains 仍保留原名称及标签。

不能仅根据 _ratio 后缀统一调整阈值:hami_host_gpu_utilization_ratio 仍输出 0–100 的利用率,算力限制和分配指标沿用各设备后端的原数值,常规 NVIDIA 整卡为 100;hami_node_gpu_memory_allocated_ratio 则是已分配显存除以总显存。显存分项统计应使用独立的 hami_vgpu_memory_*_bytes 指标,不依赖显存描述中的数值标签。

显存自动扩容​

使用该能力的普通业务容器需在工作负载模板中直接声明以下环境变量,并通过正常滚动更新或重建容器使其生效:

env:
- name: CUDA_MEMORY_AUTO_ADJUST
value: "true"

本版检查 Pod 中直接声明的字符串值。通过 valueFrom 或 envFrom 间接提供该变量,不满足此处启用条件。扩容受可分配显存约束,不代表节点自动扩容,也不保证消除 CUDA 显存不足。

Ascend 配置迁移与软切分条件​

由 Chart 默认生成的设备配置会自动采用新结构。自行提供 Chart 内 files/device-config.yaml 的部署需将原 vnpus 列表移至 vnpus.configs,并保留各芯片原有配置;该自定义文件完整替换默认设备配置,不逐项合并。

vnpus:
hamiVnpuCore: false
configs: [] # 将原 vnpus 列表中的完整芯片配置移到这里

使用软切分时,需配套 Ascend 设备插件、运行时和 HAMi-vNPU-core。通过 devices.ascend.hamiVnpuCore: true 声明节点默认支持该模式;节点注解 hami-vnpu-core 优先于这个默认值,只有字符串 "true" 表示开启。工作负载还需设置 Pod 注解 huawei.com/vnpu-mode: hami-core,并使用对应的 huawei.com/<设备类型>-core 算力资源;例如值 40 表示 40%。启用软切分的节点会拒绝传统 vNPU 模式的部分显存请求;混合部署需通过节点注解区分模式,避免将仍承载传统模式任务的节点统一切换。

devices.ascend.runtimeClassName 只在 Pod 尚未指定 RuntimeClass 时补入。容器需具备 bash、配套运行库和 /hami-vnpu-core/limiter。已有 postStart 钩子不会自动合并限制进程的启动命令,需在原钩子中安排 /hami-vnpu-core/limiter 的后台启动。上述调度配置不能替代配套设备插件和运行时的安装。

AMD 与 PPU 集成​

AMD 插件需上报 hami.io/node-amd-register,仅设置 Node capacity 不再足以供本版识别设备。显存资源名由 amd.com/gpu-memory 调整为 amd.com/gpumem;对接分配信息的平台还需适配设备类型标识由 AMDGPU 改为 amd。

在容器 resources.limits 中,amd.com/gpumem 以 MiB 为单位,amd.com/gpucores: 40 表示请求设备上报总算力的 40%。未指定显存或显存值非正数时,按整卡显存预留;此时若也未指定算力,则同时预留整卡算力。

请求 AMD 算力份额时,将默认列表未包含的 amd.com/gpucores 加入 Helm values:

devices:
amd:
customresources:
- amd.com/gpu
- amd.com/gpumem
- amd.com/gpucores

本版默认 Chart 的调度 managedResources 未包含此前的 PPU 映射,devices.alibaba.enabled: true 也不会补齐这些条目。已有 PPU 部署需在所用 Chart 或自定义调度配置的 extenders[].managedResources 中补齐并保留 alibaba.com/ppu、alibaba.com/ppu-memory、alibaba.com/gpu-core 及各项 ignoredByScheduler: true,再替换现有配置;不要直接用本版默认配置覆盖正在使用的 PPU 资源映射。

与开源基线的健康检查差异​

本版本尚未纳入开源 HAMi v2.9.0 的 #1879。对采用共享健康检查的 Ascend 等设备,注册握手处于 Requesting 状态且其时间戳超过 60 秒时,仍可能导致设备缓存被清理,影响新任务调度,即使 Kubernetes 仍报告该设备有可分配资源。排查时需同时检查设备插件注册和调度器设备状态,不能仅根据 Node 的资源数量判断注册正常。

初始化容器限制​

本版补充了初始化容器请求解析和分配索引处理,但 GPU 准入注入、企业版 Downward API 和监控链路仍不完整。包含 GPU 初始化容器的工作负载不能据此视为已获得完整支持;显存自动扩容也只处理普通业务容器。

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

Values 说明​

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

展开参数表

Global Configuration

ParameterDescriptionDefault Value
global.imageRegistryGlobal Docker image registry""
global.imagePullSecretsGlobal Docker image pull secrets[]
global.imageTagImage tag"v2.8.0"
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", ...]