diff --git a/doc/design/baidu_fpga/README.MD b/doc/design/baidu_fpga/README.MD new file mode 100644 index 00000000000000..7b5df44232d902 --- /dev/null +++ b/doc/design/baidu_fpga/README.MD @@ -0,0 +1,79 @@ +# Baidu FPGA on PaddlePaddle: Design Doc + +我们计划利用百度FPGA云主机和深度学习加速库Polaris,将FPGA集成到PaddlePaddle,使其支持更多的异构硬件。 +- 百度FPGA云服务器:百度云环境中配备的FPGA计算实例,通过该实例,可以快速地构建FPGA硬件加速程序[1]。 +- Polaris:一个百度开发的基于FPGA的高性能深度学习计算库(待开源,包含头文件和.a文件),供用户方便的调用百度FPGA实现的功能\[[2](#references)\]。 + + +我们计划基于重构中的PaddlePaddle进行开发,目标是: + +- 百度FPGA支持大部分常见的深度学习Operator。 +- 百度FPGA支持大部分常见的深度学习模型(包含图像、语音、NLP、广告)。 + + +## Contents + +- [Overview](#overview) +- [Actions](#actions) + - [CMake](#cmake) + - [Layers](#layers) + - [Activations](#activations) + - [Unit Tests](#unit-tests) + - [Protobuf Messages](#protobuf-messages) + - [Python API](#python-api) + - [Demos](#demos) + - [Benchmarking](#benchmarking) + - [Others](#others) + +## Overview + +我们会把Polaris作为第三方库集成进PaddlePaddle,利用百度FPGA云服务器能够快速构建基于FPGA的PaddlePaddle应用,整体框架图如下所示: +
+
+Figure 1. FPGA on Paddle. +
+ +## Actions +我们把集成方案大致分为了如下几个方面。 + +### CMake +我们会在`CMakeLists.txt`中会添加`WITH_FPGA`的选项,当设置这个值为`ON`的时候会启用FPGA编译功能。我们会在`cmake/external`目录新建`polaris.cmake`文件,它们会在编译PaddlePaddle的时候下载Polaris头文件和库,并放到PaddlePaddle的third_party目录中。 + +### Place +重构中的PaddlePaddle用Place类来标注数据在什么设备上,目前支持CPUPlace和GPUPlace。我们会在place.h中添加FPGAPlace,标注数据在FPGA设备上,并在其中添加int类型的deviceid来支持FPGA多设备。同时,我们参照CPUPlace和GPUPlace的实现,提供is_fpga_place等方法。 + +**备注**:重构中的PaddlePaddle有一些代码默认设备不是GPU就是CPU,如: +```C++ +bool places_are_same_class(const Place &p1, const Place &p2) { + return is_gpu_place(p1) == is_gpu_place(p2); +} +``` +添加FPGAPlace后需要修改这部分代码的逻辑。 + +### Memory +重构中的PaddlePaddle实现了buddy memomry allocator类来负责内存的管理,目前只支持CPU和GPU的版本。我们会添加一个FPGAAllocator来负责FPGA的内存管理。 + +### DeviceContext +重构中的PaddlePaddle实现了DeviceContext类来负责对应设备上面的资源管理,目前只支持CPU和GPU的版本。我们会添加一个FPGADeviceContext来负责管理FPGA设备的资源。 + +### Operator +重构中的PaddlePaddle是基于Operator的,不同设备(CPU、GPU)共享一个Op定义,OpKernel提供Compute方法\[[3](#references))\]。FPGA的数据格式与CPU、GPU是一样的,因此我们计划添加XXX_op_FPGA.cc文件实现FPGAKernel的计算逻辑,注册到原有的Operator上。如果Operator不包含XXX_op_FPGA.cc文件,则该Operator不支持FPGA设备。 + +**备注**:由于FPGA不如CPU和GPU灵活,因此FPGA只能支持大部分Operator,无法支持所有的Operator。 + +### Net +Net是包含了一系列的Operator,目前一个Net上的Operator只能运行在同一个设备上。由于FPGA不够灵活,部分Operator可能不支持FPGA,因此需要提供类似Parallel-nn的方法,即部分Operator在FPGA运行,部分Operator在CPU或GPU上运行。 + +### UnitTest +FPGA相关代码的单元测试会添加到对应修改的模块中。例如在添加了FPGAPlace,就需要在place_test.cc中添加FPGA的单元测试。单元测试需要使用FPGA设备,我们会提供FPGA云服务器作为测试平台。 + +### Python API +目前只考虑v2 API,使用FPGA时只需在设置Place时设置成FPGA,其他配置不变。 +```python +place = core.FPGAPlace() +``` + +## References +1. [百度FPGA云服务器](https://cloud.baidu.com/product/fpga.html) +2. [Baidu Polaris Project](http://fpga.baidu.com/) +3. [如何写新的Operator](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/dev/new_op_cn.md#%E5%AE%9A%E4%B9%89OpKernel%E7%B1%BB) diff --git a/doc/design/baidu_fpga/image/overview.png b/doc/design/baidu_fpga/image/overview.png new file mode 100644 index 00000000000000..8f120112eb70f3 Binary files /dev/null and b/doc/design/baidu_fpga/image/overview.png differ