取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
wenchen
Moderator
Moderator
2,182 次查看
注册日期: ‎05-27-2018

【竞赛作品赏析 】 人工智能加速器的应用与设计

人工智能加速器的应用与设计

 

  • 需求概述

广告是互联网行业的重要商业模式之一。在互联网广告行业中,准确地预测用户广告点击行为具有重要意义。在影响用户广告点击行为预测的众多指标中,广告点击率(CTR, Click-Through-Rate)是一种十分重要指标。所以,准确并快速地预测广告点击率有利于提升广告产生的收入,进一步增加互联网平台的吸引力,形成正向循环。

 

  • 目标概述

由于硬件平台限定为百度云异构多核平台,本项目的目标就是实现基于百度云异构多核平台的广告点击率预测系统,整体结构如图1所示。

系统的硬件平台为百度云异构多核平台,计算核心由Intel Xeon E5-2650 v4 CPU和Xilinx XCKU115 FPGA组成,CPU与FPGA通过PCIE总线使用DMA方式进行数据传输。

系统的处理流程为:

(1)对输入的待预测文件(test.txt)进行预处理;

(2)根据数据计算的密集程度,通过调用Polaris API使用FPGA对计算密集型任务进行加速计算,通过编写软件使用CPU对其他任务进行计算;

(3)将FPGA和CPU的计算结果进行汇总,并得出最终的结果;

(4)将最终结果输出到预测结果文件(predict.csv)。

 

 

faas.png

图1 系统整体结构

  • 设计与实现

系统设计流程如图2所示。

 faass.png

 

 

图2 系统设计流程

1DeepFM模型训练

系统所使用的广告点击率预测模型为DeepFM模型,训练使用的深度学习框架为百度的PaddlePaddle

实现可参考百度PaddlePaddleGitHub上提供的案例:

https://github.com/PaddlePaddle/models/tree/develop/legacy/deep_fm

 

2)预处理优化

预处理过程可分为统计信息和数据处理两部分。预处理每次处理的数量为一个数据片( ),数据片包含的数据条数根据实际情况决定。

统计信息指的是统计训练集的相关信息,包括整数型字段过滤和归一化信息,类别型字段One-Hot编号表;

数据处理指的是根据统计信息对每个字段进行处理得到相应的特征,整数型字段的过滤和归一化,类别型字段的过滤和One-Hot编码。

One-Hot编码可以理解为查找One-Hot编号表。由于One-Hot编号表示在统计信息后生成并保持不变,所以可以对统计完成后的One-Hot编号表进行排序,对于关键字相同的表项,记录下关键字对应的字段序号用以区别。查找时先使用二分法根据关键字查找排序后的One-Hot编号表,然后根据字段序号进行判断并进一步查找,直到找到对应的编号。

 

faas33.png

 

图3 预处理优化

 

3)网络参数提取

PaddlePaddle模型训练后会得到一个网络参数的压缩包。将这些参数转换成模型重构所需要的格式,需要经过三个步骤。

  • 将压缩包(model-pass-x-batch-xxx.tar.gz)使用v2.parameters.Parameters类中的get方法将网络参数保存为numpy.ndarray形式;
  • 使用savetxt方法将numpy.ndarray保存在.txt文件中;
  • 编写程序将.txt文件中的网络参数转换成模型重构所需要的形式(以数组的形式保存在头文件.h中)。

4)模型重构

模型重构是将DeepFM模型训练时使用的基于Python的框架使用C++重新实现并优化,如图4所示。重构后模型的正确性可以通过比较输出结果是否与PaddlePaddle实现输出结果一致进行验证。重构的好处在于与Polaris API使用同种编程语言方便测试和优化,并且能更好的发挥系统的性能。

        faas4.png

图4 模型重构

5)计算任务划分

模型计算公式可以参考:https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf

乘法计算的分布如图7所示。FC0 ~ FC2的乘法运算密集程度远大于其他层,并且经过测试得出:将DenseFM层放入FPGA进行计算时,无法达到加速效果,所以本项目仅对FC0~FC2层计算,及FC3中与FC2结果相关的计算进行加速。

注:特别地,对于DenseFM层,输入的平方项在预处理优化阶段已算好并保存,所以乘法计算中省略了平方项的计算。

 faas22.png

图5 计算任务划分

6Polaris加速

调用Polaris API加速可以分为以下7个步骤,如图6所示:

1)调用polaris_create_context创建PolarisContext对象;

2)调用polaris_malloc在FPGA中申请内存,

3)调用polaris_memcpy将网络参数拷贝到申请的内存中;

