· 硬件加速的引入 ·
5G网络高可靠、低延时、大流量的特征以及边缘计算业务(包括机器学习、人工智能、无人驾驶、工业仿真等)兴起对未来网络计算和转发能力提出更高要求。通用CPU已不能满足海量计算、数据、图片的处理需求,越来越多的场景引入GPU、FPGA等硬件进行加速,异构计算应运而生。
异构计算能够充分发挥CPU/GPU在通用计算上的灵活性,及时响应数据处理需求,搭配上FPGA/ASIC等特殊能力,来充分发挥协处理器的效能,根据特定需求合理地分配计算资源。在处理速度和功耗之间找到平衡,达到高效又省电的效果。
图 1‑1 异构计算
所有的尖端应用都需要加速应用。对于计算加速、存储加速、图像加速需求也很明显。微软的Azure历经三代FPGA架构,除提供网络和存储虚拟化加速,还可用于加速Bing 搜索、深度神经网络(DNN)等计算任务。在MICRO'16 会议上,微软提出了Hardware as a Service (HaaS) 的概念,即把硬件作为一种可调度的云服务,使得FPGA 服务的集中调度、管理和大规模部署成为可能。
图2‑1 Azure的FPGA架构[1]
亚马逊AWS云AWS在16年就推出了EC2实例F1,这种EC2实例是具有现场可编程门阵列(FPGA) 的计算实例。可以进行编程,为应用程序创建自定义硬件加速。[2]阿里云异构计算加速引擎涵盖GPU、FPGA在内等多款异构实例,可满足从图形渲染到高性能计算及人工智能等复杂应用的计算需求。特别是在人工智能领域,可将深度学习成本缩减一半,大幅降低人工智能计算门槛;而基于阿里云异构平台的全新高性能计算实例E-HPC,可一键部署获得媲美大型超算集群环境的“云上超算中心”。[3]
图2‑2 阿里云的异构实例[4]
英特尔最新推出的AI平台,就包含了CPU、GPU、DSP、NNP、FPGA等一系列不同的处理核心。英伟达的机器人平台Jetson Xavier也包含了6种处理器,GPU/CPU/NPU/NVDLA等。智能手机也开始在传统的CPU/GPU/ISP/基带芯片之外,加入了加速DSP、图形处理单元NPU等。
针对不同的场景,硬件加速器的选择也不一样。目前市场上流行的加速芯片有多种选择。加速芯片嵌入网卡形成智能网卡是目前加速卡的主流形式。其中FPGA当前产业较为成熟,且可现场编程灵活性高;NP和SoC性价比较高,但产业成熟度有待提高;GPU主要优势为图片复杂算法处理。[5]
图2‑3 加速器的选择
目前硬件加速管理面的开源项目只有cyborg。
cyborg(前身为Nomad)是OpenStack用于管理硬件和软件加速资源框架,可以通过cyborg列出、识别和发现加速器,挂载、卸载加速器实例。
cyborg的主要功能包括硬件资源的发现、资源上报、资源的管理等。对于一些特殊硬件的特殊功能或配置(如:FPGA的编程等)也由cyborg来完成。
图3‑1 cyborg架构
cyborg的架构比较经典。
- cyborg-api、cyborg-conductor、cyborg-agent是cyborg的3个主要服务,cyborg-api主要用于提供API接口,cyborg-conductor主要用来操作数据库,cyborg-agent主要用来适配各加速硬件驱动。
- cyborg-client主要调用cyborg-api,最终对用户提供命令行。
- 目前为止cyborg中已支持的驱动包括FPGA和GPU;SPDK与现有社区代码结构不一致,已不可用;同时社区也在规划其他硬件驱动的支持,如AICHIP等
在最新的Stein版中为了能在placement组件中表现设备(device)和加速器(accelerator)以供nova调度。cyborg将所有的加速硬件(包括FPGA、GPU,以及目前正在规划的加速硬件等)都定义成以下的加速模型,最终以AttachHandle的方式绑定到虚机/容器/裸金属上。
图3‑2 加速器模型[6]
项目
说明
备注
Device
物理硬件(如:PCI卡)。包括(Flash / BMC)。
Deployable
提供资源的设备中的逻辑结构。资源可以是加速器,本地内存等。
※在FPGA中一个device可以对应多个Deployable;而在GPU中一个device一般对应一个Deployable
在placement中可理解为Resource Provider
Accelerator
硬件加速的逻辑资源(非物理硬件),一个Accelerator对应一个Attach Handle
使用情况在placement的inventory中记录
ControlPath Id
访问设备的唯一标识符。 例如:PCI PF等
Attach Handle
用于将加速资源attach到VM、容器或主机的ID。例如:PCI VF,mdev UUID等
4 cyborg源码分析
下面将针对cybrog源码以及cyborg与其他组件的交互方式进行分析。
Cyborg的API服务, 对用户提供REST API接口, 支持POST/PUT/PATCH/DELETE/GET操作, 并通过cyborg-conductor和 cyborg-agent、cyborg-db进行交互。
1)cyborg-api的服务启动流程如下:
图4‑1 API启动流程
2)API的匹配采用pecan框架,从下图可清晰的看出URL匹配规则
图4‑2 API匹配规则
※注意以上是以V1版API为例进行说明。目前社区在统一了硬件加速设备模型之后,已基本废弃了V1版API,正在努力推V2版API。
1)cyborg-conductor的服务启动流程如下:
图4‑3 Conductor启动流程
2)cyborg-conductor的调用流程如下:
图4‑4 Conductor调用流程
4.3 cyborg-agent
Cyborg Agent服务, 通过调用驱动, 来实现底层加速硬件的配置管理操作
1)cyborg-agent的启动流程如下。其中蓝线为服务启动流程;红线为定时服务,用于硬件设备的自动发现及管理。
图4‑5 Agent启动流程
2)agent侧已支持FPGA驱动,因此下面以FPGA的编程功能为例说明agent侧的调用流程
图4‑6 FPGA编程流程
4.4 cyborg-client
cyborg-client是通过调用cyborg-api,来最终对用户提供命令行功能。目前cyborg-client只有基础框架(具体如下图),cyborg相关命令行功能尚不完善,社区还需抓紧时间推进。
图4‑7 客户端启动流程
4.5 cyborg数据结构
cyborg的数据库结构如下:
图4‑8 数据库结构
可以看到数据库中引入了设备配置文件(device_profiles)和加速器请求(extended_accelerator_requests),其在与Nova等其他组件交互时有着至关重要的作用。
设备配置文件(device_profiles)
由于不同实例所请求的设备的类型、数量和组合方面可能有很大差异。为避免所有硬件资源都写入Flavor,造成flavor数量增加(运营商经常使用Flavor进行运营和计费),cyborg中引入了设备配置文件(device_profiles)的概念。设备配置文件是一个或多个加速器的用户要求的命名集合,内容包括了特定资源类的期望数量和资源提供者。其中,资源类和资源提供者与placement组件中的概念相同;用户要求既包含了placement中的特征(trait),也包含了cyborg独有的一些特征。
加速器请求(extended_accelerator_requests)
加速器请求(简称:ARQ)是指被加速器被绑定到实例之后的一个状态对象。ARQ的创建、绑定、解绑、删除都是在与nova交互时由cyborg处理的,其数据也是保存与cyborg的数据库中。
cyborg与nova组件的交互的具体的交互流程如下图所示:
图4‑9 cyborg与nova等组件的交互
1. 用户发起创建实例请求,请求中的Flavor中带有device_profile特性2. nova的控制节点向cyborg发起请求获取device_profile的信息3. 将device_profile的信息合入request_spec之后向placement发送请求,获取候补节点4. 选中一个宿主机节点5. 向novacompute发起部署实例的请求6. nova compute请求cyborg创建一个加速器请求(accelerator_request、 ARQ),包含使用device_profile信息7. nova compute请求cyborg更新加速器请求(ARQ),执行绑定操作
绑定instance uuid、resource provider id、host_name等信息
更新ARQ的状态为BOND
根据device_profile的内容决定是否有FPGA编程等特殊需求,如有则执行FPGA编程等操作
※本操作含有一些特殊操作,可能耗时较长,因此是一个异步操作。而Nova Compute在发出请求之后会处于等待状态8. 加速器请求的绑定操作结束后,cyborg通知nova当前的ARQ绑定操作的是否成功9. nova compute等待ARQ绑定操作结束后,则从cyborg获取加速器请求(ARQ)的具体信息10.最后由novacompute将ARQ信息绑定至实例。上面说到了与nova的交互流程,下面简单介绍下与nova交互的具体操作:
1. 首先应在配置文件中启用相关驱动。
# vim /etc/cyborg/cyborg.conf
[agent]
enabled_drivers = intel_fpga_driver, nvidia_gpu_driver, ... … ※可根据实际情况调整
2. 用户需提前准备好对应的设备配置文件
{ "name": "mydp",
"groups": [
{ "resources:CUSTOM_ACCELERATOR_GPU": "1",
… …
},
… …
]
}'
3. 将设备配置文件设置到Flavor中
openstack flavor set –property “accel:device_profile_name=mydp” my-flavor
4. 使用带有设备配置文件的Flavor去创建虚机
openstack server create –flavor my-flavor my-vm
5 总结
cyborg项目目前社区已实现基本的管理功能,与nova/placement等相关组件的交互尚在推进中,有待成熟。
苏研在cyborg社区中贡献涉及cyborg数据库的修改、FPGA驱动对于编程的支持等方面,今后也会持续关注cyborg项目的动态,并积极参与社区,同时引入社区功能,强化自身产品功能。
End
参考链接:
[1]https://blog.csdn.net/weixin_42229404/article/details/80848546[2]https://blog.csdn.net/horsefoot/article/details/53991752/[3]http://www.diankeji.com/news/39164.html[4]https://blog.csdn.net/wja8a45TJ1Xa/article/details/78692830[5]https://github.com/open-heterogeneous-computing-framework/conference/blob/master/kubecon-shanghai-2019/[6]https://docs.google.com/document/d/1XLQtvyGJeEgo3ztBQiufWLF-E7S7yGLaYrme8iUPtA0/edit#heading=h.dllo7olmuhb