What's Changed
Key Features
General:
No longer mount HAMI-core to whole GPU allocation, metrics will be exported by NVML directly
Flexible-MIG
Support Cluster Autoscaler
Real-usage monitoring for Flexible-mig workloads
Remote CUDA:
Allows running vllm on remote cuda
Schedule:
PodGroup Support
New schedule policy: mutex
Schedule policy combinations
GPU/CPU Numa Align
Devices:
Full AMD Support
Ascend 950 Support
libvnpu performance optimization
✨ Features Details
- ci: allow manual dispatch of the Trivy image scan by @moezdil in #2768
- fix(monitor): replace MustNewConstMetric with safe helper and track InitContainers by @devGPP23 in #2716
- feat(scheduler): account native sidecar container GPU resources by @maishivamhoo123 in #2723
- Add nil node checks to PatchNodeAnnotations and RemoveNodeAnnotation by @KunwarSidhu47 in #2792
- feat: add groundwork for NUMA-aware device refit by @saiyam1814 in #2729
- feat: add scheduler NUMA refit for device allocations by @saiyam1814 in #2731
- ci: run CodeQL on every pull request by @moezdil in #2816
- test(util): add unit tests for GetNode() function by @Kevindua26 in #2798
- [kind/bug] Restore model-aware scheduling for Cambricon MLU devices by @asadjan4611 in #2780
- [Feature] Add Prometheus metrics for scheduler leader and cache sync state by @KunwarSidhu47 in #2758
- Feat/scheduler poddisruptionbudget by @im-Toqeer-506 in #2773
- feat: add host PID broker server and device plugin integration by @iemAnshuman in #2417
- test(device): add unit tests for ReplaceUsage and GetResourceQuota by @KunwarSidhu47 in #2825
- feat(e2e): add MIG E2E targets and fix GPU preflight fail-fast by @haitwang-cloud in #2742
- [Feature] Expose Hardware Health and Error Metrics in vGPUmonitor (Fixes #2717) by @Gurkaran18 in #2732
- feat(device plugin): add auto detecting nvidiaDriverRoot by @FouoF in #2848
- test(scheduler): verify NUMA refit PATCH timeout releases allocLock by @asadjan4611 in #2869
- webhook: validate device-scoring-weights at admission by @asadjan4611 in #2827
- feat(nvidia): score MIG placements and add backtracking fallback. by @maishivamhoo123 in #2855
- test(scheduler): add Go benchmarks for the Filter scoring path by @im-Toqeer-506 in #2907
- feat(dashboard): compare allocated and host GPU memory by @Utkarsh56016 in #2922
- Add template to vNPU-mode by @archlitchi in #2970
- feat(helm): add OpenShift &SELinux helm chart support by @spencercjh in #2208
- Cleanup: Replace %v with %w in fmt.Errorf() for better error handling by @Kevindua26 in #2998
- test(e2e): add scheduler policy E2E suite by @haitwang-cloud in #2793
- feat(chart): expose node-lock-retry-timeout and extender httpTimeout by @im-Toqeer-506 in #2944
- perf(scheduler): stop deep-copying whole Pods into the usage snapshot by @togettoyou in #2978
- feat(nvidia): allow a pod to prefer a MIG profile over 3g via annotation. by @maishivamhoo123 in #3014
- Feat: pod level and container level overwrite env by @peachest in #2966
- enhance(device-plugin): pair NVML init and shutdown on the MIG manager session by @FouoF in #2989
- feat(scheduler): add remote-gpu device backend for lupine-served GPUs by @moezdil in #3004
- feat(ascend): honor plugin-advertised hami-core percentage budget by @curry30000 in #2952
- index device UUIDs once per scrape by @im-Toqeer-506 in #3064
- feat(scheduler): validate device resource names and defaults at startup by @im-Toqeer-506 in #3010
- Add Missing Node Label to Memory Controller Metric in vGPUmonitor (Fixes #2771) by @Gurkaran18 in #2776
- feat(mthreads): configurable per-card memory units (mthreads S5000) + whole-card/slice mixing guard by @wjluo in #2988
- test: add make bench target and run Go benchmarks in CI by @im-Toqeer-506 in #3067
- fix: disable MIG when using hami-core by @FouoF in #3043
- Fix/scheduler metrics audit by @im-Toqeer-506 in #3088
- fix(scheduler): guard allocation annotations on update, not just create by @moezdil in #3074
- feat(device-plugin): run GPUs for lupine instead of advertising them locally by @moezdil in #3013
- fix(device-plugin): auto driverroot make mount unchange by @FouoF in #3092
- Add CDI support for dynamic MIG devices by @asadjan4611 in #3070
- support all four NeuronCores on Inferentia1 devices by @asadjan4611 in #3082
- fixing the reject unknown fields in device-config.yml by @asadjan4611 in #2941
- fix(scheduler): fail closed on invalid HAMi device requests instead of binding GPU-less pods by @Eshiv-Pandey in #2994
- perf(scheduler): build the usage snapshot only for candidate nodes by @im-Toqeer-506 in #3024
- add profiling support with dedicated HTTP bind address by @im-Toqeer-506 in #3117
- refactor(vGPUMonitor): cleanup the temporary files of HAMi-Core in Device Plugin by @Shouren in #3049
- feat!: move all vendor configs to
devices.VENDORby @spencercjh in #3124 - feat: report memory and core resources to node capacity by @shkatara in #2874
- feat: only use values in values.yaml as defaults for device-config by @spencercjh in #3152
- fix(remotegpu): select Lupine server using all pod container requests by @sanket-jadhav-cse in #3166
- feat(amd): support gpumem-percentage memory requests by @moezdil in #3179
- feat(ascend): schedule ENPU workloads with policy isolation by @maverick-woo in #3110
- refactor(device): share the allocation check with every vendor plugin by @moezdil in #3125
- feat(amd): support amd.com/numa-bind for multi-GPU requests by @moezdil in #3186
- fix(vGPUmonitor): surface collection failures and add health probes by @moezdil in #3162
- feat(amd): check the namespace ResourceQuota in Fit by @moezdil in #3180
- feat: add helm-docs workflow for chart doc by @spencercjh in #3189
- feat(device-plugin): match nodeconfig by label selector by @usr-bin-ksh in #3173
- fix(remotegpu): run library-copy init first by @sanket-jadhav-cse in #3201
- Optimize the Dynamic MIG instance lifecycle by @asadjan4611 in #3128
- feat(helm): expose Ascend hami-core mode slot capacity by @spencercjh in #3203
- feat(amd): set a configurable runtimeClassName on AMD GPU Pods by @moezdil in #3194
- fix(remotegpu): exclude NotReady Lupine servers by @asadjan4611 in #3184
- feat(amd): honor the topology-aware policy by XGMI links and NUMA by @moezdil in #3191
- feat(vGPUMonitor): whole-GPU hook bypass and direct NVML monitoring by @vesta-mlp in #3112
- fix(device-plugin): mount GPU limits at /overrideEnv for login sessions. by @maishivamhoo123 in #3220
- fix(device-plugin): stop mounting the host root for auto driver root by @adity1raut in #3113
- Replace int32 to int64 to get rid of range check by @archlitchi in #3233
- feat: add limitDelivery switch and stable usage.cache name by @maishivamhoo123 in #3226
- feat(amd): default the GPU count, memory and cores, and honor device cordon by @moezdil in #3192
- docs(chart): document devices.cambricon values and account a count above 1 as whole MLUs by @B-White84 in #3218
- enhancement remote mode by @FouoF in #3247
- chore: update build images, HAMi-core, CI tooling and refresh the root docs by @moezdil in #3237
- feat: introduce
deviceSplitCountfor bothhami-coreandenpumode by @spencercjh in #3267 - feat(support): add a redacted HAMi diagnostic bundle collector by @im-Toqeer-506 in #3149
- feat(remotegpu): select Lupine server pools by label by @asadjan4611 in #3195
- Add 'nvidia-smi' to remote client, optmize the documents by @archlitchi in #3278
- feat: add MIG monitoring support-v2.11-Support pod with dynamic-mig by @tsingst in #3270
- feat(chart): add securityContext for the lupine server by @moezdil in #3272
- Update default core value for hygon by @archlitchi in #3285
- enhance CI with benchmark comparisons and reporting by @im-Toqeer-506 in #3146
- fix(remotegpu): requeue pods waiting for a lupine fleet change by @moezdil in #3274
- fix(monitor): resolve dynamic MIG identities and watch profiling fields by @FouoF in #3304
- feat: introduce
global.imageSourceto switch between upstream and CN mirrors by @spencercjh in #3306 - feat: enhance fields validator and add complete coverage helm-unittest by @spencercjh in #3324
- support session image pull secrets in configuration and templates by @im-Toqeer-506 in #3329
- feat(scheduler): honor preferred nodeAffinity in node score by @falconlee236 in #3298
- feat(vGPUmonitor): add an unknown GPU process count metric by @heuristicwave in #3305
- Fix vgpu-monitor can't discover mig-instance properly by @archlitchi in #3349
- Configure Ascend950DT 9582 whole-card scheduling by @panpan0000 in #3316
- fix(amd): select quota-feasible GPU combinations in topology scheduling by @Eshiv-Pandey in #3361
🐛 Bug Fixes
- fix(nodelock): serialize expired-lock recovery by @AyushSrivastava1818 in #2733
- fix(plugin): don't cache node annotation as up-to-date when the patch fails by @adity1raut in #2545
- fix(device): reject malformed and negative device allocation annotations by @AyushSrivastava1818 in #2765
- fix(nvidia): collapse duplicate MIG candidates in topology scheduling by @Eshiv-Pandey in #2751
- fix(skill): align vGPU metrics summary with actual codebase definitions by @haitwang-cloud in #2761
- fix(scheduler): include init container requests in device locking by @AyushSrivastava1818 in #2755
- fix(dashboard): align node GPU memory ratio scale by @blackdragoon26 in #2840
- fix(vGPUmonitor): gracefully skip GPU utilization metrics when unsupported by @SK8-infi in #2808
- fix: NUMA refit follow-ups from post-merge review by @saiyam1814 in #2817
- fix(scheduler): keep the configured policy for unrecognized policy an… by @IIITManjeet in #2769
- fix: reject invalid device count (0/negative) across biren, cambricon… by @iron-prog in #2740
- fix(scheduler): account terminating pods replayed by informer sync by @moezdil in #2812
- fix(nvidia): honor enableGetPreferredAllocation in GetDevicePluginOptions by @AyushSrivastava1818 in #2845
- fix(scheduler): keep candidate nodes for non HAMi pods on the simulation path by @moezdil in #2838
- fix(metax): let multi container pods spread over exclusive GPUs by @moezdil in #2837
- fix(plugin): pair per device limits by UUID when aligning kubelet IDs by @moezdil in #2814
- fix(awsneuron): cap whole-device core accounting to addressable cores by @moezdil in #2809
- fix(enflame): keep DRS profile core costs within the device budget by @moezdil in #2810
- fix(kunlun): make topology selection independent of device slice order by @moezdil in #2811
- fix(amd): keep allocation annotations decodable for empty registered types by @moezdil in #2815
- fix(device): reject GPU core percentage requests out of range [0,100] by @AyushSrivastava1818 in #2784
- fix(device-plugin): remove panic(0) traps from getAPIDevices and dead util code by @devGPP23 in #2775
- fix(monitor): reuse the node-scoped pod informer for metrics by @moezdil in #2896
- fix(monitor): report metrics server listen failures by @moezdil in #2897
- fix(chart): target the scheduler metrics port by name by @moezdil in #2895
- fix(ascend): gate 910C module pair allocation on SuperPod by @moezdil in #2853
- fix(metrics): drop the constant container index label by @moezdil in #2898
- fix(scheduler): keep bare reasons in FilteringFailed events by @im-Toqeer-506 in #2881
- fix(device-plugin): propagate IMEX channels into the NVIDIA plugin by @Eshiv-Pandey in #2892
- fix(scheduler): use phase-aware accounting during NUMA refit by @asadjan4611 in #2868
- fix(ascend): guard against empty ResourceMemoryName injection in admission by @KunwarSidhu47 in #2889
- fix(scheduler): validate NUMA refit quota with container positions by @asadjan4611 in #2836
- fix(dashboard): use native node labels for host panels by @blackdragoon26 in #2852
- fix: remove duplicate effectivePodDeviceUsage function by @FouoF in #2955
- fix(util): return the canonical GPU scheduler policy for padded annotations by @moezdil in #2854
- fix(kunlun): compare elements instead of indices in calcscore sort by @Woolgathererer in #2924
- fix(scheduler): keep multi-slot device usage across annotation round trip by @Eshiv-Pandey in #2877
- fix(monitor): count task priorities in a map, not a slice index by @moezdil in #2931
- fix(chart): render service labels at the right indent level by @moezdil in #2932
- fix(scheduler): clean annotationless pod deletes from cache by @0z5a in #2968
- Fix Ascend webhook reject pod with 'vnpu-core' resource by @archlitchi in #2975
- fix(nvidia): guard Allocate against empty DevicesIds requests by @Woolgathererer in #2956
- fix(chart): honor kube-scheduler image pull secrets by @spencercjh in #2976
- fix(chart): keep scheduler livenessProbe inside the kubeScheduler container guard by @magic-peach in #2977
- fix(ascend): do not overwrite ASCEND_VISIBLE_DEVICES for Ascend containers by @peachest in #2953
- fix(hack): write the coverage mode line and data to the same file by @im-Toqeer-506 in #2935
- fix(scheduler): prune printedLog when a node is deleted by @im-Toqeer-506 in #2939
- fix(scheduler): require caller authentication on /refit by @AyushSrivastava1818 in #2882
- fix(chart): keep workload labels on scraped HAMi metrics by @moezdil in #2934
- fix(nvidia): make managed admission env mutation idempotent by @asadjan4611 in #2936
- fix(scheduler): serve the extender verbs on loopback, not the cluster port by @moezdil in #3039
- fix(scheduler): verify pod identity before the extender acts on a request by @moezdil in #3040
- fix(scheduler): deny pods created with scheduler-owned allocation annotations by @moezdil in #3042
- fix(ci): make the release version check compare real values by @moezdil in #2962
- fix(awsneuron): allocate by device index, not slice position by @moezdil in #2960
- fix(iluvatar): read the scaled core limit as a per card value by @moezdil in #2961
- fix(ci): run the compile, chart and e2e jobs on merge by @moezdil in #2963
- fixing the awsneuron: derive core geometry per node by @asadjan4611 in #3029
- fix(scheduler): score devices against the request on model-typed backends by @adity1raut in #2870
- fix(monitor): drop duplicate
NVIDIAprefix fromdevice_typelabel by @rapsealk in #2991 - fix(device-plugin): reject an allocation larger than the container requests by @moezdil in #3075
- fix(device): enforce minimum limit across multiple ResourceQuota objects by @ManthanNimodiya in #3094
- fix: disable cuda dnf repo to recover CI by @spencercjh in #3153
- fix(remotegpu): keep multi-container pod allocations on one Lupine server by @sanket-jadhav-cse in #3164
- fix(chart): drop unused pods and nodes verbs from the device-plugin ClusterRole by @blackdragoon26 in #3157
- fix(scheduler): report undecodable live Pod allocations by @asadjan4611 in #2959
- fix(amd): round core requests up to whole WGPs by @moezdil in #3174
- fix(vGPUmonitor): make the MIG lock wait respect context cancellation by @moezdil in #3159
- fix(scheduler): gpumem score before gpumem-percentage by @diegodevxd in #3106
- fix(nodelock): keep an expired lock while its holder waits to be allocated by @moezdil in #3127
- fix: defer Ascend memory trimming until node filtering by @asadjan4611 in #3107
- fix(util): serve only the pod the node lock names by @moezdil in #3126
- fix(hygon): prevent dcucores integer overflow by @AyushSrivastava1818 in #3012
- fix(nvidia): reject fractional gpu memory percentages by @AyushSrivastava1818 in #2789
- fix(chart): use lists for device plugin
extraEnvsdefaults by @spencercjh in #3205 - fix(amd): judge node health by allocatable GPUs by @moezdil in #3182
- fix(amd): read a registration without a type as the AMD type by @moezdil in #3212
- fix(scheduler): keep HAMI_NODELOCK_EXPIRE unless --node-lock-timeout is set by @togettoyou in #3223
- fix(scheduler): restore steady-state usage on pod replay by @phantom5125 in #3231
- fix(deps): update Go dependencies and bump golang.org/x/net to v0.60.0 by @moezdil in #3236
- Fix healthcheck always return true for some device vendors by @archlitchi in #3255
- fix(chart): require Kubernetes 1.23, guard the PSP and pin images by digest by @moezdil in #3238
- fix(device-plugin): honor disable-core-limit flag by @B-White84 in #3252
- fix(device-plugin): mark all replicas/MIG slices unhealthy on XID by @Samurai007AK in #3265
- fix(device-plugin): check MIG allocations against the registered profiles by @moezdil in #3264
- fix(vGPUmonitor): skip terminated pods in per-container metrics by @loiht2 in #3294
- fix(scheduler): ignore negative percentage by @diegodevxd in #3313
- fix(scheduler): store quota memory limits scaled by memoryFactor by @loiht2 in #3339
- fix(scheduler): hold allocLock when removing a pod's allocation by @saiyam1814 in #3350
- fix(chart): add actual NVML names to MIG allowlist by @usr-bin-ksh in #3352
📚 Documentation
- docs: remove the stale v2.9.0 documentation audit by @moezdil in #3199
- docs(chart): document devices.nvidia values by @togettoyou in #3209
- docs(chart): document MThreads values by @B-White84 in #3216
- docs(hami): document global settings and name overrides in values.yaml by @0718lol in #3208
- docs: add helm-docs comments for other settings by @spencercjh in #3232
- docs: add helm-docs comments to OpenShift associated fields by @spencercjh in #3228
- docs: add helm-docs for
devicePluginsettings by @spencercjh in #3221 - docs(chart): document scheduler values by @togettoyou in #3235
- docs(chart): document devices.amd values by @Shenhan11 in #3260
- docs: remove docs/develop by @moezdil in #3258
- docs: add helm-docs comments for multiple devices by @B-White84 in #3259
- docs: finalize chart values documentation by @spencercjh in #3277
- docs: fix the scheduling policy list in the READMEs and list Scorecard in the security insights by @moezdil in #3302
- docs(changelog): add the changes merged since the last update by @moezdil in #3301
- docs: move README content to website by @spencercjh in #3296
🔨 Other Changes
- chore: add new linters to golangci-lint config by @dongjiang1989 in #2794
- chore: upgrade to go 1.27 by @spencercjh in #2851
- expose scheduler kube-qps, kube-burst and kube-timeout as values by @im-Toqeer-506 in #2905
- build(deps): bump github/codeql-action from 4.37.8 to 4.37.9 by @Shouren in #2927
- ✏️ rename DCU(HYGON) to HCU across resources, charts, and docs by @kinglong08 in #2969
- chore(dashboard): remove legacy Grafana dashboard by @togettoyou in #3031
- test(util): cover the delete-and-recreate race PatchPodAnnotations' UID pin closes by @moezdil in #3061
- chore: remove the docs now hosted on the website by @moezdil in #3050
- chore: add moezdil to approvers by @moezdil in #3145
- chore(chart): add admission.k8s.io/v1 to webhook admissionReviewVersions by @blackdragoon26 in #3158
- test(iluvatar): add coverage for AddResourceUsage by @karthikeyan-lgk in #3151
- chore: remove the HCU doc transferred to the website by @spencercjh in #3198
- chore: remove the docs transferred to the website by @moezdil in #3200
- test(e2e): add an AMD GPU end-to-end suite by @moezdil in #3193
- Remove requesting annotations by @archlitchi in #3227
- chore: build the images with golang 1.27.2 by @moezdil in #3219
- chore(deps): group golang.org/x/* packages by @Shouren in #3280
- deprecation(vGPUmonitor): deprecate hami_container_device_memory_bytes by @loiht2 in #3273
- chore(dependabot): group some packages under k8s.io by @Shouren in #3292
- deprecation(scheduler): deprecate the limit label of hami_resource_quota_used metric by @loiht2 in #3299
- build: bump Go to 1.27.3 and pin the dcgm base image by @moezdil in #3300
- build: bump DCGM to 4.7.0-2 and go-dcgm to v1.4702.0 by @moezdil in #3303
- build(deps): bump golang.org/x/net from 0.61.0 to 0.62.0 by @moezdil in #3331
- test: add e2e tests for limits-file delivery feature by @maishivamhoo123 in #3355
- Update HAMi-core and image tag by @archlitchi in #3362
New Contributors
- @Kevindua26 made their first contribution in #2798
- @IIITManjeet made their first contribution in #2769
- @iron-prog made their first contribution in #2740
- @im-Toqeer-506 made their first contribution in #2773
- @Gurkaran18 made their first contribution in #2732
- @Woolgathererer made their first contribution in #2924
- @Utkarsh56016 made their first contribution in #2922
- @0z5a made their first contribution in #2968
- @kinglong08 made their first contribution in #2969
- @magic-peach made their first contribution in #2977
- @togettoyou made their first contribution in #2978
- @curry30000 made their first contribution in #2952
- @wjluo made their first contribution in #2988
- @rapsealk made their first contribution in #2991
- @ManthanNimodiya made their first contribution in #3094
- @sanket-jadhav-cse made their first contribution in #3164
- @karthikeyan-lgk made their first contribution in #3151
- @diegodevxd made their first contribution in #3106
- @usr-bin-ksh made their first contribution in #3173
- @B-White84 made their first contribution in #3216
- @vesta-mlp made their first contribution in #3112
- @0718lol made their first contribution in #3208
- @phantom5125 made their first contribution in #3231
- @Shenhan11 made their first contribution in #3260
- @Samurai007AK made their first contribution in #3265
- @tsingst made their first contribution in #3270
- @loiht2 made their first contribution in #3273
- @falconlee236 made their first contribution in #3298
- @heuristicwave made their first contribution in #3305
Full Changelog: v2.10.0...v2.11.0