年初的时候老板火急火燎撒钱买了一台四路1080Ti服务器给实验室用作深度学习使用,结果火急火燎地买回来才发现很多深度学习框架对多GPU支持并不好,于是只能分开使用。想我也是经历过共用服务器的混乱,于是提议建立四个虚拟机,然后把整块物理GPU直接分配给各自虚拟机互不干扰,因为之前偶然看到过从Windows Server 2016开始,微软为Hyper-V虚拟机加入了物理设备直通(Discrete Device Assignment, DDA)的功能,允许虚拟机完全控制宿主机上的某些硬件(包括但不限于GPU,网络适配器等)。一开始以为应该也挺简单的,但实际上还是踩了很多坑才最终弄好。

关于Discrete Device Assignment的详细信息,可以查看微软虚拟化博客四连:

本文以这些相关官方博文为基础记录了直通显卡的一般流程,适合对DDA技术感兴趣的朋友入门尝鲜。此外,我封装了一个简单的带GUI的工具:

GUI工具测试系统为Windows Server 2016,据评论区反馈,最新的Windows Server 2019不能使用该工具。

显卡直通与RemoteFX的区别

DDA直通显卡是将整张显卡的控制权限移交给虚拟机,而类似RemoteFX技术则是将宿主机上的显卡虚拟化后为虚拟机提供一定的3D加速支持。简单来说:

DDA虚拟机中看到的是一张物理显卡,RemoteFX虚拟机中看到的是一张虚拟化后的显卡;

DDA虚拟机(理论上)可以使用物理显卡的任何特性,包括OpenCL、CUDA等等,而RemoteFX则不支持;

RemoteFX可以为虚拟机提供比较完备的3D加速功能,而DDA即便直通了显卡也不一定有完整的3D加速;

等等。

要求

物理设备直通对系统的硬件和软件都有一定的要求,除了需要宿主机的操作系统为Windows Server 2016 TP4以上版本外,还需要以下要求:

主板固件支持。你的BIOS(或UEFI)必须支持:SR-IOV、Access Control Service(ACS)等功能。根据主板型号的不同,有的可能需要你在在BIOS中手动开启,有的可能默认就已经支持,有的则可能需要更新BIOS版本。例如,在超微X10DRG-Q主板上,我就曾因为主板BIOS版本为2.0a而无法启用ACS,这个问题最后通过更新到2.0b得到解决。

设备支持。并非所以类型的设备都可以被直通到虚拟机中。具体可以通过微软提供的这个脚本来查询。此外,部分无良硬件厂商可能会刻意限制设备出现在虚拟机中,例如,英伟达在驱动层面对GeForce系列GPU做出了限制,当检测到虚拟化环境时,设备将抛出错误码43而拒绝工作。然而,只要你按照Github上开源的这个脚本屏蔽官方驱动的虚拟环境检测,就可以发现GeForce显卡可以非常完美地工作在虚拟机中。更新:2021年4月更新的英伟达驱动据说移除了GeForce显卡的直通限制,待验证。

虚拟机设置。一个虚拟机要接收直通的设备,其设置上有两点额外的要求。首先,如果虚拟机启用了动态内存,那么需要满足启动RAM==最小RAM;其次,虚拟机的“自动停止操作”必须为“强行关闭虚拟机”(新创建的虚拟机的默认设置为“保存虚拟机状态”)。

微软没有提供DDA的相关操作的GUI工具,关键操作只能通过PowerShell完成,这可能对不太熟悉Powershell的用户来说比较煎熬。

下面,我们以Tesla V100为例,将其从宿主机直通到目标虚拟机Test中。

步骤一:获取设备路径(Location Path)

设备路径在物理设备直通的过程中相当于设备的唯一描述符。下面的Powershell展示了如何获取名称以NVIDIA开头的设备的设备路径。

#获取所有名称以NVIDIA开头的设备

$pnpdevs = Get-PnpDevice -PresentOnly | Where-Object {$_.FriendlyName -like "NVIDIA*"}

#输出LocationPath

foreach ($pnpdev in $pnpdevs) {

$locationpath = ($pnpdev | get-pnpdeviceproperty DEVPKEY_Device_LocationPaths).data[0]

$pnpdev.FriendlyName + ": " + $locationpath

}

在我的机器上,可以得到下面的输出:

NVIDIA Tesla V100-SXM2-16GB: PCIROOT(0)#PCI(0300)#PCI(0000)#PCI(0C00)#PCI(0000)

NVIDIA Tesla V100-SXM2-16GB: PCIROOT(0)#PCI(0300)#PCI(0000)#PCI(0800)#PCI(0000)

NVIDIA Tesla V100-SXM2-16GB: PCIROOT(80)#PCI(0200)#PCI(0000)#PCI(0800)#PCI(0000)

