背景

人工智能领域在近年发展迅速,不论是在图像识别,目标检测,机器翻译,还是语音识别等多个领域,人工智能的表现均已超过人类水平,尤其是在AlphaGo战胜了李世石之后,人们对人工智能可达到的成就有了新的认识。机器学习(Machine Learning,ML)是人工智能的子领域,也是人工智能的核心,就是要设计让机器可以进行自动学习的算法。而深度学习(Deep Learning,DL)是机器学习的一个子类,是一种包含多个隐含层的神经网络结构,人们定义了神经网络中各种神经元的连接方法,以及神经元的激活函数,并利用反向传播技术完成神经网络的训练过程。深度学习技术在众多AI领域取得很多成果,解决了很多复杂的模式识别难题,所以也成为最近几年人工智能领域研究和应用上人气最火热的技术。

深度学习模型当前有多种训练框架,如常见的TensorFlow,PyTorch,MxNet,Caffe,PaddlePaddle等等,训练时大多是使用GPU,采用容器云方式,进行大规模并发计算,减少模型训练收敛时间。而在模型的应用上,则要使用深度神经网络的推理能力,完成网络前向计算,并将此计算部署为应用服务,产生商业价值。

Adlik做了什么?

各种算法在训练框架训练后得到各种模型,其服务应用可能要部署在不同的硬件平台,可能使用不同的推理框架,对应用场景有着不同的要求,如低时延。所以在训练中达到很好的收敛效果的深度学习模型,距离真正的投入应用,还有很多工作要做:

  1. 针对不同设备的推理框架有很多,对用户难以选择,要付出较多的学习成本

  2. 不用应用场景的部署条件不同,有基于容器化部署场景,也有基于嵌入式硬件部署的场景,同样的模型服务,不同部署方案要掌握不同的技术

  3. 根据性能需求有很多的模型调优工作

  4. 推理服务应用于不同硬件,需要多类异构计算引擎的支持

业界常见推理引擎和硬件平台

推理引擎 Tensorflow Tf Lite OpenVino TensorRT
硬件 CPU/GPU CPU(ARM)/GPU CPU GPU

Adlik就是一种可以将深度学习模型从训练完成,到部署到特定硬件并提供应用服务的端到端工具链,其应用目的就是为了将模型从研发状态快速部署到生产应用环境。Adlik可以和多种推理引擎协作,支持多款硬件,提供统一对外推理接口,并提供多种灵活的部署方案,以及工程化的自适应参数优化方案,为用户提供快速,高性能的应用服务提供助力。Adlik的架构如下图:

Adlik在架构上,可以分为模型优化模块(Optimizer),模型编译模块(Compiler)和推理引擎模块(Inference Engine)。

训练好的模型,通过Adlik 模型优化模块处理,生产优化后的模型,然后通过模型编译模块,完成模型格式转换,生成最终推理引擎支持的模型格式。

部署方案上,Adlik支持三种部署场景,并提供相应的特性支持:

  • 云侧

Adlik支持原生容器化部署方案,优化和编译完成的模型,可以和Adlik Serving Engine镜像一起打包,发布为应用服务镜像,并在指定硬件的容器云上运行。

  • 边缘侧

Adlik支持在启动的Adlik Serving Engine服务上,加载优化和编译完成的模型,并支持模型版本管理,自动升级,以及多模型实例调度功能,减少边缘侧计算资源的占用。

  • 端侧

Adlik可以为用户提供C/C++的API接口,支持用户直接在计算引擎上调用完成了优化和编译的模型,并提供了模型编排能力,具备低延时和小体积的特性,可以在指定硬件运行模型应用。

Adlik目前的定位是深度学习模型工程化使用的工具链,是模型应用落地的加速器,包括端到端编译优化能力,主流深度学习推理引擎的集成,支持多种灵活部署方式,以SDK方式提供用户可扩展实现推理运行时的自定义开发能力,可以实现多模型协作推理,在工程化角度,Adlik还会引入工程参数自动优化的能力,提升易用性,给用户提供训练模型到推理应用上线的端到端优化能力。

Adlik在支持异构硬件计算的设计思路

目前Adlik支持的推理引擎,包括常见的用于深度学习推理的TensorFlow Serving,TensorRT,OpenVINO,以及CNNA(FPGA特定运行时),并计划支持Tf Lite。而支持的异构硬件包括了GPU,CPU(x86),以及FPGA,计划支持CPU(ARM)。Adlik在框架层上提供了多种形式,支持用户扩展异构硬件的运行和部署。

