草庐IT

GPU虚拟化

hinzer 2023-12-23 原文

GPU 虚拟化技术

须知: 文章内容大程度参考B站王利明老师对《GPU虚拟化技术分享》的主题演讲
视频链接: https://b23.tv/uQKBpcK

1 GPU 和软件架构

GPU可以用于图形渲染,GPU 作为加速图形绘制的芯片时,它主要面向的产品主要是会集中在 PC 和游戏两个市场。也能够用于高性能计算领域(GPGPU)和编解码场景(子模块)等。

下图将软件系统中的 GPU 子系统抽象了几层概念,在 GPU 上的经典软件架构(不含虚拟化),分别适用到 通用计算领域图形渲染领域 两类场景。

图:GPU 的典型软件架构(不含虚拟化)

2 GPU 和虚拟化

虚拟化使用软件在计算机硬件上创建抽象层,能够将单个计算机的硬件元素(包括处理器、内存、存储器等)分成多个虚拟计算机,通常称为虚拟机 (VM)。 GPU 虚拟化是系统软硬件模拟 GPU 资源,以支持虚拟机方案。

3 GPU 虚拟化需求

体现在资源共享和资源隔离两方面

  • 资源共享的需求:GPU 性能越来越强大,需要多租户(多容器和多虚机)共享资源。应用场景如多屏车机、本地桌面虚机、远程桌面(桌面虚拟化)、云 GPU 虚机。
  • 资源隔离的需求:要保证多租户互不影响,应用场景如显存隔离、算力隔离、故障隔离。

4 GPU 虚拟化技术

虚拟化技术实现体现三个层次,即用户层、内核层和硬件层。然后在根据技术的应用场景分为隔离场景(容器和虚机)和硬件场景(虚拟桌面、渲染和 AI 计算)两个维度,不同的技术可能仅适用它对应的的场景。技术实现可分类为:

  • 用户层:API 拦截和 API forwarding
  • 内核层:GPU 驱动拦截
  • 内核层:GPU 驱动半虚拟化:Para Virtualization
  • 硬件层:硬件虚拟化:Virtualization
  • 硬件层:SRIOV:Single Root I/O Virtualization
  • 硬件层:Nvidia MIG:Multi-Instance GPU

5 GPU 用户层虚拟化

1)本地 API 拦截和 API forwarding

  • 在用户态实现一个函数库,假设叫 libwrapper ,它要实现底层库的所有 API
  • 让 APP 调用这个 libwrapper => 如何实现?底层动态库 + 用dlopen打开
  • libwrapper 拦截用户的函数调用,对函数进行解析,然后使用参数去调用实际的底层库相同名称的函数
  • 调用完成后,libwrapper 把结果返回给 APP

2)远程 API forwarding

  • libwrapper 通过网络,去调用不同机器上的底层库
  • libwrapper 变成两部分,client 用于转发,和 server 用于接收和调用
  • 可以实现 GPU 池化(即多个 GPU 可以组成调用池,由多个 client 来调用),可以做到不具备 GPU 的机器能实现 GPU 的功能

3)半虚拟化 API forwarding

  • APP 和 libwrapper 运行在虚机中
  • libwrapper 通过半虚拟化方式(virtio)进行通讯,调用宿主机的底层库
  • 虚机的内核要实现 virtio frontend => 优化点? 虚机和宿主机共享内存加速数据传递
  • 宿主机的 hypervisor 实现 virtio backend
  • 宿主机完成底层库的调用

6 GPU 内核层虚拟化

1)内核模块通过设备文件拦截
内核拦截模块模拟一个设备文件,内核拦截模块将用户进程的访问转发到(真实的)驱动软件,然后将对应内核函数的返回解析,再返回用户态。

  • 通常底层库通过设备文件访问 GPU 驱动的功能,假设为 /dev/realgpu
  • 实现一个内核模块,输出模拟的设备文件给用户空间,假设为 /dev/realgpu
  • 把模拟的设备文件 bind mount 到容器里,伪装成真的设备文件 /dev/realgpu
  • APP 和底层库都在容器里运行,底层库访问伪装的设备文件 /dev/realgpu,此时所有访问被内核模块拦截

2)驱动半虚拟化
用户进程通过系统虚拟化层(hypervisor)提供的虚拟化接口,访问(真实的)虚拟化接口。

  • APP 和底层库都在虚机里
  • 虚机的 GPU 驱动实现半虚拟化接口,通过类似 hypercall 的方式,调用宿主机实际的 GPU 驱动
  • hypercall 切换 guest 到 hypervisor, hypervisor 通过内核中的驱动代理来访问实际的 GPU 驱动

例如,车机中的 GPU 虚拟化。基于 type 1 的 hypervisor 虚拟化技术,支持多个 Guest。

7 GPU 硬件层虚拟化

虚拟化需要软件和硬件结合才能实现,其中需要硬件的支持的部分包括

  • 支持 CPU 和内存的硬件虚拟化
  • 支持 IOMMU
    • DMA remapping和Interrupt remapping
    • 硬件隔离和页表机制

8 GPU 全虚拟化

该方案实现了将整个 GPU 透传给虚拟,严格来说不算虚拟化领域,因为无法实现 GPU 资源共享。

  • 虚机的 GPU 驱动,不需要做任何修改,基本上访问的是真实的硬件资源
  • 整个 GPU 透传给虚机,性能损耗最小
  • 因为无法实现 GPU 资源共享,一般认为不属于GPU 虚拟化