NVIDIA Tesla V100-SXM2-16GB: PCIROOT(80)#PCI(0200)#PCI(0000)#PCI(0C00)#PCI(0000)

这个过程也可以通过设备管理器完成,如图所示:

步骤二:禁用设备

要被直通的物理设备将会被虚拟机独占使用,因此,操作系统需要确保宿主机没有其它应用在使用被直通的设备,因此在直通前禁用设备。

我们可以使用Disable-PnpDevice命令,通过设备的InstanceId来禁用设备。例如,在上文Powershell中获取$pnpdev对象后,继续执行:

disable-pnpdevice -InstanceId $pnpdev.InstanceId -Confirm:$false

这个过程同样可以通过设备管理器完成,如图所示:

步骤三:下线(Dismount)设备

这一步操作会将已经禁用的设备从操作系统中移除,使其变成可分配的状态。这一步只能通过Powershell完成。根据上面获得到的设备路径(Location Path),例如,"PCIROOT(0)#PCI(0300)#PCI(0000)#PCI(0C00)#PCI(0000)",运行下面的命令:

Dismount-VmHostAssignableDevice -locationpath "PCIROOT(0)#PCI(0300)#PCI(0000)#PCI(0C00)#PCI(0000)" -force

这一步是最可能出现错误的。许多硬件上的不兼容都会在这个步骤报错。

成功执行此步操作后,宿主机上的设备管理器将无法查看到该设备。

步骤四:分配设备

假设前面的步骤都已完成,这个时候就已经可以将下线后的设备分配给虚拟机了。这一步依然只能通过Powershell完成。将GPU分配到名称为Test的虚拟机中的命令如下所示:

Add-VMAssignableDevice -LocationPath "PCIROOT(0)#PCI(0300)#PCI(0000)#PCI(0C00)#PCI(0000)" -VMName Test

如果到这一步依然没有任何错误,那么设备已经成功直通到了虚拟机上。你可以通过下面的Powershell检查:

Get-VMAssignableDevice -VMName Test

在我的机器上,可以得到下面的输出:

InstanceID : PCIP\VEN_10DE&DEV_1DB1&SUBSYS_121210DE&REV_A1\6&3D280D5&0&00600018

LocationPath : PCIROOT(0)#PCI(0300)#PCI(0000)#PCI(0C00)#PCI(0000)

ResourcePoolName : Primordial

Name : 虚拟 PCI Express 端口设置

Id : Microsoft:C3B8CA0E-F6DA-417C-B6D6-DD9D68F7D899\EAEE9BF9-B29B-4D2E-970B-325F02812E83

VMId : c3b8ca0e-f6da-417c-b6d6-dd9d68f7d899

VMName : Test

VMSnapshotId : 00000000-0000-0000-0000-000000000000

VMSnapshotName :

CimSession : CimSession: .

ComputerName : TRAIN

IsDeleted : False

VMCheckpointId : 00000000-0000-0000-0000-000000000000

VMCheckpointName :

GPU额外步骤一:合并缓存写入

对于GPU相比于一般的外部设备速度很快,这使得如果我们允许对CPU合并对GPU显存的写入操作以提升性能。以Test虚拟机为例,运行下面的Powershell:

Set-VM Test -GuestControlledCacheTypes $true

GPU额外步骤二:扩大内存映射IO空间(Memory Mapped IO Space)大小

GPU需要的MMIO空间通常较大,当一个虚拟机分配到的设备所需要的MMIO空间综合超过了Hyper-V为其默认提供的大小时,在虚拟机操作系统中就会提示“没有足够的系统资源”的错误。

你可以在设备管理器右键设备-属性中看到设备所需的MMIO空间,如图所示:

根据内存范围,我们可以算出一张V100所需的MMIO大小为16MB+16384MB+32MB,其中,32位地址空间内需求16MB,64位地址空间内需求16384MB+32MB=16416MB。目前一个新建的Hyper-V虚拟机默认只为32位和64位地址空间分别提供了128MB和512MB的MMIO空间大小,这导致V100直接分配到虚拟机中是无法使用的。

32位和64位地址空间的MMIO大小可以通过下面的Powershell来分别修改,以Test虚拟机为例:

Set-VM Test -LowMemoryMappedIoSpace upto3000MB

Set-VM Test -HighMemoryMappedIoSpace upto33000MB

在这里,我为V100保留了17000MB的HighMemoryMappedIoSpace,保持LowMemoryMappedIoSpace不变。

结果展示

在虚拟机中安装NVIDIA驱动后,可以看到V100为正常的可用状态。

