【卷积加速】深度学习卷积算法的GPU加速实现方法

NVIDIA CUDA 高度并行处理器编程(六):并行模式:卷积 CUDA卷积。 阅读详情

参考链接:

http://blog.youkuaiyun.com/u010620604/article/details/52464529

http://blog.youkuaiyun.com/guoyilin/article/details/44222087

 

这篇论文主要讨论如何针对CNN做一些GPU矩阵计算的优化。传统CNN计算主要开销是在convolutions, activation function, pooling.

首先,我们看convolution的操作过程:

参数表:

 

O是输出input feature map,F是filter, D0是input  feature  map. 从公式看到如果用循环操作,需要7次循环,n,k,p,q4次可独立循环,c,r,s是累加操作的循环。

其次,我们看convolution在GPU上如何实现,文中介绍了三种方法:

第一,最直观的方法是直接实现如上公式,但是这种实现呢需要处理许多的corner case。 文中介绍cuda-convnet2是实现了该种方法,该种方法在不同取值的卷积参数空间效率不一,比如batch size > 128,效率很高,但是如果batch size < 64, 效率比较低。

第二,采用快速傅里叶变换fft,具体怎么做,参见论文Fast training of convolutional networks through ffts(待读). 该种方法效率非常高,但是由于filter需要扩大到和input一样大小,占用了大量内存,特别是CNN的前几层filter 大小远小于input大小。第二,当striding 参数>1, fft效率也不高。facebook最近开源了fbfft的实现,参见论文fast convolutional nets with fbfft: a gpu performance evaluation(待读).

第三,也就是现在caffe实现的方法。将卷积操作转换为密集矩阵相乘。将input data组装成大小为CRS x NPQ的矩阵,这使得内存相对原始input data的大小扩大了之多RS倍,举个例子,对AlexNet的conv1: 

Fm: 96 x 363

Dm: 363 x 387200(设double 类型, 需要临时分配内存1GB)

D: 128 x 3 x 227 x 227 = 19787136.

Dm 是D的内存大小的7倍。

具体卷积是如何转换为矩阵的呢?看如下图:

 

对照caffe的代码就是im2col_gpu,  caffe_gpu_gemm,  caffe_gpu_gemm 会调用cublasSgemm.

这种方法使用扩大临时内存方法换取密集矩阵计算的便利。

密集矩阵相乘为什么好呢,值得我们如此牺牲内存代价?因为 it has a high ratio of floating-point operations per byte of data transferred. 当矩阵越大,ratio越高,我们看到该方法的矩阵大小还是可以的,CRS乘机相对比较大。该方法的缺陷是: Dm太大,因此需要分片materiialize Dm,我们看caffe代码实现,在每次batch,遍历了N次的im2col_gpu,  caffe_gpu_gem。但是这种循环方法使得要多次读写Dm和读取D, 相对第一种方案需要更多memory traffic. 因此,本文采用了另一种实现:

对A x B = C, 分块加载A和B从off-chip memory to on-chip caches, 同时计算C的一部分。这样减少了数据传输带来的延迟。对于Dm,我们是在on-chip上转换成Dm,而不是在off-chip上转换.

三种方法性能的比较:

 

上述方法还有些没解释清楚,下面进一步补充:

 

