3.4.4 FPGA 虚拟化技术
将FPGA 的高性价比算力通过云输出,使得FPGA 的算力普惠化、平民化,这是FPGA as a Service 的核心出发点和立足点。同时,云上使用FPGA 与FPGA 的传统使用方式也有着非常大的区别。FPGA as a Service 的核心就是FPGA 虚拟化技术。
目前FPGA 虚拟化技术还在发展初期,近几年随着云计算和AI 技术的发展, 才逐渐成为工业和学术领域研究的热点。关于FPGA 虚拟化技术的介绍文献也比较少,关于FPGA 虚拟化技术的发展历史,目前比较全面的总结可以参考2018 年由Manchester 大学学生发表的一篇IEEE 论文A Survey on FPGA Virtualization ,文中提到早在2004 年由Plessl 和Platzner 发表的一篇论文Virtualization of Hardware- Introduction and Survey 中提到过FPGA 虚拟化技术的概念,将FPGA 虚拟化技术分为时域划分(Temporal Partitioning)、虚拟化执行(Virtualized Execution)和虚拟机(Virtual Machines)三种。
时域划分早期主要解决设备容量问题,是将大规模的应用设计拆分为几个小设计,然后将每个设计烧写在单个FPGA 上顺序执行。时域划分技术如图3-35 所示, 主要包括网表划分、数据流图划分和CDFG 划分。随着数据量和计算复杂度的增加, 单片FPGA 已经无法满足一个应用的需求,需要多片FPGA 并行完成,虚拟化技术逐渐打破了时间和空间维度的限制,就像大型数据中心的应用场景:多片FPGA 并行执行同一个任务,并可以及时切换到下一个任务。
虚拟化执行是把一个应用分成几个有关联的任务,并通过一个抽象层来管理和调度它们,其目的是在一定程度上实现设备无关性(Device Independence),从而解决资源管理和安全隔离问题,还可以提高开发效率,比较典型的例子是“PipeRench”项目,此项目成功研发了“Kilocore”芯片,它内置了一个PowerPC 处理器,实现了硬件虚拟化,并可以动态配置,从而解决FPGA 的资源限制问题。
虚拟机通过一个抽象架构来描述应用从而彻底实现设备无关性。起初,虚拟机的概念用来表示FPGA 的静态架构,譬如Shell 或者vFPGA 的Hypervisor,并不是我们现在理解的虚拟机概念。现在的FPGA Overlay 技术是应用比较广泛的FPGA 虚拟化方法之一,它是位于FPGA 硬件层之上、并连接顶层应用的虚拟可编程架构,实现了对FPGA 底层硬件资源的抽象化和虚拟化。FPGA Overlay 的具体实现方式有很多种, 这里不详细介绍,其主要目的是为上层用户提供他们熟悉的编程架构与接口,比如通过C 语言等高层语言对Overlay 中的通用处理器等进行编程,而无须担心具体的硬件电路实现,这点类似HLS。Overlay 实现了FPGA 的硬件无关性,便于应用设计在不同FPGA 架构间移植。另外,用户可以选择只编译自己改动的逻辑部分,在很大程度上缩短了FPGA 的编译时间,也方便对应用进行调试和修改。但是在实际开发中,由于其引入的Overlay 层并不能完全隐藏FPGA 结构,而且此技术没有业界统一标准, 所以会来带额外的开发难度和成本。
图3-35 时域划分
按照资源的抽象级别,FPGA 虚拟化技术分为三类,如图3-36 所示。
资源级别(Resource Level):FPGA 上的资源可分为两种,一种是可配置的, 一种是不可配置的,所以资源级别的虚拟化主要指架构虚拟化(增加一个抽象层)和I/O 虚拟化,比较典型的技术就是FPGA Overlay 技术,I/O 虚拟化技术本质上跟CPU/ GPU 实现类似,比如FPGA 云主机用到的设备透传功能。
单节点级别(Node Level):单节点指单片FPGA,主要指具备资源管理功能的抽象层,包括VMM(Virtual Machine Monitors,也叫Hypervisor),Shell(FPGA OS 或Hypervisor-vFPGA)和调度管理,主要用于多租户场景,即FPGA 云主机。
多节点级别(Multi-Node Level):多节点指由两片以上FPGA 组成的FPGA 集群,虚拟化的目的是在多片FPGA 上完成同一个加速任务。其实现依赖FPGA 互联功能,常见的有三种互联方式,如图3-37 所示。
FPGA 虚拟化技术比较典型的应用场景包括基于OpenCL 实现的MapReduce 框架和微软的Catapult 项目。
从FPGA 云主机的实现方式来说,FPGA 虚拟化指I/O(PCIe 设备)虚拟化技术。
I/O 虚拟化技术,有些地方也叫I/O 设备虚拟化技术,目前主流的模型实现方式有以下几种:
图3-36 FPGA 虚拟化技术分类
图3-37 FPGA 互联方式
全模拟:纯软件实现,通常由虚拟化层(QEMU)完全模拟一个设备给虚拟机用, 其优点是不需要修改操作系统内核和驱动,因此它是可移植性与兼容性最好的I/O 设备虚拟模型。但是,这种实现模型性能不高,主要原因是:第一,软件模拟本身就无法具有很高的性能;第二,在这种实现方式中,I/O 请求的完成需要虚拟机与监视程序多次的交互,产生大量的上下文切换,开销巨大。
Virtio 驱动半虚拟化:将设备虚拟的工作一拆为二,一部分在虚拟机内核中作为前112
端驱动,一部分放到虚拟化层上(通常是QEMU)作为后端,前后端共享Virtio 环协同完成任务。Virtio 前后端的技术只是减少了VM Exit 和VM Entry(Guest 和Host 的上下文切换),并且使Guest 和Host 能通过并行处理I/O 来提高吞吐量并减少延迟。但是,I/O 的路径并不比全虚拟化技术少。
硬件辅助虚拟化:借助硬件技术,如Intel 的VT-d 技术实现PCI 设备直接挂载给虚拟机,常见的有设备直通和SR-IOV。
纵观各大云服务提供商,FPGA 云服务器采用的都是设备直通,主要因为以下三点:一是FPGA 的性能,客户考虑业务搬迁上云首先要做的就是对比,跟本地物理机比、跟竞品(如GPU/ASIC)比。虚拟化必然导致部分的硬件性能损耗,1% 的性能损失都会增大客户拒绝使用FPGA 云服务器的可能性;二是应用场景,FPGA 比较适用于计算密集型和通信密集型任务。在大数据爆发的时代,很多应用都需要调度多片FPGA 才能满足需求,将同一片FPGA 共享给多个客户的需求并不强烈;三是实现难度,分片FPGA(vFPGA)的多租户场景,在安全和隔离的实现上,虽然可以复用vGPU 方案,但是硬件逻辑开发的难度非常大。综合考虑,各大云服务提供商在FPGA 设备虚拟化时选择的都是性能损耗最小的设备直通方案。
设备直通(Device Passthrough)技术:是将宿主机上的PCIe 设备直接分配给客户机使用,虚拟机独占这个设备,在客户机进行对应的I/O 操作时,不需要通过VMM 或被VMM 截获,所以设备性能几乎无损耗。设备直通技术的实现依赖IOMMU 功能(隔离虚拟机对内存资源的访问),需要硬件支持,比如Intel 平台的VT-d 技术。
说到VT-d 技术,首先要解释下DMA(直接内存读取),它是一种硬件机制,允许外围设备和主内存之间直接传输数据,不需要CPU 参与,由此可以大大提高设备的吞吐量。I/O 虚拟化的关键在于解决I/O 设备与虚拟机的数据交换问题,而这部分主要指DMA 和中断请求(IRQ)。只要解决好这两个方面的隔离、保护及性能问题, 就是成功的I/O 虚拟化。VT-d 通过重新设计IOMMU 架构,在CPU、内存和I/O 设备之间增加了一个硬件设备,其主要功能是将I/O 设备的DMA 访问请求和中断请求重定向到VMM 设定好的VM 中,最终实现了DMA 虚拟化,这项技术也叫DMA 重映射。
阿里云FPGA 云主机的设备直通方式采用的是VFIO,这是一套用户驱动框架, 通俗来讲就是一个设备驱动。在虚拟化情景下,VFIO 主要用来在用户实现设备直通,充分利用了VT-d 技术提供的DMA 重映射和中断重映射特性, 在保证直通设备的DMA 安全性的同时其I/O 性能接近物理设备。
总体来说,FPGA 板卡(PCIe 设备)的透传方式跟GPU/NIC 等PCIe 设备并无差别,鉴于FPGA 本身的硬件特性和安全隔离要求,阿里云FPGA 云服务器虽然采用了设备直通方式,但是并没有把FPGA 设备功能完全暴露给虚拟机,而是将PCIe 从功能角度划分为两个PF(Physical Function):即管理PF(Management PF)和用户PF(User PF),如图3-38 所示。
图3-38 FPGA 板卡(PCIe 设备)的透传方式
管理PF :提供FPGA 各种控制功能,如FPGA 镜像加载、状态监控等。例如, 在FPGA 云主机上,只有先发送加载请求,后台系统认证身份后,通过宿主机驱动才能发起加载操作。
用户PF :对应的是逻辑功能接口,此功能会通过设备直通方式透传给虚拟机, 用户可以使用官方提供的驱动访问设备,也可以自己开发。114
PCIe 功能双PF 的划分,在一定程度上保护了FPGA 板卡不会被用户恶意烧写,从而降低了宿主机的停机风险,也保证了FPGA as a Service 的可靠性。此方案的实现基于FPGA 特殊的硬件特性(部分可重配置),主流云服务提供商的做法基本类似。
部分可重配置(Partial Reconfiguration):在前面介绍FPGA 虚拟化技术的时候提到过,其实现原理是将FPGA 内部划分出多个区域,在FPGA 运行时单独对这些区域进行编程和配置,以改变区域内电路的逻辑,但并不影响FPGA 其他电路的正常运行。它可以实现时间域和空间域两个维度的任务切换,很多大型应用的逻辑都是利用FPGA 这一特性实现的,如微软的Catapult 项目同时提出了Shell(不可配置区域)和Role(可重配的逻辑单元)的概念。也有将这一特性应用在多租户场景下的,提出了vFPGA 的概念,即将一个FPGA 共享给多个用户使用,如IBM 的CloudFPGA 项目。
各云服务提供商的FPGA 云服务器也抓住了这一特性,将FPGA 在逻辑上划分为Shell(静态区)和用户逻辑(动态区)。
静态区:FPGA 的静态区主要包括PCIe、DRAM、DMA 及中断等接口逻辑,一般由云服务提供商提供,主要负责FPGA 管理功能。
用户逻辑:FPGA 的动态可重配置区域属于用户数据,即用户的知识产权(IP)。
阿里云FPGA 云主机在F3 实例设计时也提出了Role 的概念,它是和Shell 类似的封装,跟用户逻辑一样处于动态区域,其目的是简化Shell 功能,以尽可能减少Shell 升级。另外,通过Role 实现了同一个Shell 既可以支持OpenCL 开发,也可以支持RTL 开发的功能,同时降低了用户对FPGA 的开发门槛。
3.4.5 EAIS 软件池化技术
除了支持预定义规格的异构计算加速实例,还可以通过弹性加速实例EAIS 以池化的方式将前端CPU 的核心数和后端的异构加速设备解耦,让前端ECS 动态挂载、后端异构计算加速实例卸载。前端和后端异构计算加速实例都以虚拟化的方式启动。通过虚拟化的方式可以对GPU、FPGA、NPU 等不同的异构加速实例化调度和管理。
EAIS 架构如图3-39 所示,通过虚拟网卡技术将异构计算加速实例挂载到前端ECS 上,后端异构计算加速实例会运行一个监听前端请求的进程及一个推理服务进程,然后在前端ECS 上启动弹性推理客户端,在推理前端服务和推理后端服务之间建立一个高速安全通信通道,前端应用的AI 推理计算请求和模型通过通道发送到后端的推理服务进程上进行AI 推理计算,推理的结果再通过安全通信通道返回给前端应用。
用户 VPC 用户 EDS 启动推理服务应用请求启动监听进程虚拟网卡后台 ECS 公有云 Region 售卖区启动推理服务虚拟网卡GPU
图3-39 EAIS 架构
3.4.6 AI 加速器及其性能优化技术
AI 加速器主要面向人工智能领域的性能加速,目前应用最多的AI 框架就是TensorFlow、PyTorch、MXNet、Caffe 等,而这些AI 框架自身都有很多的发布版本被不同的开发者使用,并且各框架都有自己的一套分布式并行方式,我们为了屏蔽不同计算框架之间及不同计算框架版本间的分布式训练差异,通过统一的框架和统一的优化代码来优化这4 种计算框架的不同版本。我们研发了统一的AI 加速器,其架构如图3-40 所示。
图3-40 AI 加速器架构116
我们把这些分布式训练框架的通信部分整合到了同一个框架之中,接下来在这框架之下的所有优化工作,都将直接加速支持的全部AI 计算框架。
分布式通信优化方法
(1)计算和通信的重叠。传统的计算和通信是串行的,即先做完梯度计算、再做梯度通信,我们的第一个优化工作是将计算和通信重叠起来,尽量减少通信的开销。
(2)去中心化梯度协商。传统分布式梯度协商方式是根节点和所有节点都协商, 因此根节点的负担会随着节点数增加而大幅升高。而我们采取的去中心化的梯度协商方式,将大规模下梯度协商的复杂度降低了一个数量级。
(3)梯度压缩。将要传输的梯度从FP32 压缩到FP16,并建立了相应的数据缩放机制,从而防止精度损失。
(4)分级通信优化。传统的环形通信方式是将所有节点上的GPU 形成一个大环, 致使其整体性能在以太网的通信上受到限制。我们做了分级通信的优化,首先在节点内部的GPU 上做一级规约通信,每个节点都规约到一块GPU 上,然后每个节点的这个GPU 再做二级规约通信。这样一方面减少了以太网上传输的数据量,另一方面通过流水线将节点内部的规约通信和节点之间的规约通信重叠起来,减少了整体通信时间。
(5)梯度融合优化。传统的通信方法是计算出一个梯度通信一次,这样会产生很多小包的通信,对网络带宽非常不友好,优化是等一批梯度计算完成后再融合在一起做通信,这样的大数据包能够大大提升网络带宽的利用率。
性能加速效果
我们选择了将分布式性能优化得很好的Horovod 框架和各AI 计算框架本身进行性能对比,经过测试发现,AI 加速器支持的框架的分布式训练性能比Horovod 及各AI 计算框架能够提升65%~500% 不等的性能。
图像分类TensorFlow ResNet-50 分布式训练, 在4 机32 张P100 GPU 上比Horovod-TensorFlow 提升65% 的性能,如图3-41 所示。
图3-41 TensorFlow ResNet-50 分布式训练结果对比
图像分类TensorFlow VGG-16 分布式训练,在2 机16 张P100 GPU 上比Horovod- TensorFlow 提升90% 的性能,如图3-42 所示。
图片数/ 秒8 16 GPU卡数/个原始优化32 64 128 7000 6000 5000 4000 3000 2000 10000
图3-42 TensorFlow VGG-16 分布式训练结果对比
大规模人脸识别MXNet 分布式训练,在2 机16 张P100 GPU 上比MXNet 提升400% 的性能,如图3-43 所示。
图片数/ 秒118
samples/sec 单卡性能单机8卡MXNet Perseus- mxnet 双机16卡四机32卡900 800 700 600 500 400 300 200 1000 样本数/ 秒
图3-43 大规模人脸识别MXNet 分布式训练结果对比