版本:下一个
AMD GPU 测试状态
本页概述在真实 AMD GPU 上检查了什么、发现了什么,以及还剩什么。完整记录(为每个已合并的 PR 提供一行说明)见 STATUS.md,项目的简短介绍见 ONBOARDING.md。这两个文件涵盖 amd-device-plugin 和 amd-hami-core 两个仓库,以及 HAMi 中与 AMD 相关的 PR。
测试方式
- 一块真实的 AMD Instinct MI325X(单张 GPU,对机器呈现为虚拟功能),搭配 k3s、HAMi 调度器和由
main构建的插件,内核先是 6.8,后来是 7.0。dmem显存限制需要内核 6.14 或更新版本。 - 同一台机器上还运行了:真实的 AMD Device Metrics Exporter、作为第二个 DaemonSet 的上游 ROCm 插件、已发布的 0.0.2 和 0.0.3 镜像、UBI、alpine、fedora 和旧 glibc 镜像、ROCm 6.2 和 7.2,以及示例 Pod(PyTorch、TensorFlow、JAX 和 vLLM)。
- 多张 GPU 只为 HAMi 调度器做了模拟,方法是在节点注册信息中写入额外的 GPU。
已验证的内容
- **切片和 CU 掩码:**各 Pod 之间互不重叠,并且固定住以防
setenv。在 25% 的切片中,一个计算 kernel 的速度为每秒 215 个。没有库时,在进程内设置HSA_CU_MASK会把它放宽到 1015,有库时保持 215。 - **显存限制:**限制为 1 GiB 时,
hipMalloc3D、数组、内存池和hipMemCreate都返回内存不足,hipMemGetInfo报告 1 GiB。三个进程各申请 1.5 GiB、总限制 4 GiB:三轮中每一轮都恰好有两个成功。vLLM 引擎在 25% 的切片内运行,看到 16384 MiB。 dmem限制(内核 7.0),以及据此读取的按容器指标。- **队列优先级:**同一个 25% 切片上的两个进程,
AMD_TASK_PRIORITY为 0 和 3 时分别得到每秒 144.7 和 72.3 个 kernel,不设置优先级时各约 108.6。 - **插件生命周期:**已发布的 0.0.2 和 0.0.3 的升级与回滚、kubelet 重启(可分配量在 6 秒内恢复,运行中的 Pod 保持运行)、CDI,以及被 kubelet 拒绝的第二个插件。
- **健康状态:**真实的 Device Metrics Exporter 让健康的 GPU 保持完整的共享份数,测试用的 exporter 则把它降到 0 并发出节点事件。
- **HAMi 调度器功能:**显存百分比、命名空间 ResourceQuota、
mutex策略(以及binpack,mutex)、NUMA 和链路绑定、runtimeClassName、把核心请求向上取整到完整 WGP,以及端到端测试集(9 个用例通过,0 个失败,2 个跳过)。 - **本文档中的示例:**8 个示例清单都在该 GPU 上应用过。整卡、核心、显存和显存百分比的 Pod 都运行了,类型和 UUID 的 Pod 运行了,或者按其注释所说以
CardTypeMismatch或CardUuidMismatch保持Pending。 - 显存库的 C 测试在 AddressSanitizer、UBSan 和 ThreadSanitizer 下通过,glibc 2.34 检查也通过。
发现并修复的问题
重新运行每个已合并的 PR 发现了以下真实问题,均已修复。
- 不是由 HAMi 调度的 Pod 启动时失败,提示
no binding pod found。 - 固件测试在内核 7.0 上失败,因为 debugfs 的一行多了一个新字段。
- 启用
muslFailClosed时,第一个使用新镜像的 Pod 失败,之后每次重试也失败。 - 关闭
reportNodeCapacity后,节点上仍残留旧值。 - 镜像用一个存在已知标准库漏洞的 Go 版本构建,并且
go.mod使用了 gRPC 的开发标签。 - 使用
-resource_naming_strategy=mixed时,虚拟功能被命名为amd.com/spx_nps1,amd.com/gpu变成 0。 - 对
dpx、qpx和cpx,注册信息中每个分区的 XCC 为 0,因为 AMD SMI 只列出当前配置的 XCC。 - 在 HAMi master 上,类型为空的已注册 GPU 永远不会被选中,Pod 因
NodeInsufficientDevice保持Pending。该问题已在 HAMi 中修复。 - 带 init 容器的 Pod 没有得到切片限制(没有 CU 掩码、显存限制、hook 和
dmem限制),因为插件按应用容器索引,没有跳过 HAMi 首先写入的 init 容器槽位,Allocate因此退回到整张 GPU。该问题在 RX 9070 XT 上发现,已修复。
尚未验证的内容
- **多张 GPU、XGMI、NUMA 和策略顺序。**只运行了调度器的决策过程,并在注册信息中写入了额外的 GPU。需要一个真实的多 GPU Instinct 节点。
- **计算分区(
dpx、qpx、cpx)。**虚拟功能在两种运行模式下都能继续工作,切换会被跳过并输出一行日志,但切换本身、XCP 注册和分区上的 Pod 需要裸机 MI300、MI325 或 MI355。运行插件时设置OPERATING_MODE=partition和COMPUTE_PARTITION。 - RDNA 显卡。
- Device Metrics Exporter 报告的真实硬件故障。
- XNACK,即大于显存的
hipMalloc由主机内存提供(虚拟功能上 XNACK 是关闭的)。 - **双 GPU 的 JAX 示例和 vLLM 模型下载。**模型下载需要一个能访问 Hugging Face 的节点。
- 发布流程、arm64 和其他 Kubernetes 版本。
待解决的问题
- **核心默认值。**没有
amd.com/gpucores的请求会获得全部 CU,因此只设置amd.com/gpumem的 Pod 会占满该 GPU 的算力。需要共享 GPU 的 Pod 都应设置amd.com/gpucores。 - k3s 路径。
muslFailClosed的 chart 默认值是 RKE2 路径,因此在 k3s 上必须设置两个值(见配置)。