一直用cuDNN所以很好奇其实现,于是花了点时间看了一下cuDNN:Efficient Primitives for Deep Learning,还是很容易懂的。 
1. caffe的卷积 
首先,caffe的卷积操作是将卷积转化为矩阵乘法,然后就可以用已有的GPU矩阵乘法的优化算法进行计算。具体可以参见这篇博文。 
这个方法由于需要将输入D和卷积核F进行转化,将D从四维数组转化为二维矩阵时数据规模变大,因而会占用过多显存。而且卷积核越大,stride越小,显存耗费越高。 
2. FFT 计算卷积 
还有一种使用FFT计算卷积。此时需要将卷积核扩大成和feature map一样的长宽尺寸,这在二者相差较大的时候也是很浪费的。另外,当stride大于1时,数据比较稀疏,采用FFT效果也并不理想。 
3. NVIDIA的矩阵乘法 
NVIDIA对矩阵乘法支持每次单独计算子矩阵。一边计算子矩阵的结果,一边准备下一组数据,最后合并得到结果。有点流水线的意思。
4. cuDNN convolution 
论文采用的是将卷积转化为矩阵乘法的方法,利用NVIDIA的矩阵乘法的特点,做了一些改进。具体来说就是,计算F(卷积核)对D(输入的feature map)的卷积,并不是将D转化后的二维矩阵直接存到显存里面,而是lazily materialing的方式。就是说,当需要用到这部分数据的时候,直接到D中索引对应的数据,并加载到显存里面进行计算,这样就避免了占用额外显存这一弊端。因此该方法还需要一个快速从D中索引数据的算法。

 

本部分介绍Caffe中卷积的实现。

1 简介

  1. 使用im2col分别将featrue maps 以及卷积核转换成矩阵
  2. 调用GEMM(GEneralized Matrix Multiplication)对两矩阵内积。

  • 图来自引用论文[1]

2 详细介绍

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

最后,Filter Matrix乘以Feature Matrix的转置,得到输出矩阵Cout x (H x W),就可以解释为输出的三维Blob(Cout x H x W)。

3 作者的说明

在引用[3]中,作者说明了为何这样做卷积。 
大致是:优化CNN中的卷积不是一件简单的事。由于时间、成本上的种种原因,作者作用了这样一种temporary、lazy的方案。但是却发现这样一种方案取得的效果还比较好。

[1]. High Performance Convolutional Neural Networks for Document Processing 
[2]. https://github.com/Yangqing/caffe/wiki/Convolution-in-Caffe:-a-memo 
[3]. https://www.zhihu.com/question/28385679

DeepRoute Lab | CUDA算子优化:转置篇 转置是深度模型中应用最广泛的算子之一。各种深度学习框架崛起的今天,它被“隔离”到了框架的底层,不再显式的活跃于用户面前。谈及转置,就不得不先聊聊卷积的优化算法以及它们所需要的图像数据格式。 阅读详情

相关推荐

Python实现基于POA-CNN-LSTM鹈鹕优化算法(POA)优化卷积长短期记忆神经网络进行时间序列预测的详细项目实例

本项目提出了一种基于鹈鹕优化算法(POA)优化的CNN-LSTM混合神经网络模型,用于时间序列预测。主要创新点包括:1) 将POA智能优化算法应用于CNN-LSTM模型的超参数优化,提高了模型性能;2) 结合CNN的局部特征提取能力和LSTM的时序建模优势,构建了混合网络结构;3) 开发了完整的预测系统,包含数据预处理、特征工程、模型构建、优化训练、评估可视化等模块。项目在金融市场、能源负荷、工业设备等场景进行了验证,相比传统方法显著提升了预测精度。系统采用模块化设计,支持GPU加速和可视化界面,具有良好的

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 1781

深度学习卷积算法的GPU加速实现方法

参考链接: http://blog.youkuaiyun.com/u010620604/article/details/52464529 http://blog.youkuaiyun.com/guoyilin/article/details/44222087 这篇论文主要讨论如何针对CNN做一些GPU矩阵计算的优化。传统CNN计算主要开销是在convolutions, activat

Mr. Mao的专栏 1万+

基于FPGA的深度学习算法加速

学习总结——基于FPGA的深度学习算法加速 1、深度学习算法加速的方法 2、为什么用FPGA来加速YOLOV2 3、FPGA简介 4、PYNQ框架与HLS加速理论 5、实验结果 1、深度学习算法加速的方法 1.1 加速方案 1.GPU加速:GPU是一种多核处理器,GPU起初是用来进行图形处理任务的,经过长时间的发展,GPU的发展是日趋复杂的,而且针对不同的领域也有不同。 当GPU被用来进行通用计算时,就产生了一些通用的计算框架,比如说Opencl和CUDA。比如说高端GPU TItan系列,其频率可以达到1

