HAMi v2.11.0 Release: Remote GPU Scheduling, AMD GPU Sharing, Ascend ENPU, NUMA Refit, and Flexible MIG at Scale
The HAMi community is proud to announce the official release of HAMi v2.11.0.
Highlights of this release:
- Remote GPU: run CUDA and vLLM Pods on GPU-less, driver-less client nodes, using GPUs served over the network by Lupine GPU servers.
- AMD Instinct GPU sharing: AMD GPUs (ROCm) are now first-class in HAMi, with memory limits by size or percentage, compute limits, NUMA- and XGMI-aware placement, scheduling policies and queue priorities, all enforced at the container level.
- Ascend ENPU mode: policy-based isolation (
fixed-share,elastic,best-effort) as a third partitioning mode alongside templates and hami-core, plus a majorhami-vnpu-coreperformance overhaul. - NUMA refit: kubelet's Topology Manager and HAMi's scheduler now agree, so CPU affinity and GPU placement land on the same NUMA node.
- Flexible MIG grows up: CDI injection for dynamic MIG devices, placement scoring with backtracking, and per-Pod profile preferences.
- A harder scheduler: security-audit-driven hardening of the scheduler extender and webhook, plus Filter-path performance gains.
- Platform and chart: OpenShift and SELinux support, a restructured
devices.VENDORchart, and node capacity resource reporting. - Website overhaul: reorganized information architecture, a redrawn Concepts section,
llms.txt, and restructured installation and upgrade guides.
In total, v2.11.0 merges more than 220 pull requests from over 50 contributors, including 29 first-time contributors.
This article walks through the major updates in v2.11.0.
Remote GPU: Run CUDA Anywhere
Not every node needs a GPU, and not every GPU node should run workloads. With Remote GPU (#3004, @moezdil; design from the Lupine project), HAMi now schedules Pods onto GPUs served over the network by a Lupine GPU server:
- Driver-less client nodes: the client node needs no GPU and no NVIDIA driver. HAMi places the Pod on a separate client node, delivers the Lupine client libraries plus
nvidia-smithrough an init container, and injects theLUPINE_SERVERenvironment variable pointing at the chosen server (@archlitchi). - GPU nodes become Lupine servers: a node configured with
operatingmode: remoteruns its GPUs for Lupine instead of advertising them as local devices, and is labeledhami.io/lupine-server(#3013, @moezdil). - Pool selection: Lupine servers can be grouped into pools by Node label, and a Pod can request a pool through the
hami.io/remote-serverannotation (#3195, @asadjan4611). NotReady servers are excluded from placement. - Whole-server reservation with per-GPU memory limits:
nvidia.com/remote-gpureserves an entire server (with at least the requested GPU count), while the optionalnvidia.com/remote-gpu-memorysets a per-GPU memory cap enforced by an injected HAMi-core library. Multi-container Pods are kept on a single server (@sanket-jadhav-cse). - Operational safety: Pods waiting for a Lupine fleet change are requeued instead of failing, the Lupine server ships with a configurable securityContext, and an optional session relay lets users
kubectl port-forwardto a fleet without direct rights in the server namespace. Remote mode was further hardened by @FouoF.
Enabling it takes two chart values and one node configuration:
devices:
remotegpu:
enabled: true
defaultPort: 14833
resourceCountName: "nvidia.com/remote-gpu"
resourceMemoryName: "nvidia.com/remote-gpu-memory"
devicePlugin:
nodeConfiguration:
config: |
{
"nodeconfig": [
{
"nodelabelselector": { "matchLabels": { "role": "lupine-server" } },
"operatingmode": "remote"
}
]
}
The nodelabelselector above matches a label you apply yourself; label each GPU node that should serve Lupine before (or after, followed by a device-plugin restart) enabling remote mode. The node must also match devicePlugin.nvidiaNodeSelector (gpu=on by default), or the device plugin and the Lupine server will not be scheduled on it:
kubectl label node <gpu-node> gpu=on role=lupine-server
Then a vLLM Deployment on a GPU-less node looks like any other HAMi workload (see the full remote-gpu examples):
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-remote-gpu
spec:
selector:
matchLabels:
app: vllm-remote-gpu
template:
metadata:
labels:
app: vllm-remote-gpu
spec:
containers:
- name: vllm
image: vllm/vllm-openai:v0.25.1-ubuntu2404
command: ["vllm", "serve", "Qwen/Qwen3-8B"]
resources:
limits:
memory: 32Gi
nvidia.com/remote-gpu: 2
nvidia.com/remote-gpu-memory: 20480 # 20 GiB per GPU
Current constraints worth knowing: client nodes must be separate from server nodes, supported workload images are CUDA and vLLM 0.19-0.26, and a workload reserves the entire server.
AMD Instinct GPU Sharing
HAMi now shares and schedules AMD Instinct GPUs (ROCm) on Kubernetes with the same resource model it uses for NVIDIA, and with hard limits enforced inside the container. v2.10.0 laid down the memory, core, type and UUID basics; v2.11.0 completes the feature set (largely @moezdil):
- Memory isolation: request an absolute size with
amd.com/gpumemor a share of VRAM withamd.com/gpumem-percentage(#3179). The limit is enforced by amd-hami-core, which now also capshipMalloc3D, arrays, memory pools and VMM, reports the limit as the device total, and can servehipMallocfrom managed memory whenHIP_OVERSUBSCRIBEis set. - Compute isolation:
amd.com/gpucoressets the compute-unit share throughHSA_CU_MASK, with core requests rounded up to whole WGPs on RDNA (#3174). - Flexible placement: pick or avoid GPU types and UUIDs (
amd.com/use-gputype,amd.com/use-gpu-uuidand theirnouse-counterparts), keep a multi-GPU Pod on a single NUMA node withamd.com/numa-bind(#3186) or on XGMI-linked GPUs withamd.com/link-bind, and let thetopology-awarepolicy prefer the group with the most XGMI links (#3191). - Advanced scheduling: the
binpack,spread,mutexandtopology-awarepolicies, Pod queue priorities throughAMD_TASK_PRIORITY, namespace ResourceQuota checks in Fit (#3180), quota-feasible GPU combinations in topology scheduling (#3361, @Eshiv-Pandey), defaults for GPU count, memory and cores plus device cordon (#3192), a configurableruntimeClassName(#3194), node health judged by allocatable GPUs, and a dedicated AMD e2e suite (#3193).
On the node side, amd-device-plugin v0.0.4 adds hardware compute partitions (SPX, DPX, QPX, CPX) on Instinct GPUs, per-GPU health from the AMD Device Metrics Exporter, XGMI peer reporting in the node annotation, and -device_memory_scaling for memory oversubscription. The new amd-dra-driver (v0.1.0 to v0.4.1) brings the same limits to the DRA path with per-GPU HSA_CU_MASK and HIP_DEVICE_MEMORY_LIMIT_ entries and kubelet health reporting, and HAMi-dra converts amd.com/gpu requests into claims for it. With NVIDIA and AMD behind one scheduling layer, HAMi now offers unified GPU sharing for heterogeneous clusters; see the AMD GPU guide and the verification status for what was validated on real hardware.
AMD support is a community effort: @moezdil, with the help of Claven, polished Instinct support across the scheduler, device plugin, amd-hami-core and the DRA driver. Initial device support was implemented by @FouoF on AMD instances provided by DigitalOcean, and the initial compute (SPX, DPX, QPX, CPX) and memory partition work was done by @fishman. Special thanks to Vultr for providing the AMD test machines, and to the AMD community for making this possible.
Deeper Ascend Partitioning: ENPU Mode and a Faster HAMi-core
ENPU: Policy-Based Isolation for Ascend
v2.11.0 adds a third Ascend partitioning mode: ENPU (#3110, @maverick-woo, with the companion ascend-device-plugin update). Pods annotated with huawei.com/vnpu-mode: enpu use the existing Ascend count, memory, and core resources and are placed only on ENPU-capable nodes:
- Three isolation policies:
fixed-share,elastic, andbest-effort(selected viahuawei.com/enpu-policyor the chart defaultdevices.ascend.enpuPolicy), persisted at admission so a later default change never reclassifies existing tenants. - DIE isolation: tenants with incompatible ENPU policies, and hami-core/ENPU tenants, are kept off the same physical DIE, including legacy hami-core Pods without a mode annotation. Single-DIE ENPU requests are preserved on A3-class hardware while SuperPod behavior is retained for other modes.
- No template rounding: memory and core quotas are passed through without hardware-template rounding, and
devices.ascend.deviceSplitCountnow controls the virtual-device slots per NPU for bothhami-coreandenpumodes (@spencercjh).
devices:
ascend:
enabled: true
hamiVnpuMode: "enpu" # template | hami-core | enpu
enpuPolicy: "elastic" # fixed-share | elastic | best-effort
The global mode is selected with devices.ascend.hamiVnpuMode; node capability annotations from the Ascend device plugin still take precedence. devices.ascend.enabled only turns on Ascend support in the HAMi scheduler, it does not deploy the device plugin: install ascend-device-plugin separately, using chart 0.2.0 or later for ENPU mode (0.2.x also carries the vnpus.deviceSplitCount support that devices.ascend.deviceSplitCount requires), and make sure its image bundles an ENPU runtime matching your CANN version. See the Ascend guide for prerequisites. Also new for Ascend: slot capacity is exposed in the chart for hami-core mode, and Ascend 950 support lands in this cycle: the scheduler gains Ascend950DT whole-card scheduling (#3316, @panpan0000), and ascend-device-plugin 0.2.x adds Ascend950DT discovery, node mode overrides, and unhealthy-device preservation on discovery failure.
HAMi-core (libvNPU) Performance Overhaul
Under the LFX Mentorship 2026 Term 3 umbrella, @maverick-woo rebuilt significant parts of hami-vnpu-core (with fixes from @xrwang8):
- Reduced initialization lock contention: a fork-aware per-process client, a same-stream worker read-lock fast path, and bounded scheduler turns.
- Cooperative spatial compute policy and a refillable overdraft policy for fine-grained compute and memory control.
- Per-NPU resource limits covering both cached and runtime HBM allocation paths, with ACL
HostArgseager launches accounted for.
These changes target 910C multichip slicing scenarios and make soft-partitioned Ascend meaningfully faster under concurrent inference.
NUMA Refit: When CPU and GPU Scheduling Finally Agree
Kubernetes CPU Manager and the Topology Manager make NUMA-local decisions, but they happen after HAMi's scheduler has already picked a GPU. When kubelet restricts an allocation to a GPU the scheduler did not choose, the Pod either falls back or runs misaligned. v2.11.0 closes this gap with the NUMA refit (#2731, @saiyam1814, fixes #2080):
The scheduler stays in charge: it re-runs its normal fit restricted to kubelet's allowed devices, updates both allocation annotations in one patch, and moves the in-memory reservation so runtime and accounting agree. Device pins such as nvidia.com/use-gpuuuid are honored. The feature is off by default and opt-in per Pod:
metadata:
annotations:
hami.io/numa-alignment: "strict" # or best-effort
with devicePlugin.numaRefit.enabled=true in the chart and NUMA topology enabled: devices.nvidia.enableNumaTopology=true with the default device configuration, or nvidia.enableNumaTopology: true in your custom file (or enablenumatopology: true in the matching node entry) if device-config.content or files/device-config.yaml replaces the generated configuration. The node configuration also needs operatingmode: hami-core and enablegetpreferredallocation. NUMA refit supports hami-core nodes only; MIG-mode nodes are excluded. strict fails the allocation when the refit cannot satisfy the topology constraint; best-effort keeps today's fallback.
The feature was validated on real hardware (8x NVIDIA RTX PRO 6000 Blackwell Server Edition, driver 610.43.02, Kubernetes v1.35.6, CPU Manager static, Topology Manager single-numa-node): annotated Pods received a NumaRefitSucceed event and ended with cpuset, runtime GPU, and annotations on the same NUMA node. Follow-up hardening landed within the same cycle from @asadjan4611 and @AyushSrivastava1818 (phase-aware accounting, quota validation, and caller authentication on /refit), plus an allocLock fix during Pod removal from @saiyam1814. See the NUMA alignment guide for details.
Flexible MIG Grows Up
Flexible MIG (dynamic MIG instance allocation and deallocation) shipped in v2.10.0 with known limitations: no CDI support, and unvalidated multi-device cases. v2.11.0 closes those gaps:
- CDI support for dynamic MIG devices (#3070, @asadjan4611): after HAMi creates a MIG GI/CI, it publishes an atomic per-MIG CDI spec and returns the CDI device name to CDI-capable runtimes. Startup recovery reconciles live MIG instances before the device plugin serves allocations, and allocation failures roll back both MIG and CDI resources. The v2.10.0 CDI limitation is gone.
- Placement scoring with backtracking (#2855, @maishivamhoo123): MIG placements are now scored, with a backtracking fallback when the greedy choice does not fit, and duplicate MIG candidates in topology scheduling are collapsed.
- Per-Pod profile preference (#3014, @maishivamhoo123): a Pod can name a preferred MIG profile through the
nvidia.com/mig-profile-preferenceannotation. The scheduler tries that profile first and falls back to the normal selection rules (memory request, allowlisted profiles, placement constraints) when it cannot be allocated. - Lifecycle and monitoring: the dynamic MIG instance lifecycle is optimized (#3128, @asadjan4611), MIG monitoring now covers Pods using dynamic MIG, the vGPU monitor discovers MIG instances correctly, and allocations are checked against registered profiles with the allowlist using real NVML names (contributions from @tsingst, @FouoF, @archlitchi, @moezdil, and @usr-bin-ksh).
- Reliability: all replicas and MIG slices on a GPU are marked unhealthy on XID errors, and MIG is automatically disabled on hami-core nodes to avoid conflicting lifecycle control.
@FouoF also contributed automatic nvidiaDriverRoot detection (now the default, with GPU Operator driver-ready contract support) and NVML session pairing fixes.
A Harder Scheduler
v2.11.0 lands the first wave of the security-audit-driven hardening of the scheduler extender and webhook (largely by @moezdil):
- The extender HTTP endpoints (
/filterand/bind) are served on loopback only (127.0.0.1:9444), not on the cluster-facing port. - The extender verifies Pod identity before acting on a request.
- Pods created with forged scheduler-owned allocation annotations are denied at admission and guarded on update.
- The node-lock path serves only the Pod the lock names, expired-lock recovery is serialized, and malformed device allocation annotations are rejected.
- The chart now requires Kubernetes 1.23+, guards the PSP, and pins the helper images it pulls from third parties (certgen, the Lupine client and server images, the mock device plugin) by digest; HAMi's own images keep the
v2.11.0tag.
Scheduler performance also improved: whole-Pod deep copies were removed from the usage snapshot (@togettoyou), snapshots are built only for candidate nodes with benchmark regression tracking in CI (@im-Toqeer-506), and preferred nodeAffinity is honored in node scoring (@falconlee236).
The scheduling policies introduced in v2.10.0, PodGroup-aware binding, the mutex policy, and comma-separated policy combinations, are now covered by a dedicated scheduler policy e2e suite (#2793, @haitwang-cloud), and two fixes keep them predictable: the configured policy is kept when an unrecognized policy annotation is seen (#2769, @IIITManjeet), and padded policy annotations resolve to their canonical name (#2854).
Two operability additions round this out (@im-Toqeer-506): a PodDisruptionBudget for the leader-elected multi-replica scheduler (#2773) so node drains cannot evict every replica at once, and a redacted diagnostic bundle collector (hack/hami-support-bundle.sh, #3149) that gathers versions, workloads, events, HAMi ConfigMaps, and bounded component logs for support cases without ever reading Secrets.
Platform, Chart, and More Devices
- OpenShift and SELinux support (#2208, @spencercjh):
platform.openshift=truecreates the required SCC, andselinux.enabledrelabels host directories for SELinux-enforcing clusters. - Cluster Autoscaler support (#2874, @shkatara): with
devicePlugin.reportNodeCapacity, GPU memory and core resources are reported in Nodecapacity/allocatable, so Cluster Autoscaler scale-up simulation, dashboards, and quota tooling see real GPU fractions instead of opaque device counts. - Chart overhaul (@spencercjh): all vendor configs moved under
devices.VENDORwith a complete helm-docs pass,global.imageSourceswitches between upstream and CN mirrors, and node configs can be selected by label selector (@usr-bin-ksh). This is a breaking change for customvalues.yamlfiles. - NVIDIA device plugin: an opt-in host PID broker (#2417, @iemAnshuman) hands HAMi-core each process's host PID over
SO_PEERCREDwithout mounting host procfs, and IMEX channels discovered at startup are now actually propagated into allocation responses (#2892, @Eshiv-Pandey). - More devices: all four NeuronCores on AWS Inferentia1 (@asadjan4611), model-aware scheduling restored for Cambricon MLU and a count above 1 accounted as whole MLUs (#3218, @B-White84), Mthreads S5000 per-card memory units (@wjluo), Hygon DCU resources renamed to HCU across charts and docs (@kinglong08) with the default core value updated so DTK 26.10+ shares compute like NVIDIA when no core resource is requested (#3285, @archlitchi). Vendor fixes also landed for MetaX (multi-container Pods spread over exclusive GPUs, #2837), Enflame (DRS profile core costs kept within the device budget, #2810), Kunlunxin (topology selection independent of slice order, #2811, #2924), and Iluvatar (scaled core limit read per card, #2961).
- Monitoring: whole-GPU Pods can bypass the HAMi hook and be monitored via direct NVML, and Pods with
CUDA_DISABLE_CONTROLor dynamic MIG are covered (@vesta-mlp); hardware health and error metrics are exposed (@Gurkaran18), an unknown-GPU-process counter was added (@heuristicwave), and the scheduler exposes leader-election and cache-sync metrics (@KunwarSidhu47). - Native sidecar containers are now accounted for in GPU resource calculations (@maishivamhoo123), and Pod/container-level environment overrides are supported (@peachest).
Across the Project-HAMi Ecosystem
The release cycle also moved the satellite projects that ship alongside HAMi:
- HAMi-core (libvgpu.so): the SM limiter is now charged by thread count instead of grid count, CUDA graph and
cuMemAllocAsyncallocations are tracked and released per graph lifetime, VMM mappings roll back cleanly when tracking fails,CUDA_DEVICE_MEMORY_LIMITsuffixes are parsed strictly, and the host PID detection race that could pick up another process's PID is closed, with the host PID broker client for the device-plugin feature above. - HAMi-WebUI v1.3.0:
/metricsis scrape-safe with less page-side query fan-out, init containers are decoded in Pod device annotations, task compute utilization is corrected, Pod and container names are searchable, and the chart preserves HAMi workload labels in the ServiceMonitor and scrapes the bundled kube-state-metrics. - HAMi-dra: chart 0.2.3 ships a webhook PodDisruptionBudget and hardened CEL selectors for
nouse-gpuuuid/nouse-gputype; main since then adds AMD support (drivers.amd,amd.com/gpuclaim conversion,gpumem-percentage), ahami.io/skip-draopt-out, and monitor metric labels aligned with HAMi and Prometheus conventions. - k8s-dra-driver v0.1.1: a vGPU monitor for the DRA path, legacy claim-directory cleanup, and a missing PCIe-root fix, plus GPU-less e2e on kind with Mokka. ascend-dra-driver chart 0.2.0 exposes
/metricsfrom an internal collector aligned with claim Prepare/Unprepare, adds a DeviceClass for the HAMi vNPU-core mode, and reports real UUIDs in ResourceSlices. - volcano-vgpu-device-plugin v1.13.0: health state is retained across kubelet stream reconnects, allocation state and device annotations are validated,
WatchAndRegisterstops cleanly with the plugin, and HAMi-core is updated to the latest build. - gpu-descheduler v0.0.2: a new project that defragments scattered vGPU workloads across nodes through a mutating webhook and Placement CRDs; this cycle adds multi-arch builds and uses HAMi's AMD
use-gpuuuidannotation key. kai-resource-isolator gained a webhook PodDisruptionBudget with anti-affinity for multi-replica installs and chart input validation.
A Reorganized, Redrawn Website
Alongside the code release, project-hami.io went through its largest reorganization since launch:
- New information architecture (@moezdil): the docs sidebar is now grouped into a guided path, the devices matrix became the single vendor index (replacing per-category listings), and every vendor guide got its own sidebar. All in-repo HAMi documentation was consolidated into the website, and the internal design documents were ported into a public Developer section, with a Chinese translation following. Four legacy internal-only pages were removed along the way.
- A redrawn Concepts section (@togettoyou): the old Introduction pages were replaced by a Concepts category that explains device plugins and DRA background, rewrites the Architecture page around the journey of a Pod, and covers the device-sharing resource model and how HAMi-core isolates memory and compute, all illustrated with newly drawn SVG diagrams. A diagram brand guide with dark-mode tokens and Mermaid styling keeps every new diagram visually consistent.
llms.txtfor LLM-friendly documentation (@spencercjh): the site now publishesllms.txt, making the full documentation set efficiently consumable by coding agents and LLM tooling.- Restructured installation and upgrade guides: a dedicated Upgrade guide was rebuilt around a step-by-step flow with breaking-change callouts, the offline installation instructions were refactored (@spencercjh), the user-guide configuration pages were reorganized, and the NVIDIA guide gained a matrix showing exactly which setup supports each feature.
- Platform installation guides: new step-by-step guides for OpenShift, GKE, and K3s by @spencercjh, and for the Chinese clouds TKE, ACK, and CCE plus the hands-on HAMi Workshop by @togettoyou.
- Grafana dashboards consolidated (@togettoyou), with new MIG inventory and in-use-by-profile panels, a resource-quota used-vs-limit table, and a vGPU cores panel (@loiht2).
- New stories on the site: a Seres case study, CETC Cloud joining the contributors list, ZYT joining the adopters, and a community ambassadors program.
Community Activities Since v2.10.0
The weeks between v2.10.0 and v2.11.0 were some of the busiest in the project's history:
- KubeCon + CloudNativeCon + OpenInfra Summit + PyTorch Conference China 2026 (Shanghai, September): HAMi's first KubeCon China as a CNCF Incubating project, with two keynotes, a lightning talk, a 10,000-GPU production session, and a case study award for China Merchants Bank announced from the keynote stage. Read the recap.
- LFX Mentorship 2026 Term 3 (September to November): four mentee projects covering HAMi-core lock contention, GPU memory isolation, observability, and documentation. Results of this cycle are already landing in v2.11.0, including the HAMi-core performance work above. See the program overview.
- ContainerDays & AI Context Singapore 2026 (October 27-28): HAMi appeared in five sessions including a hands-on GPU scheduling workshop by @rootsongjc and @fishman. Read the recap.
- DRA NPU sharing: the community published a deep dive on HAMi-DRA NPU sharing, extending the DRA story to Ascend NPUs.
Contributors
v2.11.0 is the result of contributions across the HAMi main repo and the Project-HAMi org (ascend-device-plugin, hami-vnpu-core, HAMi-core, HAMi-dra, amd-device-plugin, amd-dra-driver, HAMi-WebUI, and more). Representative feature owners this cycle:
- @moezdil: Remote GPU scheduler backend and device-plugin integration, the AMD feature wave, scheduler security hardening, release engineering, and the website information-architecture reorganization
- @archlitchi: release coordination, vNPU templates, remote client tooling, monitor fixes
- @maverick-woo: Ascend ENPU scheduling, hami-vnpu-core performance overhaul (spatial compute policy, per-NPU limits, lock contention reduction)
- @saiyam1814: NUMA refit (CPU and GPU scheduling alignment)
- @FouoF: Flexible MIG enhancements, remote mode enhancements, automatic driver root detection
- @asadjan4611: CDI for dynamic MIG, Lupine server pools, Inferentia and Cambricon fixes, NUMA refit hardening
- @spencercjh: OpenShift and SELinux support, chart restructure to
devices.VENDORwith full helm-docs coverage,deviceSplitCountfor hami-core/ENPU,llms.txt, offline-installation and user-guide documentation refactors, OpenShift/GKE/K3s installation guides, DCU-to-HCU docs migration - @maishivamhoo123: MIG placement scoring and profile preference, native sidecar accounting
- @sanket-jadhav-cse: multi-container Lupine allocation fixes
- @shkatara: node capacity resource reporting
- @im-Toqeer-506: scheduler performance and benchmarks, PodDisruptionBudget, diagnostics bundle
- @togettoyou: scheduler deep-copy elimination and chart documentation on the HAMi side; on the website, the redrawn Concepts section with SVG diagrams, the consolidated Grafana dashboard, the HAMi Workshop tutorials, and the TKE/ACK/CCE installation guides
- @vesta-mlp: whole-GPU monitoring bypass
- @xrwang8: hami-vnpu-core quota and scheduler fixes
- @panpan0000: Ascend950DT whole-card scheduling
- @kinglong08: Hygon DCU to HCU rename
- @wjluo: Mthreads S5000 support
- @usr-bin-ksh: nodeconfig label selectors, MIG allowlist
29 contributors made their first contribution in this release, including @Kevindua26, @im-Toqeer-506, @togettoyou, @Woolgathererer, @curry30000, @sanket-jadhav-cse, @usr-bin-ksh, @vesta-mlp, @tsingst, @loiht2, @falconlee236, and @heuristicwave. Thank you all, and to every user who reported issues and tested release candidates. The full list is in the v2.11.0 release notes.
Upgrade Guide
Upgrade to v2.11.0 via Helm:
helm repo add hami-charts https://project-hami.github.io/HAMi/
helm repo update
helm upgrade hami hami-charts/hami -n kube-system --version 2.11.0
# If your values.yaml customizes per-vendor settings, migrate it to the new
# devices.VENDOR layout first, then apply it explicitly. --reset-values discards
# the values stored in the release, so include every override in my-values.yaml.
helm upgrade hami hami-charts/hami -n kube-system --version 2.11.0 \
--reset-values --values my-values.yaml
For a step-by-step upgrade walkthrough with breaking-change callouts, see the dedicated Upgrade guide. For complete installation documentation, refer to: /docs/installation/online-installation
- Breaking chart change: vendor settings moved under
devices.VENDOR. If yourvalues.yamlcustomizes per-vendor device config, migrate it before upgrading; the chart now fails rendering when it finds the old, moved field paths. - Kubernetes 1.23+ is required by the chart.
- MIG + hami-core: MIG is now automatically disabled on hami-core nodes; verify your node configs if you relied on both.
- Hygon users: DCU resources are renamed to HCU across charts and docs.
- Metric deprecations:
hami_container_device_memory_bytesand thelimitlabel ofhami_resource_quota_usedare deprecated; update dashboards and alerts that depend on them. - Metric label changes: the always-zero
container_index/containeridxlabel was dropped from the four vGPU allocation metrics (#2898), and thedevice_typelabel onhami_host_gpu_*no longer carries a duplicateNVIDIAprefix, so it matches the scheduler'shami_gpu_*series (#2991). Adjust PromQL that groups or filters by these labels. - Stricter request validation: invalid HAMi device requests now fail closed instead of binding a GPU-less Pod (#2994); GPU core percentages outside 0-100 (#2784) and fractional
nvidia.com/gpumem-percentagevalues (#2789) are rejected at admission; the device plugin refuses an allocation larger than the container's request (#3075). Workloads that previously ran with silently dropped requests will now be rejected. - Strict device-config parsing: unknown or misspelled fields in
device-config.yamlnow fail scheduler startup with a clear error instead of being ignored (#2941). Check customdevice-config.contentoverrides before upgrading. - Node handshake annotations removed: the
hami.io/node-handshake-*annotations are no longer written and are cleaned up on registration; device health now follows the node'sallocatable(#3227, AMD: #3182). Remove any tooling that depends on them. - Limit delivery and cache file:
devices.nvidia.limitDeliveryselectsfile(default, unchanged) orenv(env vars only, no/overrideEnvfile), overridable per node (limitdeliveryin nodeconfig) and per Pod (hami.io/limit-delivery); the shared cache file is now always namedusage.cacheinstead of a random name (#3226). Like otherdevices.nvidiavalues,limitDeliveryis written into the generated device configuration; ifdevice-config.contentorfiles/device-config.yamlreplaces it, set the field there instead. - ResourceQuota semantics: with several ResourceQuota objects in a namespace the effective device limit is now the minimum across them, and deleting one no longer clears enforcement (#3094); quota memory limits are stored scaled by
memoryFactor, sohami_resource_quota_limitnow matcheshami_resource_quota_used(#3339). - New chart values:
scheduler.kubeQPS/kubeBurst/kubeTimeoutfor kube-apiserver client tuning (#2905),scheduler.nodeLockRetryTimeoutandscheduler.extenderHTTPTimeout(#2944), and, for Remote GPU images in private registries,devices.remotegpu.sessionImagePullSecretsfor the session relay Pods anddevices.remotegpu.server.image.pullSecretsfor the Lupine server Pods (#3329). The scheduler values are unaffected by adevice-config.contentoverride. - Remote GPU, ENPU, and NUMA refit are all disabled by default; enable them explicitly.
- We recommend verifying compatibility in a test environment before upgrading.
Summary
HAMi v2.11.0 is a release about removing boundaries: between local and remote GPUs (Remote GPU via Lupine), between GPU vendors (AMD Instinct sharing next to NVIDIA), between CPU and GPU scheduling (NUMA refit), between partitioning styles on Ascend (ENPU with policy isolation), and between dynamic MIG and modern runtimes (CDI support). Combined with a security-hardened scheduler, OpenShift/SELinux support, a restructured chart, and a reorganized and redrawn website, HAMi keeps expanding what a unified heterogeneous-compute scheduling platform can do.
We sincerely welcome more developers, users, and ecosystem partners to join the HAMi community and help advance GPU virtualization and heterogeneous-compute scheduling.
Related links:
- GitHub Release: https://github.com/Project-HAMi/HAMi/releases/tag/v2.11.0
- Remote GPU examples: https://github.com/Project-HAMi/HAMi/tree/master/examples/remotegpu
- Lupine: https://github.com/lupinemachines
- hami-vnpu-core: https://github.com/Project-HAMi/hami-vnpu-core
- Documentation: /docs/
- Community Discord (recommended): https://discord.gg/Amhy7XmbNq
- Community CNCF Slack: https://cloud-native.slack.com/archives/C07T10BU4R2