微软服务器dda,Hyper-V虚拟机的物理设备直通(Discrete Device Assignment, DDA)与显卡直通实践...相关推荐

  1. hyper v虚拟机启动黑屏怎么办?

    最近有用户打开VMware虚拟机却出现了开机一直黑屏的情况,挂起时能够看到显示,但是开机就黑屏.不知道该如何解决,小编为你带来hyper v虚拟机启动黑屏的解决方法,希望对你有帮助. 具体解决方法: ...

  2. 英伟达虚拟服务器显卡,英伟达开启显卡直通虚拟机功能 老显卡也可以

    虚拟机是非常重要的软件,但如果你手上没有性能强大的主机,那么体验并不好,特别是显卡方面.如今,英伟达将在GeForce显卡上开启GPU虚拟机直通功能,让消费显卡也可以直通虚拟机,从而带来更好的图形性能 ...

  3. [显卡直通]Server 2016/2019 Hyper-V显卡直通Win10教学及过程中会遇到的问题搜集以及详解-第一章DDA设备以及准备

    Hi,大家好我是游戏主播火线兔 火线兔讲废话环节 噗!为什么今天这么介绍自己这呢,是因为这期虚拟化的专题的启动是因为需要在直播的时候使用GPU编码技术,微软自带的RemoteFX技术是没有办法实现显卡 ...

  4. 微软自带虚拟机Hyper—V启用

    微软自带虚拟机 windows+r 快速启动运行页面,输入 control 或右键左下角windows标志–点击运行 跳转控制面板页面点击[程序] 点击[启用或关闭windows功能] 找到Hyper ...

  5. w7虚拟机服务器管理器,Hyper - V (五) 在Win7中安装Hyper - V 管理工具远程操作虚拟机...

    在Win7中安装Hyper - V 管理工具远程操作虚拟机 由于在Hyper - V 中安装的虚拟机运行时鼠标会出现延迟现象,所以我们可以在客户机Win 7 上安装虚拟机. 首先从microsoft ...

  6. hpgen8服务器修改电源模式,用HP GEN8+WIN2012+Hyper V+黑群晖5.2组建家庭NAS中心 篇二:HP GEN8硬件改造...

    用HP GEN8+WIN2012+Hyper V+黑群晖5.2组建家庭NAS中心 篇二:HP GEN8硬件改造 2017-11-19 15:55:35 127点赞 945收藏 205评论 追加修改(2 ...

  7. 微软服务器虚拟化-Hyper-v详解

    转眼间2012年已经到来,2011已经成为过去.回顾2011年,在开发和IT领域里有不少热点技术,如Web前端开发的CSS3和HTML5,Jquery等:移动操作系统的Android和Windows ...

  8. 浏览器上写代码,4核8G微软服务器免费用,Codespaces真香

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 一图胜千言 先上图,下面是欣宸在自己的iPad Pro ...

  9. WIN10安装Hyper V

    WIN10安装Hyper V 正常情况: Hyper-V是微软提出的一种系统管理程序虚拟化技术,能够实现桌面虚拟化. 正常情况下直接在控制面版->程序->程序和功能->启用和关闭Wi ...

最新文章

  1. CentOS 7.6安装OpenMPI3.1.0
  2. netty-客户端.group()方法 源码分析.md
  3. 简单的java多线程源码分享(二)
  4. centos 调整home分区xfs_Linux中对lvm逻辑卷分区大小的调整教程(针对xfs与ext4不同文件系统)...
  5. 10个Eclipse珍藏插件推荐
  6. 第67课 选择排序 例67.1 《小学生C++编程入门》
  7. mysql垃圾清理_mysql 垃圾图片清理
  8. MVC神韵---你想在哪解脱!(七)
  9. 188. 买卖股票的最佳时机 IV
  10. 解决 vim 中文编码问题
  11. android+解锁风格,Android手势解锁控件实现(仿京东金融手势解锁)
  12. android框架揭秘!Android开发你需要了解的那些事,附大厂真题面经
  13. windows消息钩子
  14. Java之阻塞和非阻塞以及同步和异步的区别
  15. 微信小程序、公众号侵权投诉流程
  16. what is the mes (mes系统是什么)
  17. 使用谷歌浏览器查看ws消息
  18. 01-生鲜项目-数据库表设计
  19. itools官方中文版2014 v2.0.3.8_苹果同步软件
  20. Go 每日一库之 gorilla/handlers

热门文章

  1. Ubuntun20.04安装wifi驱动
  2. python接口自动化44- requests 库使用 hook 机制
  3. 记一次steam修复未安装easy anti-cheat的经历
  4. java三对情侣参加婚礼,三对情侣参加一个聚会,参加婚礼穿情侣装合适
  5. 苹果AppStore已经莫名撤下超一百万个中国应用了
  6. linux如何执行python文件_以linux命令执行Python文件 - python
  7. 手机卡提示“限制服务”,原因和解决方法给你列好了!
  8. PPT办公软件网页素材资源下载类网站源码 dedecms织梦模板 利于SEO优化
  9. 极好用的win10精品软件推荐
  10. 一个批量数据导入的实现方案