feat(docs): add interactive kubernetes manifest generator for heterogeneous devices - #744
Conversation
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: harshitnub077 The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
✅ Deploy Preview for project-hami ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
Warning Review limit reached
Next review available in: 52 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughThe PR adds an interactive multi-vendor Kubernetes manifest generator, English and Chinese usage documentation, troubleshooting guidance, and an SGLang GPU-partitioning lab tutorial with sidebar navigation entries. ChangesManifest Generator
Troubleshooting Guide
SGLang Lab
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
actor Author
participant ManifestGenerator
participant YAMLPreview
Author->>ManifestGenerator: Select vendor and resource settings
ManifestGenerator->>ManifestGenerator: Generate vendor-specific Pod YAML
ManifestGenerator->>YAMLPreview: Render generated YAML
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…eneous devices Signed-off-by: harshit kudhial <harshitkudhial@gmail.com>
03a784f to
4577338
Compare
There was a problem hiding this comment.
Actionable comments posted: 11
🧹 Nitpick comments (1)
tutorials/labs/hami-sglang.md (1)
63-63: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winPin the SGLang image used by the lab.
Lines 63 and 90 use
lmsysorg/sglang:latest. A mutable tag can change the SGLang and CUDA stack between runs. Replace both references with the exact tested version or digest. Official SGLang documentation uses this image family for Docker deployments. (docs.sglang.io)Proposed manifest change
- image: lmsysorg/sglang:latest + image: lmsysorg/sglang:<tested-version>`@sha256`:<tested-digest>Also applies to: 90-90
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tutorials/labs/hami-sglang.md` at line 63, Pin both SGLang image references in the lab documentation, including the capability statement and the deployment example, by replacing the mutable lmsysorg/sglang:latest tag with the exact tested version or digest. Keep both references consistent.Source: MCP tools
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/troubleshooting/troubleshooting.md`:
- Around line 24-26: Make the troubleshooting guide vendor-aware: at
docs/troubleshooting/troubleshooting.md:24-26, route OOM diagnosis to the
applicable vendor-specific memory resource instead of hard-coding NVIDIA; at
docs/troubleshooting/troubleshooting.md:83-90, label NVIDIA-only checks or
provide equivalent guidance for other supported vendors; and at
docs/troubleshooting/troubleshooting.md:100-102, inspect allocatable resources
without filtering exclusively on nvidia.com.
- Around line 71-75: Update the HAMi log selectors in the troubleshooting
commands near the scheduler and device-plugin log guidance to use the chart
label key app.kubernetes.io/component with the corresponding component value,
replacing the broad component selector while keeping scheduler and device-plugin
logs distinct.
- Around line 39-43: Update the troubleshooting guidance to state that
pre-v2.3.10 device-plugin images must retain NodeName, while v2.3.10 and later
use NODE_NAME. Revise the manual kubectl edit daemonset command to specify the
DaemonSet name and include the -n kube-system namespace option.
In `@docs/userguide/interactive-manifest-generator.md`:
- Line 8: Update the introductory vendor and configuration description in
docs/userguide/interactive-manifest-generator.md at lines 8-8 to include
Iluvatar, clarify that resources.limits contains resource keys, and state that
device type and UUID constraints are rendered as metadata.annotations. Mirror
the same corrected content in
i18n/zh/docusaurus-plugin-content-docs/current/userguide/interactive-manifest-generator.md
at lines 8-8.
In `@src/components/ManifestGenerator/index.js`:
- Around line 255-257: Correct the ManifestGenerator preview text so the
generated kind: Pod YAML is not presented as directly usable in a Deployment;
either add a Deployment output mode or explicitly instruct users to place the
container resources under spec.template.spec. Update the corresponding guidance
in docs/userguide/interactive-manifest-generator.md at line 10 and mirror the
correction in
i18n/zh/docusaurus-plugin-content-docs/current/userguide/interactive-manifest-generator.md
at line 10.
- Around line 224-229: Replace the clickable div wrapping the advanced
configuration toggle in ManifestGenerator with a button type="button", add
aria-expanded={advanced}, and retain the existing toggle behavior and label
content. Update the associated styling so the button visually matches the
current advancedToggle and interactiveText appearance.
- Around line 148-151: Update the deviceVendor select onChange handler to reset
coreMode to none when the newly selected vendor lacks the key required by the
currently selected core allocation mode, while preserving supported modes and
the existing vendor/memory-mode updates.
- Around line 105-109: Update the annotation construction in ManifestGenerator
to serialize deviceType and deviceUuid as YAML-safe quoted strings before
interpolating them into annotations, escaping quotes, backslashes, and line
breaks while preserving the existing typeKey and uuidKey conditions.
In `@tutorials/labs/hami-sglang.md`:
- Around line 40-41: Align the SGLang architecture diagram with the Deployment
replica count: update the diagram around SVC, P1, and P2 to show one Pod when
replicas remains 1, preserving the one-virtual-GPU-per-replica description.
- Line 15: Update the SGLang hyperlink in the lab introduction to point directly
to the current HTTPS documentation destination at sgl-project.ai, replacing the
redirecting sgl-project.github.io URL while preserving the surrounding
description.
- Around line 153-163: Update the SGLang startup instructions after the pod
watch to wait for the backend to accept requests before proceeding. Add a
bounded retry against the SGLang API, or configure a readiness probe that
reflects model-loading completion, and ensure the subsequent port-forward/curl
flow runs only after readiness succeeds.
---
Nitpick comments:
In `@tutorials/labs/hami-sglang.md`:
- Line 63: Pin both SGLang image references in the lab documentation, including
the capability statement and the deployment example, by replacing the mutable
lmsysorg/sglang:latest tag with the exact tested version or digest. Keep both
references consistent.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: aec70bf6-f465-4087-a977-d53109112434
⛔ Files ignored due to path filters (96)
i18n/zh/docusaurus-plugin-content-blog/hami-meetup-shanghai-2025/daocloud-drun-practice.pngis excluded by!**/*.pngi18n/zh/docusaurus-plugin-content-blog/hami-meetup-shanghai-2025/hami-version-evolution.pngis excluded by!**/*.pngi18n/zh/docusaurus-plugin-content-blog/hami-meetup-shanghai-2025/keith-opening-keynote.pngis excluded by!**/*.pngi18n/zh/docusaurus-plugin-content-blog/hami-meetup-shanghai-2025/meetup-banner.pngis excluded by!**/*.pngi18n/zh/docusaurus-plugin-content-blog/hami-meetup-shanghai-2025/metax-sgpu-hami.pngis excluded by!**/*.pngi18n/zh/docusaurus-plugin-content-blog/hami-meetup-shanghai-2025/networking-session.pngis excluded by!**/*.pngi18n/zh/docusaurus-plugin-content-blog/hami-meetup-shanghai-2025/performance-optimization.pngis excluded by!**/*.pngi18n/zh/docusaurus-plugin-content-blog/hami-meetup-shanghai-2025/transwarp-technology.pngis excluded by!**/*.pngi18n/zh/docusaurus-plugin-content-blog/hami-meetup-shenzhen-2026/meetup-shenzhen-video-qr.pngis excluded by!**/*.pngstatic/favicons/android-chrome-192x192.pngis excluded by!**/*.pngstatic/favicons/apple-touch-icon.pngis excluded by!**/*.pngstatic/favicons/favicon-16x16.pngis excluded by!**/*.pngstatic/favicons/favicon-32x32.pngis excluded by!**/*.pngstatic/favicons/mstile-150x150.pngis excluded by!**/*.pngstatic/img/adopters/ashermed.pngis excluded by!**/*.pngstatic/img/adopters/baidu-cloud.pngis excluded by!**/*.pngstatic/img/adopters/baihai.jpgis excluded by!**/*.jpgstatic/img/adopters/boardware.jpgis excluded by!**/*.jpgstatic/img/adopters/bonc.pngis excluded by!**/*.pngstatic/img/adopters/cetc-zh.pngis excluded by!**/*.pngstatic/img/adopters/cetc.pngis excluded by!**/*.pngstatic/img/adopters/china-merchants-bank.pngis excluded by!**/*.pngstatic/img/adopters/china-mobile.pngis excluded by!**/*.pngstatic/img/adopters/china-unicom.pngis excluded by!**/*.pngstatic/img/adopters/china-university-of-mining-and-technology.jpgis excluded by!**/*.jpgstatic/img/adopters/coocaa.pngis excluded by!**/*.pngstatic/img/adopters/cyintell.pngis excluded by!**/*.pngstatic/img/adopters/deeproute.pngis excluded by!**/*.pngstatic/img/adopters/dialo.pngis excluded by!**/*.pngstatic/img/adopters/donghua-university.pngis excluded by!**/*.pngstatic/img/adopters/ecloud.jpgis excluded by!**/*.jpgstatic/img/adopters/empathy.pngis excluded by!**/*.pngstatic/img/adopters/ghostcloud.pngis excluded by!**/*.pngstatic/img/adopters/gsafety.jpgis excluded by!**/*.jpgstatic/img/adopters/guangdong-university-of-technology.jpgis excluded by!**/*.jpgstatic/img/adopters/guangdong-university-of-technology.pngis excluded by!**/*.pngstatic/img/adopters/guangzhou-pingao.jpgis excluded by!**/*.jpgstatic/img/adopters/h3c.pngis excluded by!**/*.pngstatic/img/adopters/hangzhou-lianhui.pngis excluded by!**/*.pngstatic/img/adopters/haofan.jpgis excluded by!**/*.jpgstatic/img/adopters/harbin-institute-of-technology.pngis excluded by!**/*.pngstatic/img/adopters/i-tudou.pngis excluded by!**/*.pngstatic/img/adopters/infervision.pngis excluded by!**/*.pngstatic/img/adopters/institute-of-information-engineering-cas.pngis excluded by!**/*.pngstatic/img/adopters/kylinsoft.pngis excluded by!**/*.pngstatic/img/adopters/linkedin.pngis excluded by!**/*.pngstatic/img/adopters/linklogis.jpgis excluded by!**/*.jpgstatic/img/adopters/miaoyun.pngis excluded by!**/*.pngstatic/img/adopters/msxf.pngis excluded by!**/*.pngstatic/img/adopters/nankai-university.pngis excluded by!**/*.pngstatic/img/adopters/northsoft.pngis excluded by!**/*.pngstatic/img/adopters/pingan-bank.pngis excluded by!**/*.pngstatic/img/adopters/pingan-securities.pngis excluded by!**/*.pngstatic/img/adopters/ppio.pngis excluded by!**/*.pngstatic/img/adopters/ragehealth.pngis excluded by!**/*.pngstatic/img/adopters/sangfor.jpgis excluded by!**/*.jpgstatic/img/adopters/sap.pngis excluded by!**/*.pngstatic/img/adopters/si-tech.pngis excluded by!**/*.pngstatic/img/adopters/sinochem.pngis excluded by!**/*.pngstatic/img/adopters/snow.pngis excluded by!**/*.pngstatic/img/adopters/southeast-university.pngis excluded by!**/*.pngstatic/img/adopters/szzt.pngis excluded by!**/*.pngstatic/img/adopters/tongcheng-travel.pngis excluded by!**/*.pngstatic/img/adopters/tum.pngis excluded by!**/*.pngstatic/img/adopters/ucloud.pngis excluded by!**/*.pngstatic/img/adopters/unicdata.pngis excluded by!**/*.pngstatic/img/adopters/viettel.pngis excluded by!**/*.pngstatic/img/adopters/weibo.pngis excluded by!**/*.pngstatic/img/adopters/weidian.pngis excluded by!**/*.pngstatic/img/adopters/woqu.pngis excluded by!**/*.pngstatic/img/adopters/xuanyuan-network.pngis excluded by!**/*.pngstatic/img/adopters/zstack.pngis excluded by!**/*.pngstatic/img/architect.jpgis excluded by!**/*.jpgstatic/img/blog-hami-at-kubecon-eu-2026-booth.pngis excluded by!**/*.pngstatic/img/blog-hami-at-kubecon-eu-2026-kubecon.pngis excluded by!**/*.pngstatic/img/blog/flowchart.jpegis excluded by!**/*.jpegstatic/img/blog/hami-pod-scheduler-preparation.pngis excluded by!**/*.pngstatic/img/case-studies/ke-holdings.pngis excluded by!**/*.pngstatic/img/community/wechat-assistant-qr.jpgis excluded by!**/*.jpgstatic/img/community/wechat-official-account-qr.jpgis excluded by!**/*.jpgstatic/img/community/wechat-video-channel-qr.jpgis excluded by!**/*.jpgstatic/img/contributors/alauda.jpgis excluded by!**/*.jpgstatic/img/contributors/bit.pngis excluded by!**/*.pngstatic/img/contributors/caih.pngis excluded by!**/*.pngstatic/img/contributors/cncr.pngis excluded by!**/*.pngstatic/img/contributors/glovo.pngis excluded by!**/*.pngstatic/img/contributors/hygon.pngis excluded by!**/*.pngstatic/img/contributors/iluvatar.pngis excluded by!**/*.pngstatic/img/contributors/iqiy.pngis excluded by!**/*.pngstatic/img/contributors/jd-zh.pngis excluded by!**/*.pngstatic/img/contributors/kunlunxin.jpgis excluded by!**/*.jpgstatic/img/contributors/memverge.pngis excluded by!**/*.pngstatic/img/contributors/metax.pngis excluded by!**/*.pngstatic/img/contributors/mthread.pngis excluded by!**/*.pngstatic/img/contributors/phancy.pngis excluded by!**/*.pngstatic/img/contributors/qxzg-ai.pngis excluded by!**/*.png
📒 Files selected for processing (42)
docs/troubleshooting/troubleshooting.mddocs/userguide/interactive-manifest-generator.mdi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/bagualu-intelligent-computing-stack.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/bagualu-performance-delivery.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/beike-hami-partnership.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/beike-vgpu-inference-cluster-practice.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/dcu-practice-implementation.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/dcu-virtualization-basics.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/device-plugin-architecture.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/device-plugin-new-features.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/dra-driver-practice.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/hami-community.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/hami-core-dra-architecture.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/hami-meetup-beijing-banner.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/hami-new-features-capability-matrix.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/hami-v2.7.0-domestic-compute.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/kunlunxin-xpu-adapter.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-beijing-2025/meetup-networking-session.webpi18n/zh/docusaurus-plugin-content-blog/hami-meetup-shenzhen-2026/meetup-shenzhen-group-photo.webpi18n/zh/docusaurus-plugin-content-docs/current/userguide/interactive-manifest-generator.mdsidebars-tutorials.jssidebars.jssrc/components/ManifestGenerator/index.jssrc/components/ManifestGenerator/styles.module.cssstatic/img/case-studies/snow-corp.webpstatic/img/vllm-meetup-shanghai-2026-recap/li-mengxuan-speaking.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase0-code.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase0-overview.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase1-k8s.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase1-overview.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase2-llmd-detail.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase2-llmd.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase2-mooncake-code.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase2-mooncake.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase2-nccl.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase2-pd.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase3-architecture.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase3-overview.webpstatic/img/vllm-meetup-shanghai-2026-recap/phase3-result.webpstatic/img/vllm-meetup-shanghai-2026-recap/title.webpstatic/img/vllm-meetup-shanghai-2026-recap/vllm-meetup-group-photo.webptutorials/labs/hami-sglang.md
| D --> I{Is it an OOM error?} | ||
| I -->|Yes| J[Check nvidia.com/gpumem limits] | ||
| I -->|No| K[Check libvgpu.so preload] |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Make the troubleshooting guide vendor-aware.
The guide supports heterogeneous hardware, but the new diagnostics assume NVIDIA resource names and NVIDIA runtime behavior.
docs/troubleshooting/troubleshooting.md#L24-L26: route OOM diagnosis to the vendor-specific memory resource.docs/troubleshooting/troubleshooting.md#L83-L90: label NVIDIA-only checks or add equivalent guidance for other supported vendors.docs/troubleshooting/troubleshooting.md#L100-L102: inspect allocatable resources without filtering onlynvidia.com.
Based on the PR objectives and the supplied vendor resource contract, these diagnostics must support more than NVIDIA.
📍 Affects 1 file
docs/troubleshooting/troubleshooting.md#L24-L26(this comment)docs/troubleshooting/troubleshooting.md#L83-L90docs/troubleshooting/troubleshooting.md#L100-L102
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/troubleshooting/troubleshooting.md` around lines 24 - 26, Make the
troubleshooting guide vendor-aware: at
docs/troubleshooting/troubleshooting.md:24-26, route OOM diagnosis to the
applicable vendor-specific memory resource instead of hard-coding NVIDIA; at
docs/troubleshooting/troubleshooting.md:83-90, label NVIDIA-only checks or
provide equivalent guidance for other supported vendors; and at
docs/troubleshooting/troubleshooting.md:100-102, inspect allocatable resources
without filtering exclusively on nvidia.com.
| - Since v2.3.10, HAMi has changed the `device-plugin` environment variable name from `NodeName` to `NODE_NAME`. If you are using an image version earlier than v2.3.10, the `device-plugin` may fail to start. | ||
|
|
||
| To resolve this issue, you have two options: | ||
| - Manually edit the DaemonSet using `kubectl edit daemonset` and update the environment variable from `NodeName` to `NODE_NAME`. | ||
| - Upgrade the `device-plugin` image to the latest version using Helm: |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Files:"
git ls-files | rg '(^|/)troubleshooting\.md$|docs/.*troubleshooting|sidebars\.js$' || true
echo
echo "Relevant docs lines:"
if [ -f docs/troubleshooting/troubleshooting.md ]; then
nl -ba docs/troubleshooting/troubleshooting.md | sed -n '1,120p'
fi
echo
echo "Search NodeName/NODE_NAME references:"
rg -n "NodeName|NODE_NAME|v2\.3\.10|device-plugin" -S . --glob '!vendor/**' --glob '!node_modules/**' | sed -n '1,200p'
echo
echo "Helm/manifest references to DEVICE plugins env:"
fd -a '.*' . | rg '(\.yaml$|\.yml$|Chart\.yaml$|values.*\.ya?ml$|README\.md$)' | while read -r f; do
case "$f" in
*/.git/*|*node_modules*|*/vendor/*) continue;;
esac
rg -n "NodeName|NODE_NAME|device-plugin" "$f" -S || true
done | sed -n '1,240p'Repository: Project-HAMi/website
Length of output: 1594
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "docs/troubleshooting/troubleshooting.md lines 1-120:"
awk 'NR>=1 && NR<=120 { NRp+=1; print NRp":" $0 }' docs/troubleshooting/troubleshooting.md
echo
echo "Relevant environment-variable/version references:"
rg -n "NodeName|NODE_NAME|v2\.3\.10|device-plugin" -S . --glob '!website/**' --glob '!node_modules/**' | sed -n '1,240p'
echo
echo "Manifest-like references in tracked files:"
git ls-files | rg '(^|/)(manifests?|config|helm|charts?|deploy|deployment|daemonset|values.*\.ya?ml|Chart\.yaml|README\.md)$|(\.yaml|\.yml|\.md)$|(\.yaml|\.yml|\.md)$' | while read -r f; do
case "$f" in
*/.git/*|*node_modules*|*/website/*|*/node_modules/*|*/vendor/*) continue;;
esac
if rg -n "NodeName|NODE_NAME|device-plugin" "$f" -S >/tmp/rg_match.$$; then
echo "FILE $f"
cat /tmp/rg_match.$$
fi
done
rm -f /tmp/rg_match.$$Repository: Project-HAMi/website
Length of output: 50377
🌐 Web query:
Project-HAMi/HAMi v2.3.10 device-plugin NodeName NODE_NAME
💡 Result:
In Project-HAMi/HAMi, the environment variable used by the device-plugin to identify the node was changed from NodeName to NODE_NAME starting in version v2.3.10 [1][2][3]. If you are running a device-plugin image version earlier than v2.3.10, the device-plugin may fail to start because it is looking for the deprecated NodeName variable [1][4]. To resolve this, you have two primary options: 1. Automatic Upgrade: Upgrade the device-plugin to the latest version using Helm, which automatically applies the correct environment variable configuration [1][5]: helm upgrade hami hami/hami -n kube-system 2. Manual Correction: If an upgrade is not immediately possible, you can manually update the DaemonSet configuration [1][6]: Execute kubectl edit daemonset to locate the device-plugin environment variable settings and change NodeName to NODE_NAME [2][7]. This change ensures the device-plugin correctly utilizes the node's information via the downward API (e.g., fieldPath: spec.nodeName) [8]. For current versions of HAMi, the configuration is explicitly set to NODE_NAME in the device-plugin DaemonSet templates [8].
Citations:
- 1: https://project-hami.io/docs/troubleshooting
- 2: https://project-hami.io/docs/v2.6.0/troubleshooting
- 3: https://docs.daocloud.io/community/hami.html
- 4: https://project-hami.io/docs/next/troubleshooting
- 5: https://project-hami.io/docs/v2.8.0/troubleshooting
- 6: https://project-hami.io/docs/v2.7.0/troubleshooting
- 7: https://project-hami.io/docs/v2.5.0/troubleshooting
- 8: https://github.com/Project-HAMi/HAMi/blob/v2.7.1/charts/hami/templates/device-plugin/daemonsetnvidia.yaml
Provide the correct pre-v2.3.10 manual fix.
NodeName is correct for pre-v2.3.10 device-plugin images. The manual option should say: keep NodeName for older images and change only to NODE_NAME when using v2.3.10 or later. Also update the command to name the DaemonSet and include -n kube-system.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/troubleshooting/troubleshooting.md` around lines 39 - 43, Update the
troubleshooting guidance to state that pre-v2.3.10 device-plugin images must
retain NodeName, while v2.3.10 and later use NODE_NAME. Revise the manual
kubectl edit daemonset command to specify the DaemonSet name and include the -n
kube-system namespace option.
| - **Check Scheduler Logs:** Use the following command to view why the HAMi scheduler rejected a pod: | ||
|
|
||
| ```bash | ||
| kubectl logs -n kube-system -l component=hami-scheduler | ||
| ``` |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
rg -n -C 4 'hami-scheduler|hami-device-plugin|app\.kubernetes\.io/name|component:' \
--glob '*.{yaml,yml}' .Repository: Project-HAMi/website
Length of output: 14568
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== README / docs quick start candidates =="
git ls-files | rg '(^README\.md$|docs/charts|charts|\.(yaml|yml)$)' | head -200
echo
echo "== locate HAMi chart manifests or docs referencing labels =="
rg -n 'app\.kubernetes\.io/name|hami-scheduler|hami-device-plugin|component:' \
--glob '*.md' --glob '*.mdx' --glob '*.{yaml,yml}' . | head -300
echo
echo "== doc section around cited lines =="
if [ -f docs/troubleshooting/troubleshooting.md ]; then
sed -n '60,115p' docs/troubleshooting/troubleshooting.md | cat -n
fi
echo
echo "== exact app.kubernetes.io/name=hami occurrences in repo =="
rg -n 'app\.kubernetes\.io/name: hamm|app\.kubernetes\.io/name:\s*hami' --glob '*.{yaml,yml}' . || trueRepository: Project-HAMi/website
Length of output: 50376
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== docs/verbal label usage for HAMi components =="
rg -n -C 2 'app\.kubernetes\.io/component=hami-(scheduler|device-plugin)|app\.kubernetes\.io/name=hami|kubectl logs -n kube-system -l (app|component)=hami' \
docs i18n --glob '*.md'
echo
echo "== troubleshooting section =="
sed -n '60,115p' docs/troubleshooting/troubleshooting.md | cat -n
echo
echo "== target lab examples around app=hami/name=hami =="
sed -n '300,330p' i18n/zh/docusaurus-plugin-content-docs-tutorials/current/labs/nvml-mock.md | cat -n
sed -n '295,305p' docs/get-started/verify-hami.md | cat -n
sed -n '198,221p' docs/installation/upgrade.md | cat -nRepository: Project-HAMi/website
Length of output: 14934
Use component labels for HAMi log selectors.
component=hami-scheduler would match any Pod with the same top-level label. Use the chart selectors used elsewhere, such as app.kubernetes.io/component=hami-scheduler and app.kubernetes.io/component=hami-device-plugin, so device-plugin logs are not included in the troubleshooting command at lines 71-75 and 104-105.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/troubleshooting/troubleshooting.md` around lines 71 - 75, Update the
HAMi log selectors in the troubleshooting commands near the scheduler and
device-plugin log guidance to use the chart label key
app.kubernetes.io/component with the corresponding component value, replacing
the broad component selector while keeping scheduler and device-plugin logs
distinct.
| <p> | ||
| <Translate id="manifest.generator.previewDesc">Copy this into your Kubernetes Pod or Deployment spec.</Translate> | ||
| </p> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Do not describe a Pod manifest as directly usable in a Deployment spec.
The generated YAML declares kind: Pod. A Deployment requires a spec.template and cannot accept this manifest unchanged. Add a workload selector that generates Deployment YAML, or state that users must move the container resources into spec.template.spec.
src/components/ManifestGenerator/index.js#L255-L257: Correct the preview instruction or add Deployment output.docs/userguide/interactive-manifest-generator.md#L10-L10: Describe the required Deployment template conversion.i18n/zh/docusaurus-plugin-content-docs/current/userguide/interactive-manifest-generator.md#L10-L10: Mirror the corrected English instruction.
📍 Affects 3 files
src/components/ManifestGenerator/index.js#L255-L257(this comment)docs/userguide/interactive-manifest-generator.md#L10-L10i18n/zh/docusaurus-plugin-content-docs/current/userguide/interactive-manifest-generator.md#L10-L10
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/components/ManifestGenerator/index.js` around lines 255 - 257, Correct
the ManifestGenerator preview text so the generated kind: Pod YAML is not
presented as directly usable in a Deployment; either add a Deployment output
mode or explicitly instruct users to place the container resources under
spec.template.spec. Update the corresponding guidance in
docs/userguide/interactive-manifest-generator.md at line 10 and mirror the
correction in
i18n/zh/docusaurus-plugin-content-docs/current/userguide/interactive-manifest-generator.md
at line 10.
| toc_max_heading_level: 2 | ||
| --- | ||
|
|
||
| This lab demonstrates how to deploy [SGLang](https://sgl-project.github.io/), a high-performance LLM serving framework optimized for RadixAttention, on a Kubernetes cluster using HAMi for GPU memory and compute isolation. Upon completion, you will have an OpenAI-compatible model service running SGLang on a partitioned GPU. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Update the SGLang documentation link.
The URL at Line 15 redirects to a moved page. Link directly to the current SGLang documentation destination. (sgl-project.github.io)
As per coding guidelines, external documentation links must be correct and use HTTPS.
Proposed fix
-This lab demonstrates how to deploy [SGLang](https://sgl-project.github.io/), a high-performance LLM serving framework optimized for RadixAttention, on a Kubernetes cluster using HAMi for GPU memory and compute isolation. Upon completion, you will have an OpenAI-compatible model service running SGLang on a partitioned GPU.
+This lab demonstrates how to deploy [SGLang](https://docs.sglang.io/), a high-performance LLM serving framework optimized for RadixAttention, on a Kubernetes cluster using HAMi for GPU memory and compute isolation. Upon completion, you will have an OpenAI-compatible model service running SGLang on a partitioned GPU.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| This lab demonstrates how to deploy [SGLang](https://sgl-project.github.io/), a high-performance LLM serving framework optimized for RadixAttention, on a Kubernetes cluster using HAMi for GPU memory and compute isolation. Upon completion, you will have an OpenAI-compatible model service running SGLang on a partitioned GPU. | |
| This lab demonstrates how to deploy [SGLang](https://docs.sglang.io/), a high-performance LLM serving framework optimized for RadixAttention, on a Kubernetes cluster using HAMi for GPU memory and compute isolation. Upon completion, you will have an OpenAI-compatible model service running SGLang on a partitioned GPU. |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@tutorials/labs/hami-sglang.md` at line 15, Update the SGLang hyperlink in the
lab introduction to point directly to the current HTTPS documentation
destination at sgl-project.ai, replacing the redirecting sgl-project.github.io
URL while preserving the surrounding description.
Sources: Coding guidelines, MCP tools
| SVC --> P1["SGLang Pod 1<br/>Meta-Llama-3-8B-Instruct<br/>1 GPU slot / 24 GiB"] | ||
| SVC --> P2["SGLang Pod 2<br/>Meta-Llama-3-8B-Instruct<br/>1 GPU slot / 24 GiB"] |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Align the architecture diagram with the Deployment.
Lines 40-41 show two SGLang Pods, but Line 79 sets replicas: 1. This conflicts with the one-virtual-GPU-per-replica description. Change the diagram to one Pod, or set replicas: 2 and update the resource prerequisites.
Also applies to: 79-79
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@tutorials/labs/hami-sglang.md` around lines 40 - 41, Align the SGLang
architecture diagram with the Deployment replica count: update the diagram
around SVC, P1, and P2 to show one Pod when replicas remains 1, preserving the
one-virtual-GPU-per-replica description.
| Wait for the SGLang pod to become `Running`. Since it needs to download the Llama 3 weights, this might take several minutes depending on your network speed. | ||
|
|
||
| ```bash | ||
| kubectl get pods -l app=sglang -w | ||
| ``` | ||
|
|
||
| Once running, port-forward the service to your local machine: | ||
|
|
||
| ```bash | ||
| kubectl port-forward svc/sglang-service 30000:30000 | ||
| ``` |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== locate file =="
git ls-files | grep -F 'tutorials/labs/hami-sglang.md' || true
echo "== relevant file excerpt =="
sed -n '1,230p' tutorials/labs/hami-sglang.md
echo "== search Sglang/sglang definitions =="
rg -n "sglang|SGLang|sglang-image|model|readiness|liveness|deployment|svc/sglang-service|kubectl port-forward" -S .Repository: Project-HAMi/website
Length of output: 277
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== repository root =="
pwd
echo "== top-level files/dirs =="
git ls-files | sed -n '1,120p'
echo "== files around hami-sglang =="
git ls-files | grep -i 'sglang\|hami' | sed -n '1,200p'
echo "== search target identifiers across repo =="
rg -n -i 'hami-sglang|sglang|SGLang|svc/sglang-service|kubectl port-forward|model initialization|model loading' . || trueRepository: Project-HAMi/website
Length of output: 22881
Wait for the SGLang backend to accept requests before using it.
kubectl get pods -w only watches the Pod phase. A Running SGLang container can still be loading model weights, so the port-forward or API request can fail. Use a bounded retry against the server, or add readiness-probe support that reflects the container/image readiness before the curl call.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@tutorials/labs/hami-sglang.md` around lines 153 - 163, Update the SGLang
startup instructions after the pod watch to wait for the backend to accept
requests before proceeding. Add a bounded retry against the SGLang API, or
configure a readiness probe that reflects model-loading completion, and ensure
the subsequent port-forward/curl flow runs only after readiness succeeds.
Source: MCP tools
…t generator Signed-off-by: harshit kudhial <harshitkudhial@gmail.com>
Fixes #743
Problem
Users must manually navigate various documentation pages to figure out the correct Kubernetes
resources.limitsannotations for their specific hardware vendor, increasing friction for new adopters.Solution
This PR introduces a native, interactive React component (
<ManifestGenerator />) directly into the Docusaurus User Guide. Users can select their target hardware vendor, memory mode, and core requirements to dynamically render a copy-pasteable, syntax-highlighted Kubernetes Pod configuration.Architectural Considerations
To ensure this component seamlessly integrates with the existing HAMi Docusaurus architecture, the following design decisions were made:
The YAML state generation utilizes
useMemoinstead ofuseEffect. This ensures the exact HTML for the YAML<CodeBlock>is generated server-side during the SSG build (npm run build), preventing layout shifts and hydration errors on the client.All UI text strings are strictly wrapped in
@docusaurus/Translatecomponents, allowing the localization team to seamlessly extract and translate the UI for the Chinese (zh) locale usingnpm run write-translations.All form inputs utilize strict
idandhtmlForpairings for screen readers. The component CSS module natively uses Infima CSS variables to instantly support Light/Dark mode toggling.Memory and Core inputs are strictly sanitized using
Math.max(0, parseInt(value))to prevent invalid YAML generation.Testing
npm run build:fastpasses with zero compilation/hydration warnings.Signed-off-by: harshit kudhial harshitkudhial@gmail.com
Summary by CodeRabbit
New Features
Documentation