Skip to main content

HAMi Enterprise 2.8.0-rc0

Chart versionDeclared appVersionRelease date
2.8.0-rc02.8.0-rc02026-03-09

This is a pre-release. This page uses HAMi Enterprise v2.7.1-rc0 as the upgrade baseline and describes Enterprise extensions relative to open-source HAMi v2.8.0.

Software changes​

Upgrade changes and upstream synchronization​

This release synchronizes the following upstream changes while retaining Enterprise device allocation, runtime memory adjustment, and license management capabilities.

ChangeImpact on usage and integrationUpstream PR
Scheduler leader-follower coordinationThe HAMi scheduler extender follows the kube-scheduler leader in the same Pod. Only the leader registers node devices and passes its readiness probe. After taking over leadership, an instance synchronizes device state before handling scheduling filter requests. See below for multi-replica configuration and readiness behavior.HAMi #1553
Webhook certificate hot reloadWatches for changes to mounted TLS certificates and private keys and loads updated certificates, reducing the need to restart the scheduler during certificate rotation. Webhook calls may still fail while files are being propagated or loaded.HAMi #1573
NVIDIA multi-container quota fixWhen checking subsequent GPU containers in the same Pod, the scheduler now includes memory and compute requests from earlier containers. For example, if a namespace has 2000 MiB of memory quota remaining, two containers requesting 1024 MiB each can no longer both pass separate quota checks.HAMi #1579
Clear metrics after node deletionRemoves device and usage records when a node is deleted, so the scheduler no longer emits stale metrics for that node. Historical samples already retained by the monitoring system are unaffected.HAMi #1597
Build-info metric and version outputThe scheduler and vGPU monitor add hami_build_info, whose value is always 1. Build information is exposed through the version, revision, build_date, go_version, compiler, and platform labels. The version command also switches to multi-field output.HAMi #1581
Kunlunxin vXPU memory checkChecks whether a requested memory amount exceeds the device's available capacity even when no other task has allocated the device, preventing an oversized request from passing the initial allocation check.HAMi #1569
Optional DRA monitoringThe companion HAMi-DRA subchart is updated to 0.1.0 and includes a monitoring component. The regular device-plugin deployment remains the default path.HAMi #1580
Mock device-plugin updateThe default image version for the optional mock device plugin changes from 0.1.0 to 1.0.1, affecting validation environments where the plugin is enabled.HAMi #1570

Enterprise NVIDIA allocation annotations also add checks for empty allocation lists and out-of-range container indexes to avoid accessing nonexistent devices or containers.

Enterprise extensions compared with open-source HAMi v2.8.0​

The following capabilities already existed in Enterprise v2.7.1-rc0 for the regular NVIDIA device-plugin path and continue to be available in this release.

  • Pass device-allocation results through the Downward API: Pass GPU UUIDs, memory, and compute limits from Pod annotations into the corresponding containers. The NVIDIA allocation path can therefore avoid relying on a node lock to find the Pod awaiting allocation. nvidia.useDownward is true in the default device configuration; it is not a new installation parameter in this release.
  • Adjust memory limits for running workloads: The monitor can submit memory-adjustment requests reported by the runtime to the scheduler. The scheduler checks remaining device capacity, updates allocation records and quota usage, and the monitor then synchronizes the approved memory limit to the runtime. This requires the companion Enterprise runtime and monitor; it does not modify the Pod's resources.limits.
  • Device license management: Device license state is included in NVIDIA scheduling decisions. The scheduler exposes remaining license time in seconds through vGPULicenseRemains, which can be used to configure expiration alerts. Obtain and renew licenses through the agreed delivery process.
  • Container memory-detail metrics: In addition to total memory usage and limits, Enterprise monitoring exposes hami_container_device_memory_context_bytes, hami_container_device_memory_data_bytes, hami_container_device_memory_module_bytes, and hami_container_device_memory_offset_bytes for context, data, module, and offset usage, respectively. Values are in bytes and represent current values; use Gauge semantics.