Adlik Serving提供了模型的推理服务。它以插件的方式部署和隔离各种运行时的环境。Adlik Serving内置常见的运行时组件,包括TensorFlow Serving,OpenVINO,TensorRT,CNNA(FPGA特定运行时),Tf Lite等,各类应用可按需加载,开箱即用。

部署推理引擎时,需要根据具体场景灵活选择推理运行时,及其相应的异构硬件。例如,在CPU嵌入式环境下部署,因为只存在CPU环境,此时用户可以选择TensorFlow Serving on CPU,或OpenVINO on CPU等两种部署方式,如果环境使用ARM的CPU架构,那么也可以选择Tf Lite on CPU(ARM)的部署方式。

更为高级地,用户也可以通过Adlik提供的Serving SDK,开发用户自定义推理运行时环境,并在Adlik Serving框架下执行推理服务,满足极高的时延性的部署环境。Adlik Serving SDK提供了模型上载,模型升级,模型调度,模型推理,模型监控,运行时隔离等基础模型管理的功能特性,及其用户定制与开发推理服务的C++ API。用户要根据自己的需求,定制开发自己的模型和运行时。Serving SDK提供了标准的扩展点,方便用户高效地定制新的模型和运行时环境。基于Serving SDK,用户也可以开发组合式的模型,在进程内控制多模型之间的交互,而模型之间的运行时可以相互独立。例如,模型1的输出可以作为模型2的输入,模型1和模型2分别TensorFlow Serving和TensorRT运行时的模型。

默认地,Adlik Serving/Serving SDK不包含任何运行时组件,实现最小的依赖管理,应用根据部署环境灵活选择组装。也就是说,Adlik Serving/Serving SDK可以提供不同运行时组合的镜像集合,应用根据具体的部署环境选择合适的基础镜像。

以新增一款运行时引擎为例,介绍一下Adlik的框架是如何支持创建新运行时的,这对很多有自定义运行时和指定硬件平台的场景有重要的意义。假设A是要支持的新运行时。

  1. 定义A_Model类。这个指定的A_Model就是要创建的新运行时

  2. 定义具体计算引擎的实现类,A_Processor类,A_Processor类可以直接调用A计算引擎的执行API

  3. 调用Adlik提供的API接口,将A_Processor类注册到Adlik运行时调度器,作为可调度的一个推理引擎

  4. 调用Adlik提供的API接口,将A_Model类注册到Adlik系统,这样Adlik在启动后就能够使用基于A_Model的运行时来执行推理任务

在上面简单的流程示意图中,Server收到推理请求后,runtime可以识别到A_Model运行时的请求数据,就通过调度器和具体调度算法,找到注册在调度器的A_Processor实现类,最终调到A引擎提供的计算API,完成整个推理过程。框架提供了丰富的管理和运行时调度功能,用户只需要关注计算引擎实现即可。

实现上述代码后,用户可以根据指定硬件平台依赖的编译器对代码进行编译,即可生成指定硬件上可执行的推理应用程序,完成对异构硬件的支持。

Adlik在支持FPGA异构计算上的实践

在计算密集型任务中(在深度学习模型推理领域),相比起仅具有数据并行能力的GPU,FPGA基于特定的门阵列硬件结构,可以同时实现数据并行和流水线并行,使得计算的延迟更小;对于特定结构的硬件电路,FPGA的计算延迟也相对稳定。同时,与CPU和GPU相比,FPGA具有较低的功耗,这在大规模的计算中具有一定的优势。此外,FPGA还具有动态可重配置逻辑资源的功能,可以根据不同的配置文件,加载相应的编译文件,比ASIC更具灵活性。因此FPGA深度学习模型推理领域日益受到重视,并在CNN网络的实现领域中占据了很重要的位置。

FPGA的特点是善于进行并行乘加计算,所以在实施深度学习计算时,我们要考虑将深度学习算法进行适当优化,将卷积、池化、下采样等大运算量的算子在FPGA中实现,从而提升整体计算引擎的效率和算力。在实践中,我们在xilinx zcu102单板上实现了卷积神经网络中卷积算子、池化算子、下采样算子以及全连接算子。此外,如resnet网络中涉及的scale和batchnorm算子也在建模中进行了适当优化,得以在FPGA中实现。