han422858897的博客 1万+

CUDA笔记-卷积计算

CUDA 3D convolution - ijpq - 博客园overview https://www.cnblogs.com/ijpq/p/15405106.html

黑山老妖的博客 5207

深度学习中的卷积算子原理

卷积算子通过在输入数据上进行滑动窗口操作,提取局部特征;而GPU加速利用其强大的并行计算能力和高效内存架构,显著提升计算速度。PyTorch和TensorFlow分别通过动态计算图和静态计算图、自动微分、混合精度训练、操作融合等技术,实现深度学习任务的高效计算。这些优化技术在大规模深度学习任务中发挥着关键作用,确保模型训练和推理的高效性和准确性。

TheJustice_的博客 2478

深度学习中的卷积算子优化与GPU加速

/ 共享内存用于存储输入和卷积核的局部块// 加载输入数据到共享内存++kh) {++kw) {GPU加速和算子优化在深度学习中至关重要。通过使用高效库、混合精度训练、并行计算策略、操作融合、自定义CUDA内核等方法,可以显著提高深度学习模型的训练和推理速度。这些优化技术不仅提升了计算效率,还增强了模型在实际应用中的性能和可扩展性。

TheJustice_的博客 2788

PyTorch - 03 - CUDA之解释:为什么深度学习使用GPU?

PyTorch - 03 - CUDA之解释:为什么深度学习使用GPU?为什么深度学习和神经网络使用GPUGraphics Processing Unit (GPU)Parallel Computing神经网络:并行计算卷积示例Nvidia硬件(GPU)和软件(CUDA)PyTorch随附CUDA在PyTorch中使用CUDAGPU可能比CPU慢GPGPU计算Tensors Are Up Next 为什么深度学习和神经网络使用GPU 这篇文章的目的是帮助初学者了解CUDA是什么以及它如何与PyTorch配合

weixin_48367136的博客 3019

DL4J实战之四:经典卷积实例(GPU版本)

内存:32G DDR4硬盘:NvMe 1T实际证明,以上配置可以顺利运行一文中的实例,并且可以通过GPU加速训练(GPU和CPU的对比数据会在后面给出)在Ubuntu16环境安装NVIDIA驱动和CUDA9.2的过程,可以参考文章,这里面安装的CUDA版本是9.1,请自行改为9.2版本。

2401_85154765的博客 905

Halide深度学习推理加速终极指南:5倍性能提升的完整教程

Halide是一个专注于快速、可移植数据并行计算的编程语言,特别适合深度学习推理加速任务。本教程将向你展示如何利用Halide实现高达5倍的性能提升,让你的深度学习模型在各种硬件平台上高效运行。 ## 🚀 为什么选择Halide进行深度学习推理加速? 在深度学习应用中,推理速度往往是决定用户体验的关键因素。Halide通过创新的分离式设计,将算法描述与优化调度相分离,让开发者能够轻松实现高性

gitblog_00126的博客 987

如何给深度学习加速——模型压缩、推理加速

深度学习模型往往受到端计算力的限制,无法很好的部署在移动端或无法降低端的计算成本。例如自动驾驶的模型就过于巨大,而且往往是很多模型并行,所以一般会用一些加速的方法来降低推算的计算力要求。 加速方法有多种不同角度:网络结构,模型推理加速,模型剪枝,参数量化等。 Table of Contents 网络结构加速 模型推理加速 优化模型的推理顺序 降低参数精度加速 模型剪枝加速 参数量化...

ygfrancois的博客 1万+

GPU加速深度学习:GPU加速和CPU加速之间的性能差距

在深度学习应用中,GPU(图形处理器) 和 CPU(中央处理器) 一直是最常用的计算平台。虽然它们在某些任务上表现出强大的性能,但它们之间的性能差距可能会限制您在深度学习中的应用能力。本文旨在探讨 GPU 加速深度学习与 CPU 加速之间的性能差距,并提出了一种结合两种加速方式以提高性能的方法。GPU 主要通过并行计算和分布式处理来加速深度学习算法的训练。在 GPU 中,多个线程可以同时处理数据和计算,从而提高训练速度。

