【干货分享】硬件加速介绍及Cyborg项目代码分析

图片

· 硬件加速的引入 ·

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  AzureFPGA架构[1]

亚马逊AWSAWS16年就推出了EC2实例F1,这种EC2实例是具有现场可编程门阵列(FPGA) 的计算实例。可以进行编程,为应用程序创建自定义硬件加速。[2]阿里云异构计算加速引擎涵盖GPUFPGA在内等多款异构实例,可满足从图形渲染到高性能计算及人工智能等复杂应用的计算需求。特别是在人工智能领域,可将深度学习成本缩减一半,大幅降低人工智能计算门槛;而基于阿里云异构平台的全新高性能计算实例E-HPC,可一键部署获得媲美大型超算集群环境的“云上超算中心”。[3]

图片

2‑2  阿里云的异构实例[4]

 

英特尔最新推出的AI平台,就包含了CPUGPUDSPNNPFPGA等一系列不同的处理核心。英伟达的机器人平台Jetson Xavier也包含了6种处理器,GPU/CPU/NPU/NVDLA等。智能手机也开始在传统的CPU/GPU/ISP/基带芯片之外,加入了加速DSP、图形处理单元NPU等。 

针对不同的场景,硬件加速器的选择也不一样。目前市场上流行的加速芯片有多种选择。加速芯片嵌入网卡形成智能网卡是目前加速卡的主流形式。其中FPGA当前产业较为成熟,且可现场编程灵活性高;NPSoC性价比较高,但产业成熟度有待提高;GPU主要优势为图片复杂算法处理。[5]

图片

2‑3  加速器的选择


主流加速硬件管理开源项目介绍


目前硬件加速管理面的开源项目只有cyborg


cyborg(前身为Nomad)OpenStack用于管理硬件和软件加速资源框架,可以通过cyborg列出、识别和发现加速器,挂载、卸载加速器实例。


cyborg的主要功能包括硬件资源的发现、资源上报、资源的管理等。对于一些特殊硬件的特殊功能或配置(如:FPGA的编程等)也由cyborg来完成。


图片

3‑1  cyborg架构

 

cyborg的架构比较经典。

  • cyborg-apicyborg-conductorcyborg-agentcyborg3个主要服务,cyborg-api主要用于提供API接口,cyborg-conductor主要用来操作数据库,cyborg-agent主要用来适配各加速硬件驱动。
  • cyborg-client主要调用cyborg-api,最终对用户提供命令行。
  • 目前为止cyborg中已支持的驱动包括FPGAGPUSPDK与现有社区代码结构不一致,已不可用;同时社区也在规划其他硬件驱动的支持,如AICHIP

 

在最新的Stein版中为了能在placement组件中表现设备(device)和加速器(accelerator)以供nova调度。cyborg将所有的加速硬件(包括FPGAGPU,以及目前正在规划的加速硬件等)都定义成以下的加速模型,最终以AttachHandle的方式绑定到虚机/容器/裸金属上。

图片

3‑2  加速器模型[6]

 

项目

说明

备注

Device

物理硬件(如:PCI卡)。包括(Flash / BMC)。


Deployable

提供资源的设备中的逻辑结构。资源可以是加速器,本地内存等。

※在FPGA中一个device可以对应多个Deployable;而在GPU中一个device一般对应一个Deployable

placement中可理解为Resource Provider

Accelerator

硬件加速的逻辑资源(非物理硬件),一个Accelerator对应一个Attach Handle

使用情况在placementinventory中记录

ControlPath Id

访问设备的唯一标识符。 例如:PCI PF


Attach Handle

用于将加速资源attachVM、容器或主机的ID。例如:PCI VFmdev UUID


 

4 cyborg源码分析

下面将针对cybrog源码以及cyborg与其他组件的交互方式进行分析。


4.1  cyborg-api

CyborgAPI服务对用户提供REST API接口支持POST/PUT/PATCH/DELETE/GET操作并通过cyborg-conductor cyborg-agentcyborg-db进行交互。

 

1cyborg-api的服务启动流程如下:

图片

4‑1  API启动流程

 

2API的匹配采用pecan框架,从下图可清晰的看出URL匹配规则

图片

4‑2  API匹配规则

 

※注意以上是以V1API为例进行说明。目前社区在统一了硬件加速设备模型之后,已基本废弃了V1API,正在努力推V2API


4.2  cyborg-conductor

Cyborg Conductor服务对其他服务组件提供RPCAPI服务从而来操作数据库cyborg-db, 这样可以使其他组件和数据库解耦并提高数据库的安全性和并发能力。 调用RPC-API的服务有: cyborg-apicyborg-agent。类似nova-conductor服务。

1cyborg-conductor的服务启动流程如下:

image.png

4‑3  Conductor启动流程

2cyborg-conductor的调用流程如下:

image.png

4‑4  Conductor调用流程

 

4.3  cyborg-agent

Cyborg Agent服务通过调用驱动来实现底层加速硬件的配置管理操作

1cyborg-agent的启动流程如下。其中蓝线为服务启动流程;红线为定时服务,用于硬件设备的自动发现及管理。

图片

4‑5  Agent启动流程

 

2agent侧已支持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的数据库中。


4.6  cyborgnova等组件的交互

cyborgnova组件的交互的具体的交互流程如下图所示:

图片

4‑9  cyborgnova等组件的交互

 

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



图片



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章