我们采用了深鉴科技的笛卡尔架构进行了研究和实践。笛卡尔架构,如下图,是典型的zynq工程架构。片上ARM与逻辑资源之间由AXI接口连接,网络配置信息由axi-lite接口传送,图像数据和权重则通过DMA由PS传送至PL外挂的DDR中,在卷积计算中由PL与DDR通过AXI4协议通信存取。

在整体设计上,我们考虑使用了int8量化和DSP复用技术,多点滑窗卷积计算以及多算子融合技术,结合FPGA传统设计中常用的流水线及乒乓存取技术,使加速器获得了更高的算力,以及更短的网络处理时间。

  1. Int8量化和复用DSP技术

    基于Xilinx xczu9eg系列芯片中的DSP资源的特点,可以实现DSP的乘加复用。该系列芯片的DSP资源可以实现27×18bit的乘法计算,且某一级DSP的乘法输出结果可以级联到下一级DSP的加法输入端,从而实现乘加级联功能,无需额外使用逻辑资源搭建加法器。

    如果将输入的图像和权重信息量化为int8格式,则可以使用权重移位的方式将某一权重左移18位后与另一权重相加,作为乘法器27bit的输入数据,从而使用一个DSP实现两次乘加计算,可以做到算力加倍。

  2. 基于multi-sliding的卷积计算

    传统的二维卷积计算中,每个时钟沿参与卷积的因子为M个输入通道图像中的某个单点与对应输出通道的卷积核的对应单点相乘加,得到对应N个输出通道中对应位置的单点部分和。如下图,完成一个卷积核为3×3的卷积计算,需要9个时钟沿。如果stride=1,则完成一行输出图像的计算需要9×6=54个时钟沿。

传统的卷积单点计算示意图

使用multi-sliding window的卷积方式,引入PIX变量,表示每个时钟沿里,每个输入通道的图像参与卷积的像素点数,传统卷积中的PIX通常为1,即每个输入通道只有一个像素点参与乘加计算,而现在PIX可以取大于1的其他值,这样就使每个时钟沿参与卷积的图像像素点得到了伸展。

如下图,当卷积计算的参数pad=1,kernel=7,stride=1,ciWidth=28,PIX=8时,每输入通道在每个时钟沿里参与卷积的像素点数扩展为8,与对应的卷积核相乘加,作为对应输出通道的部分和。

multi-sliding window卷积计算示意图

如图,对于ibuf中的某一个输入通道中的每一行输入图像,每个时钟沿都有PIX个像素点参与卷积计算。随着sbuf中的权重由行首滑窗至行尾,每一个滑窗经过的像素点会在一个时钟沿的时间里完成所有在这一里要参与的卷积计算,不会在之后的时钟沿里被重复使用,使得整行的计算时间是传统的卷积方式的1/PIX,大大缩短了计算时间。

  1. 多算子融合

    推理时的BatchNorm算子运算非常耗时,但由于其是线性运算,可以在建模初期将BatchNorm+Scale的线性变换参数融合到卷积层,替换原来的weights和bias。与单独计算BatchNorm相比,这种算子融合大大减少了内存的读写操作,有效提高了处理帧率。

  2. 流水线计算和乒乓加载技术

    流水线技术和乒乓加载技术是FPGA设计中常用的手段。使用流水线可以使串行计算并行化,大大减少运算时间,乒乓加载技术则利用片上存储器实现了输入图像和权重的预加载,使输入图像由FPGA片外DDR传至片上的时间被卷积计算时间覆盖,同样起到了减小图像处理时间的作用。

结语

在深度学习计算这类计算密集型的应用场景下,通用硬件设计中的某些特点,如复杂任务调度等,很可能会成为计算瓶颈,导致降低计算效率,所以针对应用部署硬件的特征完成异构硬件上的计算优化,在当前已经成为研究的热点。Adlik首先在架构上支持多类异构硬件和计算引擎,也在FPGA异构计算上完成了一些技术实践,后续将继续进行特定硬件上的计算优化技术的研究,来加速推动AI模型的工程应用。

参考文献:

[1] https://github.com/Adlik/Adlik

[2] Xilinx-ug579-UltraScale Architecture DSP Slice User Guide

[3] Xilinx-WP486-Deep Learning with INT8 Optimization on Xilinx Devices

[4] Google Inc. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Interface.