AI天才研究院 5660

cuda编程笔记(17)--使用 cuDNN 实现卷积、激活、归一化等前向操作

卷积→激活→归一化→使用前需要:创建设置输入输出张量描述子设置卷积/激活/BN 描述子申请临时工作空间。

ouliten的博客 1091

第90节:GPU 加速卷积操作

卷积操作是深度学习中卷积神经网络(CNN)的核心计算,涉及输入特征图与卷积核的滑动窗口乘加计算。

yumeiguo的博客 195

[超级详细]如何在深度学习训练模型过程中使用GPU加速

在深度学习当中,我们训练模型通常要对模型进行反复的优化训练,仅用CPU来进行训练的话需要花费很长时间,但是我们可以使用GPU来加速训练模型,这样就可以大大减少我们训练模型花费的时间。

我不会写代码 4万+

convnet:C ++中卷积神经网络的GPU实现

欢迎使用ConvNet。 ConvNet是卷积神经网络的一种基于C ++的快速GPU实现。 支持多GPU架构(多GPU,单机)。 提供仅基于CPU的快速功能提取器。 安装 [安装指南]( ) 预训练模型 提供了用于训练和特征提取的预训练模型和示例,以用于 讲解 快来了。 文献资料

ROS学习【11】-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真(camera、kinect、Lidar),并通过Rviz进行数据显示

ROS学习-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真目录一、Gazebo环境搭建前的准备1、将搭建模型下载到我们的gazebo环境下2、升级我们的gazebo版本二、创建配置launch文件参数的world文件1、进入工程包mbot_gazebo2、创建文件夹worlds3、进入该文件夹4、创建playground.world文件5、创建room.world文件三...

qq_42451251的博客 3608

GPU 加速计算:加速深度学习

GPU 加速计算:加速深度学习 关键词:GPU加速,深度学习,分布式计算,并行计算,高性能计算,机器学习,科学计算,人工智能 1. 背景介绍 1.1 问题由来 随着深度学习技术的发

AI大模型应用之禅 2189

10分钟搞定manim安装与vscode配置

manim安装与vscode配置

帅帅de三叔 3411

PyTorch卷积层参数详解(GPU加速卷积运算)

深入解析PyTorch中Conv2d各参数的作用及其对模型结构的影响,揭示GPU如何通过并行计算大幅加速卷积操作。从kernel_size到dilation,从CUDA核心到混合精度训练,全面梳理深度学习中关键的软硬件协同机制,帮助开发者优化模型设计与训练效率。

weixin_34598113的博客 708

基于 Logistic 混沌映射和 Arnold 变换 的变换域水印改进算法【高级网络与信息安全技术-信息隐藏期末课程论文】

摘要:\textbf{摘要:}摘要:本文提出了一种新的水印算法是一种图像认证的新方法。算法首先使用Logistic混沌映射加密水印图像,然后使用Arnold变换置乱水印。同时改变了水印图像的像素位置和像素值,大大提高了算法的安全性。再使用DCT变换嵌入水印,并且结合人类视觉系统的特点来提升水印嵌入的透明性。实验结果表明,本文提出的水印算法可以大幅度提高水印嵌入的透明性与安全性的同时,并不降低算法的鲁棒性。注:完整的代码和论文在文末,百度网盘链接。

zik的博客 891

Buck电源设计常见的一些问题(五)MOS管振荡抑制方法(三)

关于开关节点振荡的产生机制和抑制问题,总结了三种抑制方法。第一种方法是利用输入端的高频去耦电容;第二种方法是设计 RC 缓冲电路;第三种方法是优化自举电路的串联电阻。以上三种方法均通过实验加以验证,对开关节点振荡具有很好的抑制作用。应该综合同步 Buck 变换器的各项指标权衡设计。

小幽余生不加糖 1633
上一篇: 【基于Centos】驱动安装
下一篇: 腾讯Deep CNNS卷积加速架构
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值