4)调用polaris_memcpy将数据拷贝到申请的内存中;

5)调用polaris_gemm、polairs_activation等进行计算;

6)调用polaris_memcpy将结果从FPGA内存拷贝至CPU内存中;如果所有的数据已经计算完成,则转至7),否则转至4);

7)调用polaris_destroy_context销毁PolarisContext对象,此时使用polaris_malloc申请的内存会自动释放。

faas5.png

                       图6 Polaris API加速流程图

根据表1,可以发现随着数据量的提升,DMA传输的速率也得到提升。所以本项目在上述4)步骤中数据拷贝的单位为一个数据片,以便更有效的利用DMA带宽。

faas6.png

                                                                 表1 DMA带宽与传输数据量对照表

本项目针对FC层加速示意图如图7所示。为了防止乘法计算规模过大导致FPGA计算出错(见系统测试及评估),每个数据片的计算过程分为多个子FC进行计算,每个子FC包括FC0~FC2的计算,和FC3中与FC2结果相关的计算。

faas7.png

图7  FC层加速

7)系统测试及评估

系统评估的参照系统为在Intel i5-3470上使用PaddlePaddle框架实现的系统。

1)预处理

参照系统中预处理使用处理器为Intel i5-3470,本系统中预处理使用处理器为Intel Xeon E5-2650 V4。结果时间为测量10次取平均。

参照系统:预处理时间大约为42.45s.

本系统:预处理时间大约为16.92s.

faas8.png

                                 图8  预处理时间

         2)数据交换

测试时发现当数据拷贝以单条数据为基本单位时,传输花费的时间为0.440s,当数据量为50万条时,数据传输花费的总时间为: 。

当数据拷贝以数据条数为50万的数据片为基本单位时,传输花费的时间为6.72S

faas9.png

                                      图9  数据交换时间

3)数据计算

测试时发现当一次矩阵乘法计算数据条数大于65535时,会出现计算错误,现象为计算的结果均相同,如图10示。当一次矩阵乘法计算数据条数小于等于65535时,计算正确,如图11示。

 

faas10.png 

                                       图10 计算错误结果

 

faas11.png

                                                   图11计算正确结果

 

  • 最终结果

faas13.png

本系统在基于百度提供测试集上的AUC:0.79921.

表2 最终结果

faas12.png

 

  • 总结与展望

  (1)总结

1)设计高效的查找算法(比如二分法),减少预处理时间;

2)重构模型以便更好地使用Polaris API,使系统的运行效率更高;

3)合理划分计算任务,将并行度高、乘法密集的任务使用FPGA加速;

4)数据传输采用批量传输方法,以便减少数据交换次数并提高带宽。

 2)展望

  • 希望能够解决使用Polaris API计算发生的计算错误问题;
  • 希望能够提供权值量化后的Polaris API计算接口(目前只支持浮点类型的权值);
  • 希望能够Polaris API内部提供Winograd变换功能,以便减少乘法数量;
  • 希望PaddlePaddle能够提供批量数据提供方式,并且优化模型来配合批量运算,以符合调用Polaris库的方法;
  • 希望在百度云异构多核平台上的FPGA资源更加丰富,包括DSP资源、内存资源;
  • 希望在百度云异构多核平台上使用多线程,实现FC层的流水,FM层与FC层的之间的并行。

------------------------------------------------华丽丽的分割线---------------------------------------------------------------------

 

2018 CCF TCARCH 计算机体系结构挑战赛

 

竞赛官网链接:http://aca2018.tcarch.org/competition.html

比赛题目链接:http://aca2018.tcarch.org/competition/2018CCFTCARCH.pdf

百度Polaris Project开源网址:https://baidu-fpga.github.io

 

------------------------------------------------华丽丽的分割线---------------------------------------------------------------------

 

欢迎扫码关注“Xilinx学术合作”官方公众号,实时获得最新技术干货:)

qrcode_XUP.jpg

这里是FPGA学习交流平台
这里有Xilinx最新技术详解
这里孵化产学研合作项目

 

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.


**~ Got a minute? Answer our Vitis HLS survey here! ~**


-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
2 回复数
weiyil
Moderator
Moderator
2,136 次查看
注册日期: ‎05-23-2018

谢谢wen的分享!

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
wenchen
Moderator
Moderator
2,120 次查看
注册日期: ‎05-27-2018

Hi~

     如果移动端查看不了图片,切换屏幕下方完整版或用电脑打开此链接:)

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.


**~ Got a minute? Answer our Vitis HLS survey here! ~**


-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励