Chart changes​

  • The main Chart and appVersion are both 2.8.0-rc0; the default application image tag changes to v2.8.0-rc0. Deployments that override image tags explicitly should verify the version of each component.
  • scheduler.leaderElect remains true by default and scheduler.replicas remains 1. This release connects the elected-leader state to the HAMi scheduler extender, adds a /readyz probe and list/watch permissions for Leases, and requires scheduler Pods to be spread across nodes by kubernetes.io/hostname. When leader election is disabled, the Chart fixes the scheduler replica count at one.
  • dra.enabled remains false by default. The optional hami-dra subchart is updated from 0.0.1 to 0.1.0 and adds hami-dra.monitor.enabled: true. This monitoring switch only applies when the DRA path is enabled. Enabling DRA switches deployment paths and does not deploy the regular scheduler and NVIDIA device plugin from the main Chart.
  • mockDevicePlugin.enabled remains false by default. When enabled, it uses mockDevicePlugin.image.tag: "1.0.1".

Upgrade notes​

Check scheduler replicas and readiness​

The default single-replica deployment does not become multi-replica automatically during an upgrade. To deploy a leader and follower, use the following values and ensure at least two nodes satisfy the node selector:

scheduler:
leaderElect: true
replicas: 2

With leader election enabled, scheduler Pods must run on different nodes. A single-node deployment or rolling update may not have enough available nodes, leaving a new replica in Pending. Before upgrading, reserve schedulable capacity for the new replica or adjust leader-election settings for the deployment. The anti-affinity rule matches the hami-scheduler component label in the same namespace; also check node placement of other installations.

The follower's /readyz returns 503; only the leader returns 200 and is included in the Service's ready endpoints. Deployment automation and alerts should use the Lease holder and leader endpoint to determine availability rather than requiring every leader/follower replica to be ready. If you manage RBAC yourself, add list and watch permissions for Leases to the scheduler.

If you disable the bundled kube-scheduler and connect an independently deployed scheduler, do not reuse the leader-election settings above without adjustment. The extender matches the Lease holder against its own hostname; a separate scheduler usually does not meet this condition, leaving the extender unready and preventing device registration. For a single-extender deployment, use the following values and retain the external scheduler integration settings:

scheduler:
kubeScheduler:
enabled: false
leaderElect: false
livenessProbe: false

This combination disables the bundled liveness probe, as required by this Chart's templates, and fixes the extender replica count at one. It disables the extender's dependency on the bundled scheduler's leader-election state; it does not affect leader election in the external scheduler.

Check certificate rotation and quotas​

Certificate hot reload depends on the updated certificate files being fully propagated to the mounted volume. scheduler.admissionWebhook.failurePolicy remains Ignore by default, so a failed webhook call may allow a Pod to be created without complete HAMi injection. If your deployment requires creation to be blocked when the webhook call fails, configure Fail and account for related Pod creation being blocked while the webhook is unavailable.

After upgrading, workloads that relied on the old multi-container quota calculation may fail scheduling if their total request exceeds the namespace quota. Before upgrading, check the total GPU memory and compute requests across all GPU containers in each Pod against ResourceQuota.

Preserve Enterprise device configuration and monitoring semantics​

The default device configuration sets both nvidia.useDownward and nvidia.postNvidiaSmi to true. The latter adds a postStart hook that runs nvidia-smi in containers requesting NVIDIA devices. The container image must provide that command, and verify whether an existing postStart hook would be replaced. To change these fields, edit the device configuration used by this Chart version; they are not top-level Helm parameters.

If you provide files/device-config.yaml in the Chart, it replaces the entire default device configuration rather than merging individual entries. Preserve any Enterprise fields your deployment uses. After changing the configuration, deploy the scheduler and device plugin with the updated configuration, then recreate workloads whose injected settings need to change.

Use hami_build_info to check component build information. Scripts that call scheduler version or vGPUmonitor version should parse the new multi-field output. Existing Enterprise memory-detail and license metrics remain available.

Obtain the package, companion Enterprise runtime, and license materials 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.8.0-rc0 release package and are preserved as published. Use this version's values.yaml as the source of default configuration.

Expand values table

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", ...]