CNN图像分类服务

概述

FPGA具有低功耗,低延时,高性能的特点,在深度学习计算领域有很广阔的应用前景。FPGA从2013年开始就应用在许多典型的深度学习模型中,如DNN,RNN,CNN,LSTM等,涵盖了语音识别,自然语言处理,推荐算法,图像识别等广泛的应用领域。

FPGA云服务器提供了基于FPGA的深度卷积神经网络加速服务,单卡提供约3TOPs的定点计算能力,支持典型深度卷积网络算子,如卷积、逆卷积、池化、拼接、切割等。有效加速典型网络结构如VggNet、GoogLeNet、ResNet等。

我们基于FPGA的深度学习硬件,定制优化了主流深度学习平台,如caffe等,您可以直接将深度学习业务切换到FPGA平台,而无需考虑底层硬件细节。

通过使用预先训练好的ResNet-50进行图像分类性能的对比测试,在CPU、GPU和FPGA三类设备的物理机上的测试结果如下:

其中:

  • CPU为Intel Xeon CPU E5-2650 v3,使用OpenBLAS占用4核进行测试
  • GPU为Nvidia Tesla K40m

测试结果可以明显看到FPGA在时延上跟GPU差不多,比CPU快了超过12倍,在吞吐上FPGA更是比GPU超出1.5倍和比CPU超出近7倍。

CNN图像分类API接口

设备管理接口

查询FPGA设备通道数量

定义:int get_fpga_tunnel_num()
功能:获取FPGA设备通道数量
参数:无
返回:当前主机FPGA设备上独立通道数量

初始化FPGA设备句柄

定义:init_fpga_handle(FpgaHandle& fh, const FpgaHandle::Mode mode = FpgaHandle::FPGA_MODE, const int tunnel = 0)
功能:初始化FPGA设备句柄
参数:

参数 说明
fh FPGA设备句柄
mode 计算模式,取值范围FPGA_MODE或者CPU_MODE,默认FPGA模式
tunnel 使用设备通道,机器上FPGA设备有两个可以并行的独立计算通道,默认使用0号通道

返回:成功返回0,失败返回-1

释放FPGA设备句柄

定义:int free_fpga_handle(FpgaHandle& fh)
功能:释放FPGA设备句柄
参数:

参数 说明
fh FPGA设备句柄

返回:成功返回0,失败返回-1

图像分类相关接口

加载训练好的CNN模型

定义:int cnn_fpga_load(FpgaHandle& fh, const std::string& cnn_proto, const std::string& cnn_model, const std::string& cnn_means, const std::string& cnn_labels)
功能:加载训练好的CNN模型
参数:

参数 说明
fh FPGA设备句柄
cnn_proto CNN模型定义prototxt文件路径
cnn_model CNN模型caffemodel权值文件路径
cnn_means 图像均值文件路径
cnn_labels 图像标签文件路径

返回:成功返回0,失败返回-1

使用CNN模型分类图像

定义:int cnn_fpga_classify(FpgaHandle& fh, const cv::Mat& image, const int topk, std::vector& scores, std::vector& labels)
功能:使用CNN模型分类图像
参数:

参数 说明
fh FPGA设备句柄
image 输入图像
topk 概率最大的k个结果
scores 分类概率
labels 分类标签

返回:成功返回0,失败返回-1

释放CNN模型使用资源

定义:int cnn_fpga_free(FpgaHandle& fh)
功能:释放CNN模型使用资源
参数:

参数 说明
fh FPGA设备句柄

返回:成功返回0,失败返回-1

CNN图像分类DEMO说明

目录结构如下:

fpga-cnn
|----demo

>
|----env.sh
|----fpga_demo.cpp
|----Makefile
|----run_fpga.sh
|----run.sh
|----models

>
|----ResNet-50

>
|----ResNet-50.caffemodel
|----ResNet-50.labels
|----ResNet-50.means.binaryproto
|----ResNet-50.prototxt
|----ResNet-50.test.jpg

|----dependency/
|----include/
|----lib/

编译方法

在fpga-cnn/demo目录下运行:make clean && make

运行方法

1.脚本用CPU模式运行ResNet-50分类
在fpga-cnn/demo目录下运行:sh run.sh

2.脚本用FPGA模式运行ResNet-50分类
在fpga-cnn/demo目录下运行:sh run_fpga.sh

3.通过fpga_demo运行
./fpga_demo mode case
其中,mode参数可以是cpu或者fpga,case参数为模型目录和文件名称

CNN图像分类DEMO

为了便于用户开发,FPGA 云服务器包装了CNN图像分类demo:

目录结构

fpga-cnn
|----demo
|----env.sh
|----fpga_demo.cpp
|----Makefile
|----run_fpga.sh
|----run.sh
|----models
|----ResNet-50
|----ResNet-50.caffemodel
|----ResNet-50.labels
|----ResNet-50.means.binaryproto
|----ResNet-50.prototxt
|----ResNet-50.test.jpg
|----dependency/
|----include/
|----lib/

编译方法

在fpga-cnn/demo目录下运行:make clean && make

运行方法

  1. 脚本用CPU模式运行ResNet-50分类

    在fpga-cnn/demo目录下运行:sh run.sh

  2. 脚本用FPGA模式运行ResNet-50分类

    在fpga-cnn/demo目录下运行:sh run_fpga.sh

  3. 通过fpga_demo运行 ./fpga_demo mode case

    其中,mode参数可以是cpu或者fpga,case参数为模型目录和文件名称