
· 硬件加速的引入 ·
5G网络高可靠、低延时、大流量的特征以及边缘计算业务(包括机器学习、人工智能、无人驾驶、工业仿真等)兴起对未来网络计算和转发能力提出更高要求。通用CPU已不能满足海量计算、数据、图片的处理需求,越来越多的场景引入GPU、FPGA等硬件进行加速,异构计算应运而生。
异构计算能够充分发挥CPU/GPU在通用计算上的灵活性,及时响应数据处理需求,搭配上FPGA/ASIC等特殊能力,来充分发挥协处理器的效能,根据特定需求合理地分配计算资源。在处理速度和功耗之间找到平衡,达到高效又省电的效果。

图 1‑1 异构计算
2 、行业现状
所有的尖端应用都需要加速应用。对于计算加速、存储加速、图像加速需求也很明显。 微软的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 加速器的选择
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等
图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与其他组件的交互方式进行分析。
4.1 cyborg-api
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。
4.2 cyborg-conductor
Cyborg Conductor服务, 对其他服务组件提供RPCAPI服务, 从而来操作数据库cyborg-db, 这样可以使其他组件和数据库解耦, 并提高数据库的安全性和并发能力。 调用RPC-API的服务有: cyborg-api、cyborg-agent。类似nova-conductor服务。
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)
加速器请求(extended_accelerator_requests)
加速器请求(简称:ARQ)是指被加速器被绑定到实例之后的一个状态对象。ARQ的创建、绑定、解绑、删除都是在与nova交互时由cyborg处理的,其数据也是保存与cyborg的数据库中。
4.6 cyborg与nova等组件的交互
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编程等操作
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.youkuaiyun.com/weixin_42229404/article/details/80848546 [2]https://blog.youkuaiyun.com/horsefoot/article/details/53991752/ [3]http://www.diankeji.com/news/39164.html [4]https://blog.youkuaiyun.com/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