HAMi vGPU 方案的 GPU 核心与显存隔离效果验证
本文针对开源虚拟 GPU 解决方案 HAMi 的 GPU 核心算力及显存资源隔离能力进行了实际测试。
测试结论简述
- 核心算力隔离:Pod 所能使用的 GPU 计算能力会在设定值上下波动,但在较长时间维度上其平均利用率与所申请的核心比例基本相符。
- 显存资源隔离:当 Pod 请求的 GPU 显存超出分配上限时,程序将立即触发 CUDA Out of Memory 错误。
测试环境配置
实验采用以下软硬件配置:
- 物理 GPU 设备:NVIDIA A40 × 2
- Kubernetes 版本:v1.23.17
- HAMi 插件版本:v2.3.13
基础依赖部署
首先通过 NVIDIA GPU Operator 完成驱动和容器运行时组件的自动安装。相关操作可参考官方文档或社区指南。
随后按照 HAMi 官方指引完成插件部署,确保集群支持 vGPU 功能。
测试镜像准备
docker pull pytorch/pytorch:2.4.1-cuda11.8-cudnn9-runtime
测试脚本来源
选用 PyTorch 示例项目中的 ImageNet 训练代码作为负载模拟工具:
https://github.com/pytorch/examples/tree/main/imagenet
该示例程序会输出每次迭代执行耗时,便于观察不同资源配额下的性能变化。
使用方式
git clone https://github.com/pytorch/examples.git
cd /mnt/imagenet/
python main.py -a resnet18 --dummy
强制策略设置
为保证资源控制生效,需在 Pod 环境变量中添加 GPU_CORE_UTILIZATION_POLICY=force,否则仅单个 Pod 使用 GPU 时不启用算力限制机制。
完整部署清单
以下 YAML 文件展示了如何以 HostPath 形式挂载训练脚本并指定不同的核心占比(如 30% 和 60%)进行对比测试。
apiVersion: v1
kind: Pod
metadata:
name: hami-test-pod
namespace: default
spec:
containers:
- name: app-container
image: pytorch/pytorch:2.4.1-cuda11.8-cudnn9-runtime
command: ["python", "/mnt/data/main.py", "-a", "resnet18", "--dummy"]
resources:
requests:
cpu: "4"
memory: "32Gi"
nvidia.com/gpu: "1"
nvidia.com/gpucores: "30"
nvidia.com/gpumem: "20000"
limits:
cpu: "4"
memory: "32Gi"
nvidia.com/gpu: "1"
nvidia.com/gpucores: "30"
nvidia.com/gpumem: "20000"
env:
- name: GPU_CORE_UTILIZATION_POLICY
value: "force"
volumeMounts:
- name: code-mount
mountPath: /mnt/data
- name: shared-memory
mountPath: /dev/shm
restartPolicy: Never
volumes:
- name: code-mount
hostPath:
path: /root/project/examples/imagenet
type: Directory
- name: shared-memory
emptyDir:
medium: Memory
CUDA 核心算力隔离测试
30% 算力场景表现
查看日志发现每轮训练步长约为 0.6 秒,且 Grafana 监控图表显示整体 GPU 利用率维持在 30% 左右浮动。
Epoch: [0][ 11/5005] Time 0.605 ( 0.806) ...
Epoch: [0][ 21/5005] Time 0.605 ( 0.706) ...
...
60% 算力场景表现
将核心配额调整至 60%,对应地,处理延迟降低至约 0.3 秒,同时监控数据显示 GPU 平均占用率趋近于目标值。
Epoch: [0][ 11/5005] Time 0.227 ( 0.597) ...
Epoch: [0][ 21/5005] Time 0.234 ( 0.413) ...
...
GPU 显存资源隔离测试
资源配额检查
进入容器后执行 nvidia-smi 查看可用显存量应为 20GB。
+-------------------------------+----------------------+----------------------+
| 0 NVIDIA A40 Off | 00000000:00:07.0 Off | 0 |
| 0% 30C P8 29W / 300W | 0MiB / 20000MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
OOM 行为验证脚本
编写一段简单的 Python 脚本来动态申请指定大小的 GPU 内存块,并捕获异常判断是否达到边界。
import torch
import sys
def request_gpu_memory(mb_size):
elements = mb_size * 1024 * 1024 // 4
try:
tensor = torch.empty(elements, dtype=torch.float32, device='cuda')
print(f"{mb_size} MB successfully allocated.")
except RuntimeError as e:
print(f"Allocation failed due to OOM: {e}")
if __name__ == "__main__":
size = int(sys.argv[1]) if len(sys.argv) > 1 else 1024
request_gpu_memory(size)
测试结果分析
尝试分配恰好等于限额的 20000MB 数据时报错退出;而请求略低于阈值的 19500MB 则顺利完成,表明内存隔离逻辑有效实施。
# 失败案例:
Failed to allocate 20000 MB on GPU: OOM.
# 成功案例:
Successfully allocated 19500 MB on GPU.
总结
综上所述,HAMi 提供的 vGPU 技术能够较好满足多租户环境中对 GPU 算力与显存资源的精细化管控需求:
- 对于算力调度,能够在允许范围内合理调节任务吞吐速度;
- 对于显存管理,则实现了硬性容量封顶,避免非法超额占用影响其他工作负载。