CUDA基础 [3]:流和事件
流(stream)
设备操作包括:数据传输和执行kernel函数。
在cuda中,所有的设备操作都在stream中执行。当没有指定stream时,使用默认的stream。
默认stream
默认stream是一个针对设备操作同步的stream,也就是说,只有当所有之前设备上任何stream(包括默认stream)里面的操作全部完成时,才开始默认stream里面操作的执行,并且默认stream里面的一个操作必须完成,其他任何stream(包括默认stream)里面的操作才能开始。
举个例子:
cudaMemcpy(d_a, a, numBytes, cudaMemcpyHostToDevice); increment<<<1,N>>>(d_a);cudaMemcpy(a, d_a, numBytes, cudaMemcpyDeviceToHost);
从设备端来看,这三个操作都在默认stream中,并且按顺序执行;
从主机端来看,数据传输是阻塞的或者同步传输,而kernel是异步的;
第一步主机到设备的数据传输是同步的,CPU线程不能 ...
CUDA基础 [2]:Get Started
CUDA(Compute Unified Device Architecture)计算统一设备框架
GPU架构特点
核的角度:首先CPU由专为顺序串行处理而优化的几个核心组成。而GPU则由数以千计的更小、更高效的核心组成,这些核心专门为同时处理多任务而设计,可高效地处理并行任务。也就是,CPU虽然每个核心自身能力极强,处理任务上非常强悍,无奈他核心少,在并行计算上表现不佳;反观GPU,虽然他的每个核心的计算能力不算强,但他胜在核心非常多,可以同时处理多个计算任务,在并行计算的支持上做得很好。GPU和CPU的不同硬件特点决定了他们的应用场景,CPU是计算机的运算和控制的核心,GPU主要用作图形图像处理。图像在计算机呈现的形式就是矩阵,我们对图像的处理其实就是操作各种矩阵进行计算,而很多矩阵的运算其实可以做并行化,这使得图像处理可以做得很快,因此GPU在图形图像领域也有了大展拳脚的机会。
数据处理角度:CPU需要很强的通用性来处理各种不同的数据类型,比如整型、浮点数等,同时它又必须擅长处理逻辑判断所导致的大量分支跳转和中断处理,所以CPU其实就是一个能力很强的伙计,他能把很多事 ...
CUDA基础 [1]:CPU GPU TPU NPU
CPU(Central Processing Unit)中央处理器
CPU的结构主要包括运算器(ALU, Arithmetic and Logic Unit)、控制单元(CU, Control Unit)、寄存器(Register)、高速缓存器(Cache)和它们之间通讯的数据、控制及状态的总线。
GPU(Graphics Processing Unit)图形处理器
也是由三个部分组成:计算单元、控制单元和存储单元。
CPU精于控制和复杂运算,而GPU精于简单且重复的运算:比如矩阵运算。
CPU:擅长流程控制和逻辑处理,不规则数据结构,不可预测存储结构,单线程程序,分支密集型算法
GPU:擅长数据并行计算,规则数据结构,可预测存储模式
CPU是顺序执行运算,而GPU是可以大量并发的执行运算。
虽然GPU是为了图像处理而生的,但在结构上并没有专门为图像服务的部件,只是对CPU的结构进行了优化与调整,所以GPU不仅可以用在图像领域,它还被用来科学计算、密码破解、数值分析,海量数据处理(排序,Map-Reduce等),金融分析等需要大规模并行计算的领域。
但GPU无法单独工作,必须由 ...
AI算法基础 [8]:MNN中的ConvolutionTiled实现
前言
一般卷积,主要针对CPU后端,基于/source/backend/cpu/compute/ConvolutionTiledExecutor.cpp源码展开。
以下面的数据输入为例,由于kernelX != kernelY,因此Strassen和Winograd均不适用。
input: 1 x 8 x 224 x 224,C4 Pack格式为: 1 x 2 x 224 x 224 (x 4)
weight: 16 x 8 x 3 x 5
output: 1 x 16 x 222 x 220,C4 Pack格式为: 1 x 4 x 222 x 220 (x 4)
没有特殊说明,代码版本均为MNN release_1.1.7版本,release_1.2.3版本已经将ConvolutionTiledExecutor的部分实现融合到了DenseConvolutionTiledExecutor.cpp中
权重重排
static void _initWeight(float *dest, const float *source, float* cache, int depth, int o ...
AI算法基础 [7]:MNN中的Strassen实现
前言
主要针对CPU后端,基于/source/backend/cpu/compute/Convolution1x1Strassen.cpp源码展开。
以输入大小:1 x 8 x 224 x 224(C4 Pack为1 x 2 x 224 x 224 (x 4)),权重大小: 16 x 8 x 1 x 1(MNN中将其变换为1 x 4 x 8 (x 4),即对输出通道(卷积核个数)进行C4 Pack), 输出1 x 16 x 224 x 224(C4 Pack为1 x 4 x 224 x 224 (x 4))为例进行辅助说明。
没有特殊说明,代码版本均为MNN release_1.2.3版本
适用条件
bool fastWay = common->kernelY() == 1 && common->kernelX() == 1 && output->width() == input->width() && output->height() == input->height() ...
AI算法基础 [6]:Strassen算法原理
前言
Strassen最早于1968年由Volker Srassen发表于论文《Gaussian Elimination is not Optimal》,将矩阵乘法的算法复杂度首次从O(n3),where log2(8)=3O(n^3),where\space log_2(8)=3O(n3),where log2(8)=3降低到O(n2.807),where log2(7)≈2.807O(n^2.807),where\space log_2(7)≈2.807O(n2.807),where log2(7)≈2.807。后来有不同的方法基于此算法进行改进。
MNN Strassenconv1x1采用的是2008年发表的这边文章中的算法《Memory efficient scheduling of Strassen-Winograd’s matrix multiplication algorithm》,主要针对memory访问上进行优化。
原理
普通矩阵乘
以C=ABC=ABC=AB为例,假设AAA和BBB均为n×nn × nn×n矩阵,则CCC中每个元素需要通过以下方式计算:
cij= ...
AI算法基础 [5]:MNN中的Winograd实现
前言
主要针对CPU后端,基于/source/backend/cpu/compute/ConvolutionWinograd.cpp源码展开。
部分章节以输入大小:1 x 8 x 224 x 224,权重大小: 16 x 8 x 3 x 3, 输出1 x 16 x 222 x 222 为例进行辅助说明。
MNN卷积相关运算统一使用CAFFE_C4格式,即MNN自创的NC4HW4格式,具体排布介绍:NC4HW4数据排布
Winograd适用条件
canUseWinograd函数,具体代码如下:
bool ConvolutionWinograd::canUseWinograd(const Convolution2DCommon *common) { if (common->kernelY() != common->kernelX() || common->kernelY() <= 1) { return false; } if (common->dilateX() != 1 || common-&g ...
AI算法基础 [4]:Winograd算法原理
简介
Winograd算法起源于1980年,作者Shmuel Winograd 在文章《On multiplication of polynomials modulo a polynomial》中提出的减少FIR滤波器计算量的一个算法。他指出,对于输出个数为mmm,参数个数为rrr的FIR滤波器,不需要m×rm×rm×r次乘法计算,而只需要u(F(m,r))=m+r−1u(F(m,r))=m+r-1u(F(m,r))=m+r−1次乘法计算即可。
后来,有人发现此算法可以用来优化加速CNN网络的卷积计算《Fast Algorithms for Convolutional Neural Networks》,从此Winograd算法被广泛应用于各推理框架中。
原理
1D Winograd算法
1维卷积 F(2,3)F(2,3)F(2,3) 为例,输入信号d=[d0,d1,d2,d3]Td=[d_0,d_1,d_2,d_3]^Td=[d0,d1,d2,d3]T,卷积核g=[g0,g1,g2]Tg=[g_0,g_1,g_2]^Tg=[g0,g1,g2]T,则卷积可以写成如下矩阵乘法 ...
AI数据集 [1]:COCO数据集
简介
MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。
COCO数据集是一个大型的、丰富的物体检测,分割和字幕数据集。这个数据集以scene understanding为目标,主要从复杂的日常场景中截取,图像中的目标通过精确的segmentation进行位置的标定。图像包括91类目标,328,000影像和2,500,000个label。目前为止有语义分割的最大数据集,提供的类别有80 类,有超过33 万张图片,其中20 万张有标注,整个数据集中个体的数目超过150 万个。
COCO API
install
clone
cd <workdir>git clone https://hub.fastgit.org/cocodataset/cocoapi.git
setup
编译并安装到本地:
cd cocoapi/PythonAPI/python setup.py build_ext ...
AI算法基础 [3]:mAP
前言
AP(Average Precision,平均精度)是衡量目标检测算法好坏的常用指标,在Faster R-CNN,SSD等算法中作为评估指标。
AP等于召回率(Recall)值取0-1时,准确率(precision)值的平均值。
Precision
正确预测结果占所有预测正例的百分比
比如你预测100个图片是苹果,其中80个真的是苹果,则Precision=0.8
Precision=TPTP+FPPrecision=\frac{TP} {TP+FP}Precision=TP+FPTP
Recall
正确预测结果占所有事实正例的百分比
比如总共有100个图片是苹果,你成功预测了50个,则Recall=0.5
Recall=TPTP+FNRecall=\frac{TP} {TP+FN}Recall=TP+FNTP
IoU
参见mIoU笔记
AP
下面的例子演示AP怎么计算的
共进行10次预测,直到recall为1为止;
第二列表示预测是否正确,标准就是IoU≥0.5;
随着预测进行,recall值会一直增加,但precision会 ...