Adlik在深度学习异构计算上的实践相关推荐

  1. 华为在深度学习平台上的优化实践

    "Kubernetes Meetup 中国 2017"--北京站3.18落幕啦!本次分享嘉宾彭靖田来自华为,他的分享题目是<华为在深度学习平台上的优化实践>.实录将从深 ...

  2. 当深度学习遇上异构并行计算

    当深度学习遇上异构并行计算 近几年来,以深度神经网络(DNN)为代表的深度学习如火如荼,深度学习的研究领域从开始的图像识别(如imagenet比赛)到现在的自然语言处理,几乎有席卷一切机器学习研究领域 ...

  3. 深度学习导论与应用实践(机器学习篇)

    深度学习导论与应用实践(机器学习篇) 前言 机器学习概述 机器学习基本定义和基本术语 数据预处理 数据清洗 数据集拆分 机器学习三要素 1.模型 判别模型和生成模型 概率模型和非概率模型 机器学习方法 ...

  4. python神经网络原理pdf_《深度学习原理与 TensorFlow实践》高清完整PDF版 下载

    1.封面介绍 2.出版时间 2019年7月 3.推荐理由 本书介绍了深度学习原理与TensorFlow实践.着重讲述了当前学术界和工业界的深度学习核心知识:机器学习概论.神经网络.深度学习.着重讲述了 ...

  5. 深度学习原理与TensorFlow实践

    深度学习原理与TensorFlow实践 王琛,胡振邦,高杰 著 ISBN:9787121312984 包装:平装 开本:16开 用纸:胶版纸 正文语种:中文 出版社:电子工业出版社 出版时间:2017 ...

  6. 一文回顾深度学习发展史上最重要经典模型

    这篇文章的目的是回顾经过时间考验的,被广泛采用的想法.我将介绍一小部分技术,这些技术涵盖了解现代深度学习研究所必需的许多基本知识.如果你是该领域的新手,那么这是一个很好的起点. 深度学习是一个瞬息万变 ...

  7. 当深度学习遇上量化交易——图与知识图谱篇

    ©PaperWeekly 原创 · 作者|桑运鑫 学校|上海交通大学硕士生 研究方向|图神经网络在金融领域的应用 本文主要回顾三篇将图和知识图谱应用到量化交易上的文章. NeurIPS 2019 论文 ...

  8. 深度学习端上部署工具

    深度学习端上部署工具 模型 公司 通用性别 说明 tf-lite tensorflow,开源 通用性最强,与 tensorflow 适配完美,不过性能一般 支持CPU和GPU roadmap 中预计年 ...

  9. 长文干货!走近人脸检测:从VJ到深度学习(上)(下)

    长文干货!走近人脸检测:从VJ到深度学习(下) http://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650324508&idx= ...

最新文章

  1. 《Maven官方指南》指南第三方部署到远程仓库
  2. CH451 点阵LED显示模块
  3. html text width,HTML5 Text Canvas rotate in case text width is larger than maximum width allowed
  4. C# 繁体,简体互转
  5. 【Nginx那些事】nginx配置实例(二)负载均衡
  6. 红橙Darren视频笔记 builder设计模式 navigationbar 导航栏第二版
  7. 盘点企业更换邮件服务器原因
  8. python发送文件_Python大文件传输
  9. ASP.NET 控件开发速成教程:生成复合控件
  10. android 3dtouch插件,iOS-3DTouch的简单实现
  11. 如何推导高斯过程回归以及深层高斯过程详解
  12. 新唐M251 CORTEX-M23内核移植TencentOS tiny教程
  13. 微信小程序优选驾考驾照考试预约+后台管理系统SSM-JAVA【数据库设计、论文、源码、开题报告】
  14. Matlab学习-经纬度在matlab内置地图显示
  15. Windows API函数 (绘图函数)
  16. 阿里云部署k8s集群
  17. 什么样的投影仪好,家用便携式投影仪怎么选?
  18. Java 程序员常用的开发工具
  19. 202003招银网络科技面经
  20. 2016 Server 部署 WSUS 服务器

热门文章

  1. ffmpeg 的 tbr tbc 和 tbn的意义
  2. MD文档的表情mark
  3. Hat trick [又名帽子戏法]
  4. 【转】 教你一眼认出英语单词的意思
  5. 如何在鼠标右键加入自定义电源计划(如关闭睿频降温) For Win10
  6. MinIO关闭公开桶的列表展示
  7. 数字IC后端实现TOP Floorplan专家秘籍
  8. 苹果收取30%过路费_你是顶是踩?
  9. 晶圆在低温探针台中的安装方式——GE Varnish
  10. “燕云十六将”之陈丽辉(11)