如果你手里有一台Windows Server 2025,并且正在为一堆虚拟机抢显卡而头痛,那么 GPU 分区(GPU Partitioning)技术值得你认真看一下。简单来说,它可以把一块物理 GPU 按需切分成多个逻辑分区,分给不同的虚拟机使用——每台虚拟机都能拿到独立的显存、编码器和计算资源,跑图形界面、视频编码或者 AI 推理都不再是空谈。相比独占整卡的 GPU 直通(DDA),GPU 分区能明显提升 GPU 利用率;相比纯软件 CPU 渲染,它又能提供接近原生的硬件加速。这篇文章从原理讲到落地,把我在 Windows Server 2025 上部署 GPU 分区时踩过的坑和你需要知道的细节都整理清楚了,适合已经会基本 Hyper-V 操作、想提升虚拟机图形性能的 IT 管理员。建议先收藏,后面照着做。
1. GPU 分区技术到底是干什么的,为什么非要上它
1.1 从 GPU 直通到分区共享:一个简单却很关键的转变
如果你想给虚拟机提供 GPU 加速,最先想到的往往是 GPU 直通(Discrete Device Assignment,也就是常说的 DDA)。DDA 的做法是把整块物理显卡直接分配给某一台虚拟机,性能和物理机几乎一致。但问题也很明显:这块卡一旦分配给 VM,宿主机就没法再用它,其它 VM 也完全摸不到,一块 24GB 显存的显卡只能服务于一台机器,资源浪费极其严重。要调整分配,还必须先把 VM 断电再重新配置,运维体验也算不上好。
Windows Server 2025 里你完全有另一条路可以走:GPU 分区。它借鉴了 CPU 虚拟化的思路,把物理 GPU 的显存、编码单元、解码单元、计算单元等抽象成可切分的资源,每个虚拟机分到一块“带刻度的蛋糕”。宿主机和虚拟机可以同时使用这块卡,多台 VM 之间也能共享同一个物理设备。虽然性能相比 DDA 会有一定损耗,但换来的是动态分配、高密度整合和更平滑的管理体验。对于大多数图形加速、视频转码、虚拟桌面场景来说,这个口感刚刚好。
1.2 GPU 分区的核心原理:像切蛋糕一样切显存和计算单元
GPU 分区在 Windows 这边的底层实现依赖的是 WDDM(Windows Display Driver Model)2.0 及以上的驱动模型。物理 GPU 的驱动栈把硬件能力暴露给 Hyper-V 的虚拟化层,再由虚拟化层按照管理员定义的参数,把 GPU 的 VRAM、编码器、解码器、CUDA/Compute 实例划分成多个逻辑分区,通过虚拟 PCIe 设备呈现给不同虚拟机。
你不需要写任何底层的代码,只需要调好几个关键参数:MinPartitionVRAM、MaxPartitionVRAM、OptimalPartitionVRAM 分别代表给虚拟机预留的最小、最大和最合适的显存区间;MinPartitionEncode、MaxPartitionEncode 控制硬件编码能力;MinPartitionDecode、MaxPartitionDecode 控制解码能力;MinPartitionCompute、MaxPartitionCompute 控制计算单元的分区大小。这些参数都是以字节为单位写入的,所以配置的时候要清楚自己到底想要多少 MB 或 GB。
Windows Server 2025 相比旧版本,在 GPU 分区的管理和脚本化支持上做了不少补齐。你不仅能在 Hyper-V 管理器里看到相关配置,还能通过 PowerShell 和 WMI 管理接口批量执行。也就是说,给几十台虚拟机统一添加 GPU 分区,完全可以用脚本一次搞定,这正是生产环境最需要的东西。
1.3 这么部署能解决哪些实际场景问题
我最早用 GPU 分区,是为了解决“多用户远程桌面性能差”的问题。公司里一台 16GB 显存的 GPU,过去只给一个研发同事做图形渲染,其他同事用远程桌面进去就是幻灯片。拆成 4 个分区后,4 台 Windows 11 虚拟机各拿 3GB 显存,跑 CAD、看视频、做简单的 3D 操作都流畅得多,一块卡活了 4 倍以上。
第二个常见场景是视频转码和推流。很多直播系统、媒体处理服务都跑在虚拟化环境里,GPU 分区可以让多路转码并行,降低 CPU 占用。第三个场景是 AI 推理。现在大家都在聊本地部署大模型,比如在虚拟机上跑 Ollama、跑本地大语言模型,GPU 分区能让你在一台物理机上隔离出多个推理环境,互不干扰。当然,真正要跑大模型训练,建议还是使用 DDA 直通,毕竟训练对显存带宽和稳定性的要求更高,分区会有性能损耗,这个后面我会说清楚。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 部署前,先检查你的硬件和系统是否够格
2.1 一张合适的 GPU,比什么都重要
GPU 分区虽然是用 WDDM 2.0 驱动模型来实现的,但不是所有显卡都能在 Hyper-V 上完美切分。根据我的测试经验,NVIDIA 的 RTX 系列、A 系列、AMD 的 Radeon Pro 系列,以及 Intel 的 Arc 系列,在 Windows Server 2025 上表现都不错。消费级显卡也能跑,只是稳定性没有专业卡那么让人放心。如果你的服务器是给生产环境用,我更建议选带显存校验、有官方虚拟化软件支持的型号。
驱动这一步千万不能省。宿主机上必须安装完整的、支持 WDDM 2.0 以上的厂商驱动,最好是当前最新的稳定版。装完之后不要急着配置,先重启一次,进入系统后打开设备管理器确认显卡没有报错。如果你在宿主机上都看到显卡有一个黄色的感叹号,那后面的所有操作都是徒劳。
另外,GPU 分区需要主板开启虚拟化相关的功能,也就是 Intel VT-x/VT-d 或者 AMD-V/AMD-Vi。这个在服务器的 BIOS 里一般默认开启,但如果是从老机器升级上来的,一定要手动检查。开启不了这个,Hyper-V 和 GPU 分区都不可能正常工作。
2.2 三行命令确认环境是否具备
动手之前,我通常会先跑三条命令,把系统和硬件状态摸清楚。
第一条是确认 Hyper-V 是否已经就绪。在管理员 PowerShell 里执行:
powershell复制systeminfo | findstr /i "Hyper-V"
如果输出里看到“已检测到虚拟机监控程序。将不显示该功能,因为已安装的虚拟机监控程序存在”或者类似的信息,说明虚拟化已经激活。如果看到“需要支持虚拟机监视器模式”,那就要去 BIOS 打开虚拟化功能。
第二条是查看当前系统的显示设备列表,拿到 GPU 的实例路径,这个路径后面用得上:
powershell复制Get-PnpDevice -Class Display | Format-List FriendlyName, InstanceId
你会看到类似 PCI\VEN_10DE&DEV_1EB8&SUBSYS_... 这样的 InstanceId,这就是物理 GPU 在系统里的唯一标识。如果一台机器有多张显卡,注意区分,别把型号搞混。
第三条是确认 Hyper-V 角色是否安装。如果还没有安装,直接执行后面第五节里安装角色的命令;如果已经安装,这条命令会显示状态:
powershell复制Get-WindowsFeature Hyper-V
2.3 先算清楚这台机器能分多少个 GPU 分区
规划分区数量和每台虚拟机的显存,是整个部署里最容易被忽略的一步。很多人想当然地觉得“16GB 显存,每台 4GB,那不就能分 4 台”,但实际还要考虑编码/解码切片、计算单元切片,以及宿主机本身需要的显存开销。我常用的做法是,把一张 16GB 显存的 GPU 分配给 4~5 台虚拟机,每台理论最大显存控制在 3GB,最优显存控制在 2GB。这样即使某台虚拟机突然申请大量显存,宿主机还有一段缓冲,不会被直接拖垮。
关于参数,我建议从以下数值起步,后续按压力测试调整:
| 参数项 | 建议起始值(字节) | 含义 |
|---|---|---|
| MinPartitionVRAM | 500000000(约 500MB) | 虚拟机启动时最少分配的显存 |
| MaxPartitionVRAM | 2000000000(约 2GB) | 虚拟机可增长到的最大显存 |
| OptimalPartitionVRAM | 2000000000 | 理想状态下保持的显存 |
| MinPartitionEncode | 500000000 | 硬件编码能力的最低下限 |
| MaxPartitionEncode | 2000000000 | 硬件编码能力的上限 |
| MinPartitionDecode | 2000000000 | 硬件解码能力 |
| MaxPartitionDecode | 2000000000 | 硬件解码上限 |
| MinPartitionCompute | 100000000 | 计算切片下限 |
| MaxPartitionCompute | 100000000 | 计算切片上限 |
显存和编码解码的单位虽然都是字节,但不同引擎的分配粒度不一样。建议第一次配置时宁小勿大,先给一个保守值,跑起来之后再通过测试逐步调高。我最开始给某台虚拟机的显存设成 4GB,结果导致另一台虚拟机在启动时报虚拟资源不足,后来把数值降到 2GB 才稳定。
3. Windows Server 2025 上 GPU 分区部署全流程实操
3.1 第一步:安装 Hyper-V 并准备好系统环境
如果这台 Windows Server 2025 还没装 Hyper-V,先在管理员 PowerShell 里执行:
powershell复制Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart
命令执行完系统会自动重启。重启之后,用 Get-WindowsFeature Hyper-V 确认角色状态是“已安装”。如果你用的是 Server Core 没有图形界面,那就通过 Windows Admin Center 或远程 PowerShell 管理,操作逻辑是一样的。
之后,把厂商最新的 GPU 驱动安装到宿主机。安装完成后用 Get-PnpDevice -Class Display 再次确认显卡状态为 OK,记下它的 InstanceId。这一步非常重要,因为后续添加 GPU 分区时,我们得靠它告诉 Hyper-V 你要分配哪一块物理卡。
3.2 第二步:创建虚拟机并打开代际 2 的“显示”门
GPU 分区要求虚拟机使用第二代(Gen2)配置。我一般会新建一台干净的 Windows 11 或 Windows Server 虚拟机作为模板,命令如下:
powershell复制New-VM -Name "GPU-VM-01" -Generation 2 -MemoryStartupBytes 8GB -BootDevice VHD -VHDPath "D:\VMs\GPU-VM-01\GPU-VM-01.vhdx" -SwitchName "Default Switch"
注意 -SwitchName 要根据你实际创建的虚拟交换机名称来填,如果没有交换机,可以先创建一个外部虚拟交换机,否则虚拟机连不上网络。内存大小建议至少给 8GB,毕竟虚拟机里要跑现代操作系统和图形应用,内存太小会掩盖 GPU 分区带来的性能提升。
对已经存在的 Gen2 虚拟机也可以直接使用,不需要额外设置“显卡”设备。GPU 分区的网卡/适配器是通过 PowerShell 加进去的,在 Hyper-V 管理器里看不到传统的“虚拟显卡切换”选项,别在图形界面上找它。
3.3 第三步:添加 GPU 分区适配器,并精确指定显存和算力
现在到了核心操作环节。在宿主机管理员 PowerShell 里,先声明虚拟机名称和 GPU 实例路径:
powershell复制$vmName = "GPU-VM-01"
$gpuInstance = (Get-PnpDevice -Class Display | Where-Object { $_.FriendlyName -like "*RTX*" }).InstanceId
然后把 GPU 分区适配器添加到虚拟机里:
powershell复制Add-VMGpuPartitionAdapter -VMName $vmName -InstancePath $gpuInstance
接着设置显存、编码、解码和计算参数。下面的脚本是我验证过的组合,适合给一台虚拟机分 2GB 显存:
powershell复制Set-VMGpuPartitionAdapter -VMName $vmName `
-MinPartitionVRAM 500000000 `
-MaxPartitionVRAM 2000000000 `
-OptimalPartitionVRAM 2000000000 `
-MinPartitionEncode 500000000 `
-MaxPartitionEncode 2000000000 `
-OptimalPartitionEncode 2000000000 `
-MinPartitionDecode 2000000000 `
-MaxPartitionDecode 2000000000 `
-OptimalPartitionDecode 2000000000 `
-MinPartitionCompute 100000000 `
-MaxPartitionCompute 100000000 `
-OptimalPartitionCompute 100000000
参数的单位是字节,所以 2000000000 代表 2GB。这里的 Encode 和 Decode 如果设成 0,等于关掉了硬件编解码能力,虚拟机里播放视频、开视频会议时会退回 CPU 软解,性能差距很明显。所以除非你明确不需要硬件编解码,否则不要填 0。
还没完,GPU 分区还需要调整虚拟机的内存映射空间。我用的是下面两个设置:
powershell复制Set-VM -VMName $vmName -GuestControlledCacheTypes $true
Set-VM -VMName $vmName -LowMemoryMappedIoSpace 1GB -HighMemoryMappedIoSpace 24GB
GuestControlledCacheTypes 允许虚拟机控制 GPU 的缓存类型,不开启这个,很多图形应用程序会报错。HighMemoryMappedIoSpace 要给得稍微宽裕一点,我通常按“虚拟机最大显存 + 4GB”来估算,2GB 显存给 6GB 也够,但为了稳妥建议至少 16GB。我这台机器用的是 24GB,跑大型模型推理时没有碰到地址空间不够的问题。
3.4 第四步:启动虚拟机,并在虚拟机内安装和验证驱动
配置完成后,直接启动虚拟机:
powershell复制Start-VM -Name $vmName
以管理员身份登录虚拟机系统,打开设备管理器。如果一切正常,你会看到一个显示适配器,名称可能是厂商的显卡型号,也可能是“Microsoft Hyper-V Video”。如果是后者,请手动安装与宿主机显卡对应的驱动。
这里有一个非常大的坑:很多人在虚拟机的设备管理器里看到“Microsoft Basic Display Adapter”就觉得失败了,其实不一定。你需要安装完整的显卡驱动,Windows Update 有时候能自动匹配,但有时候不会。我建议手动到显卡厂商官网下载对应型号的 Windows 驱动,安装时不要选精简版,要选完整版或 DCH 驱动。装好之后重启虚拟机,显卡应该就能识别为真实型号了。
验证方式很简单,在虚拟机内打开任务管理器,如果“性能”标签页出现 GPU 选项,并且能看到显存容量、编码器状态,说明 GPU 分区已经生效。也可以运行:
powershell复制dxdiag
查看“显示”页里的 Direct3D 加速是否显示“已启用”。看到这个,你就可以安心把 GPU 分区分给生产虚拟机了。
3.5 第五步(可选):把常用脚本存下来,方便排查和复用
命令行配置最大的优势就是可重复。我会把上面所有脚本整理成一个 PowerShell 函数,放在一个 Add-GpuPartition.ps1 文件里。每次创建新虚拟机,只需要调用函数传入虚拟机名,剩下的参数自动填充。这样不仅提高效率,还避免手动敲错参数。
脚本里也可以加上校验逻辑:确认虚拟机存在、确认 InstancePath 存在、确认当前没有运行中的同名虚拟机。尤其要注意,修改 GPU 分区参数时,虚拟机必须处于关闭状态。如果你在 VM 运行中执行 Set-VMGpuPartitionAdapter,会直接报错“无法在运行时修改”。所以脚本开头加一行检查比较稳妥:
powershell复制if ((Get-VM -Name $vmName).State -eq 'Running') { Stop-VM -Name $vmName -Force }
这一行放在修改参数前,能省去很多来回折腾。
4. 部署中最容易翻车的几个点,我都帮你踩过了
4.1 虚拟机内显卡驱动装不上,错误代码 43
错误 43 是 GPU 分区部署里的头号敌人。我第一次配置时,虚拟机里始终报“Windows 已停止此设备,因为其已报告问题 (代码 43)”,换了三个驱动版本都无效。后来发现是我把 MinPartitionVRAM 设得太低,只给了 64MB,导致虚拟机里的显卡驱动初始化失败。
解决办法是:把 MinPartitionVRAM 提高到 500MB 以上,同时检查 HighMemoryMappedIoSpace 是否够大。不要低于 8GB。如果你已经设了还是报错,先删掉 GPU 分区适配器,重新添加,然后让虚拟机用 Windows Update 自动安装驱动,观察是否成功。如果自动安装后能识别,再手动升级到最新版本。
4.2 GPU 分区只显示有显存,但 3D 加速无法开启
有时候你在虚拟机里看任务管理器,GPU 确实存在,显存也正确,但跑一个 3D 应用却提示“无法创建 3D 设备”,这时候先查 GuestControlledCacheTypes。
我之前有一台 VM 始终无法开启硬件加速,排查了半天,发现是没有设置这个参数。Windows 的 GPU 分区依赖这个标志来协调宿主机和客户机之间的缓存访问,如果你用 GUI 创建虚拟机、没有走 PowerShell,很容易漏掉它。补上 Set-VM -GuestControlledCacheTypes $true 并重启虚拟机,问题就消失了。
另一个常见原因是 Hyper-V 的版本或虚拟机配置版本太旧。Windows Server 2025 默认创建的是最新配置版本,但如果你是从旧服务器导入的 VM,可能出现兼容问题。建议把所有要用 GPU 分区的虚拟机先升级到当前版本:Update-VMVersion -Name $vmName。
4.3 多台 VM 同时启动后性能崩溃
GPU 分区的确能把一块卡分给多个 VM,但并不是无限制的。如果宿主机的显存是 12GB,你给每台虚拟机 MaxPartitionVRAM 都设成 8GB,然后同时启动 3 台,那么宿主机上的虚拟化层会严重超卖,轻则卡顿,重则直接蓝屏。
我的做法是先统计总需求:所有 VM 的 OptimalPartitionVRAM 之和不要超过物理显存总量的 80%。比如 16GB 显存,所有 VM 的理想显存总和控制在 12.8GB 以内。同时,在宿主机任务管理器里打开“GPU”监控,观察 Dedicated GPU Memory 的使用情况。如果长期在 90% 以上,就说明你超卖了,应该减少并行的 VM,或者降低每台的最大显存。
要注意的是,GPU 分区的“显存”并不等于物理显存完全隔离。它更像是一种上限控制,实际运行时虚拟机可以动态扩展显存,直到达到 MaxPartitionVRAM。所以即便设置合理,也要留出物理页面的交换余量。生产环境建议在低峰期做一次“全量并发”压力测试,确认所有 VM 同时满载时不会 OOM。
4.4 远程桌面进去黑屏,只能看到鼠标指针
这个问题在图形密集型虚拟机里很常见。大部分情况是因为 GPU 分区分配成功,但虚拟机内的显卡驱动仍是“Microsoft Basic Display Adapter”,无法正确渲染桌面会话。先去 Hyper-V 控制台登录,把显卡驱动装好,再通过远程桌面连接。如果驱动已经装好还是黑屏,检查远程桌面设置里的“持久位图缓存”是否开启,关闭这个选项有时能规避显示异常。
黑屏还有一个隐性原因:你把虚拟机的显存分得太少,比如只有 256MB,Windows 桌面合成器会因为显存不足而无法初始化。把 OptimalPartitionVRAM 提到 1GB 以上,绝大多数黑屏问题都能解决。
4.5 宿主机上的 GPU 和虚拟机里的 GPU 型号不一致
如果你在设备管理器里看到虚拟机里的显卡型号是“Microsoft Remote Display Adapter”或“Hyper-V Video”,而不是物理 GPU 型号,大概率是 GPU 分区适配器没有正确绑定。回宿主机会话执行:
powershell复制Get-VMGpuPartitionAdapter -VMName $vmName
检查 InstancePath 是否指向物理 GPU。如果输出为空,说明你之前没有执行 Add-VMGpuPartitionAdapter。如果路径不对,用 Remove-VMGpuPartitionAdapter 删掉,再重新指定正确的 InstanceId。
我推荐一个通用命令,直接把 Instances 里所有可用的显示适配器都打出来对照:
powershell复制Get-PnpDevice -Class Display | Select-Object FriendlyName, InstanceId, Status
这样能避免选到远程桌面虚拟显示设备或 GPU 的内置输出设备。
5. 把 GPU 分区用好的几个长期维护技巧
5.1 用 PowerShell 批量查看和管理所有虚拟机的 GPU 分区
生产环境里管理员最头疼的就是几十台虚拟机怎么统一管理。GPU 分区的配置项很多,手动查看根本不现实。我平时会写一段小脚本,把所有 VM 的 GPU 分区状态导出来:
powershell复制Get-VM | ForEach-Object {
$adapter = Get-VMGpuPartitionAdapter -VMName $_.Name -ErrorAction SilentlyContinue
if ($adapter) {
[PSCustomObject]@{
VMName = $_.Name
Status = $_.State
GPUInstancePath = $adapter.InstancePath
MinVRAM = $adapter.MinPartitionVRAM
MaxVRAM = $adapter.MaxPartitionVRAM
OptimalVRAM = $adapter.OptimalPartitionVRAM
}
}
} | Format-Table -AutoSize
这条命令隔一段时间跑一次,能很直观地看到每一台虚拟机的显存分区间。如果某台 VM 异常占用了大量显存,你也可以在宿主机任务管理器的“GPU”详情里按进程定位到虚拟机对应的 VMWP.exe 进程,观察它消耗的共享 GPU 内存。
5.2 动态修改显存参数的正确姿势
有时候你会遇到某台虚拟机需要临时加大显存跑一次大任务,此时直接执行 Set-VMGpuPartitionAdapter 会报错,因为虚拟机的电源状态还在运行。正确操作是先关闭虚拟机,修改参数,再启动虚拟机。
如果是批量修改,我建议把 Set-VM 和 Set-VMGpuPartitionAdapter 放到同一个脚本里,先 Stop-VM,再设置,最后 Start-VM。但要注意,如果这台 VM 上有正在运行的业务,强行关机可能造成数据损坏。比较稳妥的方式是,先用 Checkpoint-VM 创建一个检查点,修改后再合并检查点。这样即使配置出了问题,也能快速回滚。
powershell复制Checkpoint-VM -Name $vmName -SnapshotName "Before-GPU-change"
Stop-VM -Name $vmName
# 执行设置命令
Start-VM -Name $vmName
5.3 什么时候不适合用 GPU 分区,别硬上
GPU 分区不是万能的。如果你要跑深度学习训练,需要最高级的 CUDA 性能和完整的驱动栈,建议还是用 DDA 直通,或者直接在物理机上跑。分区之后的计算单元切片无法做到物理卡那样全速运转,大规模矩阵运算会有明显损耗。
另外,很多专业级软件(比如某些工业建模软件)会校验显卡驱动的签名和功能级别。在 GPU 分区环境下,Windows 暴露给应用的驱动信息虽然显示为真实型号,但底层毕竟经过了一层虚拟化,个别软件可能会拒绝运行。这种场景也不是不能解决,但需要做一轮完整的软件兼容性测试,不能直接上生产。
最后,如果你的虚拟机只是跑普通的办公软件、看网页视频,那 GPU 分区带来的收益不大,默认的虚拟显示适配器转换桌面时基本够用。GPU 分区消耗的是宿主机的 GPU 资源,也占用内存映射空间,没必要为了一句“有硬加速”而牺牲整台宿主机的稳定。
5.4 不同显卡混插时的调度心得
如果你的服务器里插了两张不同型号的显卡,比如一张 NVIDIA 和一张 AMD,添加 GPU 分区时要特别注意 InstancePath。不要只凭 FriendlyName 判断,因为 Windows 可能把两个设备都显示成“显示适配器”。我踩过这个坑,想把第二块 AMD 卡分给 VM,结果 InstancePath 写成了 NVIDIA 的,添加后虚拟机始终不亮。排查了很久才发现,Get-PnpDevice 的返回顺序不是按插槽顺序来的。
我的做法是先用 pnputil /enum-devices /class Display 或者 Get-PnpDevice -Class Display -PresentOnly 列出所有显示设备,再对照设备管理器里的位置信息确认哪张卡对应哪个 InstanceId。之后在 Add-VMGpuPartitionAdapter 里显式指定 InstancePath,绝不省略。如果不指定,PowerShell 可能会把当前可用的所有 GPU 分区适配器都加到 VM 里,导致多张卡混在一起,配置反而更混乱。
其实这张部署配置不仅适合 Windows Server 2025,后面继续升级系统时也可以沿用。我个人建议你先把这份实操笔记收藏起来,等真想用的时候,至少能少走两三个小时的弯路。如果你第一次配置就能一次点亮虚拟机里的 GPU,那说明你已经把这些要点吃透了。GPU 分区是一个值得长期使用的虚拟化手段,但务必记住:先测试,再上线;先规划,再分配;先备份,再变更。