9 参考资料

有关GPU虚拟化的更多相关文章

  1. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  2. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  3. ruby-on-rails - Rails 验证虚拟属性 - 2

    我这个模型:classBunny每当我提交一个表单来创建这个模型时,我都会收到以下错误:#的未定义方法“number_before_type_cast” 最佳答案 我通过将此方法添加到我的Bunny模型中解决了这个问题:defnumber_before_type_castnumberend我不喜欢它,但我想在有人发布更好的解决方案之前它会起作用。 关于ruby-on-rails-Rails验证虚拟属性,我们在StackOverflow上找到一个类似的问题: h

  4. 【云计算】私有云在VMware下虚拟机的创建与配置(图文教程) - 2

    【适用平台】私有云   说明:完成私有云部分是需要两台虚拟机的,分别为controller、compute两个节点,但我们只需配置一台,然后克隆就方便多啦!需要用到的映射文件:关于vm的安装我就不介绍的,毕竟挺简单的,下面让我们看看基于私有云模块中,虚拟机的搭建吧。1、创建新的虚拟机,这里一般我会选择自定义,毕竟后面的配置都要根据私有云相关来进行搭建,会比较复杂。(如果是基础的可以选择典型,典型的满足一般虚拟机的配置) 2、选择稍后安装操作系统会比较方便后续的选择,这里你也可以自己选择自己的映像文件(但不建议)  3、我们是基于Linux下操作的,所以选择Linux客户机操作系统,版本选择自己

  5. VMware虚拟机与本地主机进行磁盘共享(详解) - 2

    VMware虚拟机与本地主机进行磁盘共享前提虚拟机版本为Windows10(专业版,不是可能有问题)本地主机为家庭版或学生版(此版本会有问题,但有替代方式)最好是专业版VMware操作1.关闭防火墙,全部关闭。2.打开电脑属性3.点击共享-》高级共享-》权限4.如果没有everyone,就添加权限选择完全控制,然后应用确定。5.打开cmd输入lusrmgr.msc(只有专业版可以打开)如果不是专业版,可以跳过这一步。点击用户-》administrator密码要复杂密码,否则不行。推荐admaiN@1234类型的密码。设置完密码,点击属性,将禁用解开。6.如果虚拟机的windows不是专业版,可

  6. 虚拟机上进行java项目部署 - 2

    🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀虚拟机上进行java项目部署,自己的一点总结,一起学习,一起进步,一起成长!🛸🛸🛸🛸🛸🛸🛸🛸🛸🛸目录文章目录虚拟机上进行java项目部署1.JDK安装2.TOMCAT安装3.DOCKER1、YUM安装2、docker部署java4、最后 【yzh2022.9】1.JDK安装1、我们安装VM的时候,使用命令java-version查看 java-version这里显示JDK的信息是openjdkversion"1.8.0_262",我们会发现这个JDK是VM自带的当然你也可以通过命令rpm-qa|grepjava来查看相关的java信息 rpm-qa|grepjava【如果不

  7. 【操作系统实验】Ubuntu Linux 虚拟机用户管理 - 2

    文章目录一、用户二、用户分类1、普通用户2、超级用户3、系统用户三、用户相关文件1、/etc/passwd文件2、/etc/shadow文件四、用户管理命令1、useradd2、adduser3、passwd4、usermod5、userdel一、用户Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统。在Linux系统中,任何文件都属于某一特定用户,而任何用户都隶属于至少一个用户组。用户名(username):每个用户账号都拥有一个惟一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后,就能够进入系

  8. Conda虚拟环境的复制和迁移 - 2

    Conda虚拟环境的复制和迁移在本机复制Conda虚拟环境condacreate--namesnapshot--clonemyenv相同操作系统之间复制环境方法一:requirements.txt这个方法不推荐,因为只会导出你使用pip安装的依赖包,不会导出虚拟环境所依赖的包,并不适用于虚拟环境的迁移的应用场景。事实上,此方法比较适用于,已经明确知道依赖哪些包,我们只需要package信息的情况,如写项目文档,告诉别人运行我这个系统必须安装哪些依赖包。而忽略虚拟环境本身的依赖环境。pipfreeze>requirements.txt#生成requirements.txtpipinstall-r

  9. ruby - 是否可以在 Vagrant 完成所有配置后在虚拟机上运行脚本? - 2

    我正在使用Vagrantv1.5.1创建虚拟机(VM)集群。在供应了所有VM之后,是否可以在其中一台机器上运行单个脚本?我要运行的脚本将设置从一个VM到所有其他VM的无密码SSH。例如我在Vagrant(CentOS6.5)中配置的节点如下。节点1节点2节点3节点4我的Vagrantfile如下所示。(1..4).eachdo|i|config.vm.define"node-#{i}"do|node|node.vm.box="centos65"...omitted..endend完成所有这些后,我需要在node1上运行一个脚本,以启用到node2、node3和node4的无密码SSH。

  10. conda虚拟环境配置 - 2

    文章目录1下载Anaconda2创建自己的虚拟环境3配置自己的虚拟环境1下载Anaconda直接官网下载Anaconda官网2创建自己的虚拟环境可以直接在anaconda软件上添加还可以通过命令行指令,打开终端输入condacreate-n名字python=3.73配置自己的虚拟环境在终端先进入刚刚配置好的虚拟环境,输入condaactivate虚拟环境名字输入condainstall包名即可进行虚拟环境的相关配置

随机推荐