Skip to main content

HAMi Enterprise 2.9.0-r3

Chart versionDeclared appVersionEnterprise release dateChart package date
2.9.0-r32.9.0-r32026-06-262026-06-29

This is a patch release. Changes below are compared with HAMi Enterprise v2.9.0-rc2. The package is hami-enterprise-2.9.0-r3.tgz.

Software changes​

  • Fix NVIDIA runtime-library mount order. Mount the container cache directory before libvgpu.so to prevent the directory mount from hiding the library file and causing preload failure.
  • Set the shared cache environment variable for the Downward API path. When device configuration sets nvidia.useDownward: true, inject CUDA_DEVICE_MEMORY_SHARED_CACHE into GPU workload containers. Its value identifies the cache file by Pod namespace, Pod name, and container name. The Chart's device configuration enables the Downward API path by default.
  • Add NVIDIA device-allocation annotations to init containers. The annotation phase no longer skips init containers; regular containers continue to be matched after accounting for the number of init containers. This describes an annotation fix only. The webhook still iterates over regular containers, so this does not mean that the complete GPU workflow for init containers is supported.
  • Fix the scheduler using stale license state after an update. License validity and expiration changes are now reflected in scheduler state even when node device registration information has not changed.
  • Add Kubernetes events related to licensing. Events associated with the license Secret can show license loading failures, expiration, or invalidity, helping diagnose why devices are unavailable for allocation.

Chart changes​

Scheduler name and component labels​

The default schedulerName is restored from hami-enterprise-scheduler to hami-scheduler. The Chart is still named hami-enterprise; this does not mean Kubernetes resource object names also revert to their previous values.

Label2.9.0-rc22.9.0-r3
Scheduler app.kubernetes.io/componenthami-enterprise-schedulerhami-scheduler
Device plugin app.kubernetes.io/componenthami-enterprise-device-pluginhami-device-plugin
app.kubernetes.io/name for both componentsDefaults to hami-enterpriseFixed to hami
app.kubernetes.io/instance for both componentsHelm release nameFixed to hami

Component selectors use these fixed labels. Scripts that select components by Helm release name must be updated; in particular, do not assume that app.kubernetes.io/instance matches the actual release name.

Custom values validation​

Fixes the 2.9.0-rc2 issue that restricted the following settings to null; they now accept their respective types and defaults:

SettingTypeDefault
devicePlugin.nvidiaDriverRoot, devicePlugin.nvidiaHookPathString""
devicePlugin.gdrcopyEnabled, devicePlugin.gdsEnabled, devicePlugin.mofedEnabledBooleanfalse
scheduler.admissionWebhook.whitelistNamespacesList[]
scheduler.admissionWebhook.namespaceSelector.matchLabelsMap{}

Driver paths, GDRCopy, GDS, OFED, and namespace filtering were already supported; this release fixes their type validation and template conditions. A boolean set to false does not inject the corresponding enablement environment variable, and an empty driver path does not render a mount for that driver directory.

The default global.imageTag is updated to v2.9.0-r3. The default repositories for the scheduler extender, NVIDIA device plugin, and monitor container remain ghcr.io/dynamia-ai/hami-enterprise.

Upgrade notes​

When upgrading from 2.9.0-rc2, account for selector changes on the scheduler Deployment and device-plugin DaemonSet. Kubernetes does not allow in-place changes to .spec.selector on these resources. With default values, resource names are unchanged, but their selectors have changed; a direct in-place upgrade will fail because the field is immutable.

Before upgrading, save the current values and resource manifests. Render the target Chart with the actual release name, namespace, and custom values, then identify the affected resource names. Schedule recreation of both resources during a maintenance window and apply the new Chart. Then check scheduler readiness, device-plugin registration, and allocation for newly created GPU workloads. Do not recreate only the Deployment and overlook the DaemonSet, or apply deletion commands with fixed names before verifying the actual names.

