共计 1851 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在 AI 训练和高性能计算场景中,GPU 资源的高效利用一直是个难题。很多团队面临这样的情况:

- 单台 8 卡 A100 服务器常被单个任务独占,但实际利用率可能不足 30%
- 不同项目对算力需求差异大(有的需要整卡,有的只需 1 / 4 算力)
- 抢占式使用导致资源调度混乱,排队现象严重
传统物理卡分配方式就像把整栋公寓租给一个人,而虚拟化技术能实现 ” 合租 ”,让多个任务共享硬件资源。
技术选型对比
当前主流的 GPU 虚拟化方案有三种:
- 容器化方案(Docker/Kubernetes)
- 优点:轻量级、启动快
-
局限:无法实现算力切片,仍以整卡为最小单位
-
Kubernetes 设备插件
- 优点:适合云原生环境
-
局限:需要额外开发插件,NVIDIA 官方方案对 A100 支持有限
-
KVM 全虚拟化
- 优势:支持 SR-IOV 和 MDEV 硬件虚拟化
- 特点:能实现算力时间片级分配(vGPU)
对于需要精细控制算力的场景,KVM+PCIe 直通是目前 A100 最成熟的方案。
核心实现步骤
PCIe 直通配置
先确认 BIOS 开启 VT- d 和 SR-IOV 支持,然后隔离 GPU 设备:
# 查看 GPU 设备地址
lspci -nn | grep NVIDIA
# 输出示例:01:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b5]
# 将设备从主机解绑
echo "0000:01:00.0" > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
# 绑定到 vfio 驱动
echo "vfio-pci" > /sys/bus/pci/devices/0000:01:00.0/driver_override
Libvirt 域配置
创建虚拟机 XML 配置文件时关键部分:
<domain type='kvm'>
<devices>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</hostdev>
<!-- 必须开启 IOMMU -->
<iommu model='intel'>
<driver intremap='on'/>
</iommu>
</devices>
</domain>
vGPU 时间片配置
A100 支持通过 MDEV 实现算力分割,创建虚拟 GPU 设备:
# 查看可用 vGPU 类型
ls /sys/class/mdev_bus/0000:01:00.0/mdev_supported_types
# 创建 1 / 4 算力的 vGPU 实例
uuidgen > /sys/class/mdev_bus/0000:01:00.0/mdev_supported_types/nvidia-63/create
性能考量
虚拟化开销测试
使用 NGC 官方 PyTorch 镜像测试 ResNet50 训练性能:
| 场景 | 吞吐量 (images/sec) | 延迟 (ms) |
|---|---|---|
| 裸金属 | 1250 | 2.1 |
| KVM 直通 | 1220(97.6%) | 2.3 |
| 1/4 vGPU | 300(24%) | 8.5 |
多租户隔离
关键保障措施:
- 使用 cgroups 限制每个 VM 的 CUDA 流处理器使用率
- 通过 NVML 设置功率上限:
nvidia-smi -i 0 -pl 200 # 限制 200W 功耗 - 启用 ECC 内存纠错,防止相邻 VM 干扰
避坑指南
驱动兼容性问题
- 症状 :虚拟机内 nvidia-smi 报错 ”GPU is lost”
- 解决方案 :
- 确保主机和虚拟机使用完全相同的驱动版本
- 在 QEMU 参数中添加:
-cpu host,kvm=off,hv_vendor_id=null
内存带宽优化
当多个 vGPU 共享显存通道时,建议:
- 在 BIOS 中启用 NUMA 节点绑定
- 为每个 vGPU 分配固定比例的显存带宽:
nvidia-smi -i 0 -lmc 70 # 限制显存带宽为 70%
总结与展望
通过 KVM 虚拟化,我们实现了:
– 单卡 A100 可同时支持 4 个训练任务
– 资源利用率从 30% 提升至 85%+
– 支持动态调整算力配额
未来可探索方向:
1. 与 Kubernetes 调度器集成实现自动扩缩容
2. 基于使用量的计费系统开发
3. 跨节点 vGPU 迁移技术
思考题
- 如何设计监控系统来检测 vGPU 的资源争用情况?
- 在混合精度训练场景下,vGPU 的时间片分配策略需要做哪些调整?
- 当物理 GPU 发生故障时,虚拟化层该如何实现快速故障转移?
正文完
