動開啟 amd.com/gpu 設(shè)備插件支持)
在 minikube 中使用 AMD GPU基于 docker 驅(qū)動開啟 amd.com/gpu 設(shè)備插件支持【免費下載鏈接】minikubeRun Kubernetes locally項目地址: https://gitcode.com/gh_mirrors/mi/minikube本教程基于 site/content/en/docs/tutorials/amd.md 編寫講解如何讓 minikube 集群內(nèi)的 Pod 直接使用宿主機上的 AMD 顯卡ROCm 生態(tài)核心能力來自 Kubernetes 的 AMD GPU 設(shè)備插件k8s-device-plugin。讀完本文你將掌握從環(huán)境檢查、minikube start --gpus amd啟動、到提交 Job 驗證 GPU 可用的完整流程并理解 GPU 透傳在 minikube 內(nèi)部的實現(xiàn)原理與平臺限制。前置條件在開始之前請確保環(huán)境滿足以下要求項目要求操作系統(tǒng)LinuxAMD 顯卡驅(qū)動6.2.1 或更高版本minikubev1.35.0 或更高版本僅支持 docker 驅(qū)動需要特別說明的是AMD GPU 支持目前僅限 docker 驅(qū)動 docker 容器運行時組合這是由源碼層面的校驗邏輯強制保證的詳見下文參數(shù)校驗一節(jié)其他驅(qū)動如 KVM、VirtualBox或 containerd/cri-o 運行時均不支持。第一步確認 AMD 驅(qū)動已正確安裝minikube 的 GPU 支持建立在宿主機已有可用 AMD 驅(qū)動的基礎(chǔ)之上。可以通過rocminfo命令檢查驅(qū)動是否就緒rocminfo如果命令執(zhí)行失敗或未找到該命令說明驅(qū)動尚未安裝請按照 AMD 官方的 Radeon? 驅(qū)動安裝指南Radeon? Driver Installation Guide完成安裝后再繼續(xù)。驅(qū)動正常工作時rocminfo會列出系統(tǒng)里的 CPU/GPU HSA Agent 以及 ROCm 運行時版本等信息。第二步清理舊的 minikube 實例可選如果你在安裝 AMD 驅(qū)動之前已經(jīng)創(chuàng)建過 minikube 集群建議先刪除舊實例避免舊節(jié)點容器在啟動時無法掛載新安裝的 GPU 設(shè)備節(jié)點minikube delete這一步是可選的只有當已有實例是在安裝驅(qū)動前構(gòu)建的才需要清理。第三步以 AMD GPU 模式啟動 minikube使用--gpus amd標志啟動集群minikube start --driver docker --container-runtime docker --gpus amd該命令顯式指定了 docker 驅(qū)動和 docker 容器運行時并把 AMD GPU 透傳進 minikube 節(jié)點容器。--gpus標志的取值與校驗邏輯--gpus短標志-g是minikube start的一個全局選項源碼定義在 start_flags.gostartCmd.Flags().StringP(gpus, g, , Allow pods to use your GPUs. Options include: [all,nvidia,amd] (Docker driver with Docker container-runtime only))可接受的值包括all、nvidia、nvidia.com、amd。對應的校驗函數(shù)validateGPUs位于 start.go其約束可以總結(jié)為三點取值白名單只接受nvidia、nvidia.com、amd、all否則報錯The gpus flag must be passed a value of nvidia, nvidia.com, amd or all驅(qū)動與運行時組合必須是docker驅(qū)動且容器運行時為docker否則報錯The gpus flag can only be used with the docker driver and docker container-runtime宿主架構(gòu)僅支持amd64、arm64、ppc64le三種架構(gòu)見validateGPUsArch。這些約束同樣在單元測試 start_test.go 中被覆蓋驗證例如傳入amd docker 驅(qū)動 containerd 運行時會返回錯誤。底層實現(xiàn)GPU 設(shè)備如何透傳進節(jié)點容器啟動時--gpus的值會一路從命令行配置pkg/minikube/config/types.go 中的GPUs字段傳遞到 KICKubernetes in Container驅(qū)動的節(jié)點創(chuàng)建流程見 pkg/drivers/kic/kic.go。最終在 pkg/drivers/kic/oci/oci.go 中根據(jù)取值生成對應的容器運行參數(shù)switch p.GPUs { case all, nvidia: runArgs append(runArgs, --gpus, all, --env, NVIDIA_DRIVER_CAPABILITIESall) case nvidia.com: runArgs append(runArgs, --device, nvidia.com/gpuall) case amd: /* https://rocm.docs.amd.com/projects/install-on-linux/en/latest/how-to/docker.html * --security-opt seccompunconfined is also required but included above. */ runArgs append(runArgs, --device, /dev/kfd, --device, /dev/dri, --group-add, video, --group-add, render) }可以看到amd模式會把宿主機的/dev/kfdKernel Fusion DriverROCm 的核心內(nèi)核驅(qū)動設(shè)備和/dev/driDRM 渲染設(shè)備直接掛載進節(jié)點容器并把容器加入video與render組以獲取對應設(shè)備的訪問權(quán)限同時容器以--privileged和--security-opt seccompunconfined方式運行保證 ROCm 用戶態(tài)??梢哉TL問 GPU 設(shè)備。設(shè)備插件自動部署amd-gpu-device-plugin addon--gpus amd啟動時minikube 會自動啟用amd-gpu-device-pluginaddon對應配置見 pkg/addons/config.go。該 addon 由 pkg/minikube/assets/addons.go 注冊默認拉取rocm/k8s-device-plugin鏡像其實際部署清單是 deploy/addons/gpu/amd-gpu-device-plugin.yaml.tmpl以DaemonSet形式在每個節(jié)點上運行一個設(shè)備插件 Pod通過 hostPath 掛載/var/lib/kubelet/device-plugins與 kubelet 通信并掛載/sys用于枚舉 GPU 設(shè)備設(shè)置了system-node-critical優(yōu)先級與CriticalAddonsOnly容忍確保設(shè)備插件隨集群核心組件一同就緒設(shè)備插件向 kubelet 注冊后集群內(nèi)就會出現(xiàn)名為amd.com/gpu的可分配資源Pod 即可通過resources.limits[amd.com/gpu]申請 GPU當前模板僅面向amd64架構(gòu)的節(jié)點。驗證 GPU 在集群內(nèi)可用啟動完成后可以通過創(chuàng)建一個請求 GPU 的 Job 來驗證 AMD GPU 是否真正可用。1. 創(chuàng)建 GPU 檢查 Jobcat EOF | kubectl apply -f - apiVersion: batch/v1 kind: Job metadata: name: amd-gpu-check labels: purpose: amd-gpu-check spec: ttlSecondsAfterFinished: 100 template: spec: restartPolicy: Never securityContext: supplementalGroups: - 44 - 110 containers: - name: amd-gpu-checker image: rocm/rocm-terminal workingDir: /root command: [rocminfo] args: [] resources: limits: amd.com/gpu: 1 # requesting a GPU EOF關(guān)鍵點說明resources.limits[amd.com/gpu: 1]是向調(diào)度器聲明本 Pod 需要 1 塊 AMD GPU只有啟用了設(shè)備插件后該資源名才存在這也是驗證設(shè)備插件是否生效的最直接方式supplementalGroups中的 44video與 110render與上文中節(jié)點容器追加的--group-add video --group-add render保持一致確保容器內(nèi)的rocminfo能以正確的組權(quán)限訪問/dev/kfd與/dev/dricommand: [rocminfo]讓容器啟動后直接執(zhí)行 ROCm 自帶的 GPU 信息查詢工具ttlSecondsAfterFinished: 100讓 Job 在完成后 100 秒自動被清理。2. 查看 Job 日志kubectl logs jobs/amd-gpu-check如果一切正常輸出應類似下面這樣——能看到 ROCk 內(nèi)核模塊版本、HSA 系統(tǒng)屬性以及具體的 GPU Agent示例環(huán)境為帶 Radeon 780M 核顯的 AMD Ryzen 7 7840UROCk module version 6.8.5 is loaded HSA System Attributes Runtime Version: 1.14 Runtime Ext Version: 1.6 System Timestamp Freq.: 1000.000000MHz Sig. Max Wait Duration: 18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count) Machine Model: LARGE System Endianness: LITTLE Mwaitx: DISABLED DMAbuf Support: YES HSA Agents ******* Agent 1 ******* Name: AMD Ryzen 7 7840U w/ Radeon 780M Graphics Uuid: CPU-XX ...日志中出現(xiàn)完整的 HSA Agent 列表尤其是帶有 GPU 型號名稱的條目即表示 GPU 已被正確透傳進節(jié)點容器并被 ROCm 運行時識別集群內(nèi)的 GPU 能力驗證通過。深入學習 GPU 透傳GPU 透傳本質(zhì)上是把宿主機的 PCI/DRM 設(shè)備安全地暴露給虛擬機或容器。如果想要深入了解 PCI passthrough尤其是基于 OVMF 的完整虛擬化透傳方案可以參考 ArchWiki 上關(guān)于 PCI passthrough via OVMF 的文檔其中覆蓋了 IOMMU 分組、VFIO 綁定、ROM 與啟動參數(shù)等更底層的細節(jié)。為什么 Windows 上不支持 AMD GPUminikube 在 Windows 宿主機上主要通過 Hyper-V 或 VirtualBox 運行而這兩種虛擬化方案都難以實現(xiàn) AMD GPU 透傳VirtualBox其 PCI passthrough 功能不支持 Windows 宿主機無法把物理 GPU 設(shè)備直通給客戶機Hyper-V支持 DDA離散設(shè)備分配Discrete Device Assignment但該能力僅面向 Windows Server 2016 及之后的服務器版本提供而服務器操作系統(tǒng)并不是運行 minikube 的典型場景。正因為在 Windows 上唯一可能的 GPU 支持路徑落在用戶通常不會運行 minikube 的服務器系統(tǒng)上項目維護者沒有投入精力去實現(xiàn) Windows 上的 GPU 支持。因此如果你需要在 Windows 上做 AMD GPU 相關(guān)的本地開發(fā)當前可行的方式是使用 Linux 宿主機原生或 WSL2 內(nèi)的 Linux 環(huán)境運行 docker 驅(qū)動模式。小結(jié)在 minikube 中啟用 AMD GPU 的完整鏈路可以概括為宿主機安裝 AMD 驅(qū)動 →minikube start --driver docker --container-runtime docker --gpus amd透傳/dev/kfd與/dev/dri設(shè)備并自動部署amd-gpu-device-pluginaddon → 設(shè)備插件向 kubelet 注冊amd.com/gpu資源 → Pod 通過resources.limits申請 GPU 并運行 ROCm 工作負載。整個過程只需一條啟動命令加一個驗證 Job配合本文梳理的源碼實現(xiàn)參數(shù)校驗 start.go、設(shè)備透傳 oci.go、設(shè)備插件清單 amd-gpu-device-plugin.yaml.tmpl即可快速在本地搭建面向 ROCm 的 GPU 開發(fā)與測試環(huán)境?!久赓M下載鏈接】minikubeRun Kubernetes locally項目地址: https://gitcode.com/gh_mirrors/mi/minikube創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考