Also check these integrations:

  • Scheduler name: Update workload templates that explicitly use hami-enterprise-scheduler to use hami-scheduler, or explicitly retain the old name through the Chart's schedulerName so both sides match.
  • Label selectors: Update custom monitoring, inspection, and Service selectors to use the target labels in the table. For multiple installations, distinguish instances by their actual namespaces and resource names as well.
  • Custom values: Migrate old null values to the types in the table, and ensure that boolean switches are set to true where required. Validate merged values before installation so reusing old values does not cause validation or rendering surprises.
  • Device-bound licenses: This release changes the requirements for device-bound licenses. Before upgrading, deployments using this license type should confirm with the delivery provider and prepare a license file compatible with the target version to avoid devices becoming unavailable for new workload allocation.
  • NVIDIA workloads: The shared-cache environment variable and mount fixes apply to newly created containers. Existing containers are not reinjected automatically when management components are upgraded.

Obtain the package and license files through the agreed delivery channel. See the Chart and appVersion mapping or the software center.

Values reference​

The following parameter descriptions are taken from the README bundled with the Chart 2.9.0-r3 release package and are preserved as published. Use this version's values.yaml as the source of default configuration.

Expand values table
KeyTypeDefaultDescription
dcuResourceCoresstring"hygon.com/dcucores"Hygon DCU cores resource name
dcuResourceMemstring"hygon.com/dcumem"Hygon DCU memory resource name
dcuResourceNamestring"hygon.com/dcunum"Hygon DCU resource name
devicePlugin.createRuntimeClassboolfalseWhether to create runtime class
devicePlugin.deviceCoreScalingint1Device core scaling factor
devicePlugin.deviceListStrategystring"envvar"Device list strategy. Supported values: envvar, volume-mounts
devicePlugin.deviceMemoryScalingint1Device memory scaling factor
devicePlugin.deviceSplitCountint10Number of slices to split each GPU into
devicePlugin.disablecorelimitstring"false"Disable core limit
devicePlugin.enabledbooltrueEnable device plugin
devicePlugin.extraArgslist["-v=4"]Extra arguments for device plugin
devicePlugin.extraEnvsobject{}Extra environment variables for device plugin
devicePlugin.gdrcopyEnabledboolfalseEnable GDRCopy
devicePlugin.gdsEnabledboolfalseEnable GDS
devicePlugin.gpuOperatorToolkitReady.enabledboolfalseEnable GPU operator toolkit ready check
devicePlugin.gpuOperatorToolkitReady.hostPathstring"/run/nvidia/validations"Host path for GPU operator toolkit ready check
devicePlugin.image.pullPolicystring"IfNotPresent"Device plugin image pull policy
devicePlugin.image.pullSecretslist[]Specify docker-registry secret names as an array
devicePlugin.image.registrystring"ghcr.io"Device plugin image registry
devicePlugin.image.repositorystring"dynamia-ai/hami-enterprise"Device plugin image repository
devicePlugin.image.tagstring""Device plugin image tag (immutable tags are recommended)
devicePlugin.libPathstring"/usr/local/vgpu"Library path for vGPU
devicePlugin.migStrategystring"none"MIG strategy. Supported values: none, single, mixed
devicePlugin.mofedEnabledboolfalseEnable Mellanox OFED
devicePlugin.monitor.ctrPathstring"/usr/local/vgpu/containers"Container path for monitor
devicePlugin.monitor.extraArgslist["-v=4"]Extra arguments for monitor
devicePlugin.monitor.extraEnvsobject{}Extra environment variables for monitor
devicePlugin.monitor.image.pullPolicystring"IfNotPresent"Monitor image pull policy
devicePlugin.monitor.image.pullSecretslist[]Specify docker-registry secret names as an array
devicePlugin.monitor.image.registrystring"ghcr.io"Monitor image registry
devicePlugin.monitor.image.repositorystring"dynamia-ai/hami-enterprise"Monitor image repository
devicePlugin.monitor.image.tagstring""Monitor image tag (immutable tags are recommended)
devicePlugin.monitor.resourcesobject{}Resources for monitor container
devicePlugin.monitor.resyncIntervalstring"5m"Resync interval for monitor
devicePlugin.nodeConfiguration.configstring"{\n \"nodeconfig\": [\n {\n \"name\": \"your-node-name\",\n \"operatingmode\": \"hami-core\",\n \"devicememoryscaling\": 1,\n \"devicesplitcount\": 10,\n \"preconfigureddevicememory\": 0,\n \"migstrategy\": \"none\",\n \"filterdevices\": {\n \"uuid\": [],\n \"index\": []\n },\n \"enablegetpreferredallocation\": false\n }\n ]\n}\n"Node configuration for device plugin. If set, overrides the default config.json
devicePlugin.nodeConfiguration.externalConfigNamestring""Name of an existing ConfigMap to use for node configuration
devicePlugin.nvidiaDriverRootstring""Root path for NVIDIA driver
devicePlugin.nvidiaHookPathstring""Path for NVIDIA hook
devicePlugin.nvidiaNodeSelectorobject{"gpu":"on"}Node selector for NVIDIA device plugin
devicePlugin.passDeviceSpecsEnabledboolfalseEnable passing device specs
devicePlugin.pluginPathstring"/var/lib/kubelet/device-plugins"Path for device plugin socket
devicePlugin.podAnnotationsobject{}Annotations for device plugin pod
devicePlugin.preConfiguredDeviceMemoryint0Pre-configured device memory in MB for GPUs that don't support memory query. Set to 0 for auto-detection
devicePlugin.resourcesobject{}Resources for device plugin container
devicePlugin.runtimeClassNamestring""Runtime class name to be used by the device plugin
devicePlugin.service.annotationsobject{}Annotations for device plugin service
devicePlugin.service.httpPortint31992HTTP port for device plugin service
devicePlugin.service.labelsobject{}Labels for device plugin service
devicePlugin.service.typestring"NodePort"Service type for device plugin
devicePlugin.tolerationslist[]Tolerations for device plugin pod
devicePlugin.updateStrategy.rollingUpdate.maxUnavailableint1Maximum unavailable pods during update
devicePlugin.updateStrategy.typestring"RollingUpdate"Update strategy for device plugin DaemonSet
devices.alibaba.customresourceslist["alibaba.com/ppu","alibaba.com/ppu-memory","alibaba.com/gpu-core"]Custom resource definitions for Alibaba devices
devices.alibaba.enabledbooltrueEnable Alibaba PPU device
devices.alibaba.ppuCorePolicystring"default"PPU core policy for Alibaba devices
devices.amd.customresourceslist["amd.com/gpu","amd.com/gpumem"]Custom resource definitions for AMD devices
devices.ascend.customresourceslist["huawei.com/Ascend910A","huawei.com/Ascend910A-memory","huawei.com/Ascend910A-core","huawei.com/Ascend910B2","huawei.com/Ascend910B2-memory","huawei.com/Ascend910B2-core","huawei.com/Ascend910B3","huawei.com/Ascend910B3-memory","huawei.com/Ascend910B3-core","huawei.com/Ascend910B4","huawei.com/Ascend910B4-memory","huawei.com/Ascend910B4-core","huawei.com/Ascend910B4-1","huawei.com/Ascend910B4-1-memory","huawei.com/Ascend910B4-1-core","huawei.com/Ascend310P","huawei.com/Ascend310P-memory","huawei.com/Ascend310P-core","huawei.com/Ascend910C","huawei.com/Ascend910C-memory","huawei.com/Ascend910C-core"]Custom resource definitions for Ascend devices
devices.ascend.enabledboolfalseEnable Ascend device plugin
devices.ascend.extraArgslist[]Extra arguments for Ascend device plugin
devices.ascend.hamiVnpuCoreboolfalseEnable soft-partitioning based on hami-vnpu-core (node-level annotation takes higher priority)
devices.ascend.imagestring""Ascend device plugin image
devices.ascend.imagePullPolicystring"IfNotPresent"Image pull policy for Ascend device plugin
devices.ascend.nodeSelectorobject{"ascend":"on"}Node selector for Ascend device plugin
devices.ascend.runtimeClassNamestring""Runtime class name for Ascend NPU pods
devices.ascend.tolerationslist[]Tolerations for Ascend device plugin
devices.awsneuron.customresourceslist["aws.amazon.com/neuron","aws.amazon.com/neuroncore"]Custom resource definitions for AWS Neuron devices
devices.enflame.customresourceslist["enflame.com/vgcu","enflame.com/vgcu-percentage","enflame.com/gcu"]Custom resource definitions for Enflame devices
devices.enflame.enabledbooltrueEnable Enflame device plugin
devices.iluvatar.customresourceslist["iluvatar.ai/BI-V100-vgpu","iluvatar.ai/BI-V100.vCore","iluvatar.ai/BI-V100.vMem","iluvatar.ai/BI-V150-vgpu","iluvatar.ai/BI-V150.vCore","iluvatar.ai/BI-V150.vMem","iluvatar.ai/MR-V100-vgpu","iluvatar.ai/MR-V100.vCore","iluvatar.ai/MR-V100.vMem","iluvatar.ai/MR-V50-vgpu","iluvatar.ai/MR-V50.vCore","iluvatar.ai/MR-V50.vMem"]Custom resource definitions for Iluvatar devices
devices.iluvatar.enabledboolfalseEnable Iluvatar device plugin
devices.kunlun.customresourceslist["kunlunxin.com/xpu","kunlunxin.com/vxpu","kunlunxin.com/vxpu-memory"]Custom resource definitions for Kunlun devices
devices.kunlun.enabledbooltrueEnable Kunlun device plugin
devices.mthreads.customresourceslist["mthreads.com/vgpu"]Custom resource definitions for MThreads devices
devices.mthreads.enabledbooltrueEnable MThreads device plugin
devices.nvidia.gpuCorePolicystring"default"GPU core policy for NVIDIA devices
devices.nvidia.libCudaLogLevelint2libCUDA log level
devices.vastai.customresourceslist["vastaitech.com/va"]Custom resource definitions for Vastai devices
devices.vastai.enabledbooltrueEnable Vastai device plugin
dra.enabledboolfalseEnable DRA (Dynamic Resource Allocation)
enflameResourceNameVGCUstring"enflame.com/vgcu"Enflame VGCU resource name
enflameResourceNameVGCUPercentagestring"enflame.com/vgcu-percentage"Enflame VGCU percentage resource name
fullnameOverridestring""Override the fullname of the chart
global.annotationsobject{}Global annotations to add to all resources
global.gpuHookPathstring"/usr/local"Path for GPU hook installation on nodes
global.imagePullSecretslist[]Global Docker image pull secrets
global.imageRegistrystring""Global Docker image registry
global.imageTagstring"v2.9.0-r3"Global image tag for HAMi Enterprise components
global.labelsobject{}Global labels to add to all resources
global.managedNodeSelectorobject{"usage":"gpu"}Node selector configuration for managed GPU nodes
global.managedNodeSelectorEnableboolfalseEnable managed node selector for GPU nodes
hami-dra.drivers.nvidia.containerDriverbooltrueEnable container driver for NVIDIA DRA
hami-dra.drivers.nvidia.enabledbooltrueEnable NVIDIA DRA driver
hami-dra.drivers.nvidia.image.repositorystring"ghcr.io/project-hami/k8s-dra-driver"NVIDIA DRA driver image repository
hami-dra.drivers.nvidia.image.tagstring"main"NVIDIA DRA driver image tag
hami-dra.monitor.enabledbooltrueEnable monitor for hami-dra
kunlunResourceNamestring"kunlunxin.com/xpu"Kunlun XPU resource name
kunlunResourceVCountNamestring"kunlunxin.com/vxpu"Kunlun virtual XPU count resource name
kunlunResourceVMemoryNamestring"kunlunxin.com/vxpu-memory"Kunlun virtual XPU memory resource name
legacyMetricsboolfalseEnable legacy metrics
metaxResourceCorestring"metax-tech.com/vcore"Metax sGPU core resource name
metaxResourceMemstring"metax-tech.com/vmemory"Metax sGPU memory resource name
metaxResourceNamestring"metax-tech.com/sgpu"Metax sGPU resource name
metaxsGPUTopologyAwarestring"false"Enable Metax sGPU topology awareness
mluResourceCoresstring"cambricon.com/mlu.smlu.vcore"MLU cores resource name
mluResourceMemstring"cambricon.com/mlu.smlu.vmemory"MLU memory resource name
mluResourceNamestring"cambricon.com/vmlu"MLU resource name
mockDevicePlugin.enabledboolfalseEnable mock device plugin
mockDevicePlugin.image.pullPolicystring"IfNotPresent"Mock device plugin image pull policy
mockDevicePlugin.image.pullSecretslist[]Specify docker-registry secret names as an array
mockDevicePlugin.image.registrystring"docker.io"Mock device plugin image registry
mockDevicePlugin.image.repositorystring"projecthami/mock-device-plugin"Mock device plugin image repository
mockDevicePlugin.image.tagstring"1.0.1"Mock device plugin image tag
nameOverridestring""Override the chart name
namespaceOverridestring""Override the namespace
podSecurityPolicy.enabledboolfalseEnable PodSecurityPolicy
prometheus.enabledboolfalseEnable Prometheus metrics
resourceCoresstring"nvidia.com/gpucores"NVIDIA GPU cores resource name
resourceMemstring"nvidia.com/gpumem"NVIDIA GPU memory resource name
resourceMemPercentagestring"nvidia.com/gpumem-percentage"NVIDIA GPU memory percentage resource name
resourceNamestring"nvidia.com/gpu"NVIDIA GPU resource name
resourcePrioritystring"nvidia.com/priority"NVIDIA GPU priority resource name
scheduler.admissionWebhook.customURL.enabledboolfalseEnable custom webhook URL
scheduler.admissionWebhook.customURL.hoststring"127.0.0.1"Webhook host (must be an endpoint using https)
scheduler.admissionWebhook.customURL.pathstring"/webhook"Webhook path
scheduler.admissionWebhook.customURL.portint31998Webhook port
scheduler.admissionWebhook.enabledbooltrueEnable admission webhook. If disabled, pods must be configured with correct schedulerName manually
scheduler.admissionWebhook.failurePolicystring"Ignore"Failure policy for webhook
scheduler.admissionWebhook.namespaceSelectorobject{"matchExpressions":[],"matchLabels":{}}Namespace selector for webhook
scheduler.admissionWebhook.objectSelectorobject{"matchExpressions":[]}Object selector for webhook
scheduler.admissionWebhook.reinvocationPolicystring"Never"Reinvocation policy for webhook
scheduler.admissionWebhook.whitelistNamespaceslist[]Namespaces that the webhook will not be applied to
scheduler.certManager.enabledboolfalseEnable cert-manager for TLS certificate generation
scheduler.defaultSchedulerPolicy.gpuSchedulerPolicystring"spread"GPU-level scheduling policy. Supported values: binpack, spread
scheduler.defaultSchedulerPolicy.nodeSchedulerPolicystring"binpack"Node-level scheduling policy. Supported values: binpack, spread
scheduler.extender.extraArgslist["--debug","-v=4"]Extra arguments for scheduler extender
scheduler.extender.image.pullPolicystring"IfNotPresent"Scheduler extender image pull policy
scheduler.extender.image.pullSecretslist[]Specify docker-registry secret names as an array
scheduler.extender.image.registrystring"ghcr.io"Scheduler extender image registry
scheduler.extender.image.repositorystring"dynamia-ai/hami-enterprise"Scheduler extender image repository
scheduler.extender.image.tagstring""Scheduler extender image tag (immutable tags are recommended)
scheduler.extender.resourcesobject{}Resources for scheduler extender container
scheduler.forceOverwriteDefaultSchedulerbooltrueForce overwrite the default scheduler name in pods when it equals the K8s default scheduler name
scheduler.kubeScheduler.enabledbooltrueWhether to run kube-scheduler container in the scheduler pod
scheduler.kubeScheduler.extraArgslist["--policy-config-file=/config/config.json","-v=4"]Extra arguments for kube-scheduler (legacy config format)
scheduler.kubeScheduler.extraNewArgslist["--config=/config/config.yaml","-v=4"]Extra arguments for kube-scheduler (new config format)
scheduler.kubeScheduler.image.pullPolicystring"IfNotPresent"kube-scheduler image pull policy
scheduler.kubeScheduler.image.pullSecretslist[]Specify docker-registry secret names as an array
scheduler.kubeScheduler.image.registrystring"registry.cn-hangzhou.aliyuncs.com"kube-scheduler image registry
scheduler.kubeScheduler.image.repositorystring"google_containers/kube-scheduler"kube-scheduler image repository
scheduler.kubeScheduler.image.tagstring""kube-scheduler image tag (immutable tags are recommended)
scheduler.kubeScheduler.resourcesobject{}Resources for kube-scheduler container
scheduler.leaderElectbooltrueEnable leader election for scheduler
scheduler.livenessProbeboolfalseEnable liveness probe for scheduler
scheduler.metricsBindAddressstring":9395"Address to bind metrics server
scheduler.nodeLockExpirestring"5m"Node lock expiration time
scheduler.nodeNamestring""Node name for scheduler pod. If installing as default scheduler, set this to skip the schedule workflow
scheduler.overwriteEnvstring"false"Overwrite environment variables
scheduler.patch.enabledbooltrueEnable kube-webhook-certgen patch job
scheduler.patch.image.pullPolicystring"IfNotPresent"kube-webhook-certgen image pull policy
scheduler.patch.image.pullSecretslist[]Specify docker-registry secret names as an array
scheduler.patch.image.registrystring"docker.io"kube-webhook-certgen image registry
scheduler.patch.image.repositorystring"jettech/kube-webhook-certgen"kube-webhook-certgen image repository
scheduler.patch.image.tagstring"v1.5.2"kube-webhook-certgen image tag
scheduler.patch.imageNew.pullPolicystring"IfNotPresent"New kube-webhook-certgen image pull policy
scheduler.patch.imageNew.pullSecretslist[]Specify docker-registry secret names as an array
scheduler.patch.imageNew.registrystring"docker.io"New kube-webhook-certgen image registry
scheduler.patch.imageNew.repositorystring"liangjw/kube-webhook-certgen"New kube-webhook-certgen image repository
scheduler.patch.imageNew.tagstring"v1.1.1"New kube-webhook-certgen image tag
scheduler.patch.nodeSelectorobject{}Node selector for patch job
scheduler.patch.podAnnotationsobject{}Annotations for patch job pod
scheduler.patch.priorityClassNamestring""Priority class name for patch job
scheduler.patch.runAsUserint2000User ID to run patch job as
scheduler.patch.tolerationslist[]Tolerations for patch job
scheduler.podAnnotationsobject{}Annotations for scheduler pod
scheduler.replicasint1Number of scheduler replicas (only effective when leaderElect is true)
scheduler.service.annotationsobject{}Annotations for scheduler service
scheduler.service.httpPortint443HTTP port for scheduler service
scheduler.service.httpTargetPortint443Target port for HTTP
scheduler.service.labelsobject{}Labels for scheduler service
scheduler.service.monitorPortint31993Monitoring port for scheduler service
scheduler.service.monitorTargetPortint9395Target port for monitoring
scheduler.service.schedulerPortint31998NodePort for scheduler HTTP
scheduler.service.typestring"NodePort"Service type for scheduler
scheduler.tolerationslist[]Tolerations for scheduler pod
schedulerNamestring"hami-scheduler"Name of the scheduler
vastaiResourceNamestring"vastaitech.com/va"Vastai resource name