nnpack详解

2023-11-07

NNPACK详解
一:NNPACK简介
NNPACK由facebook开发,是一个加速神经网络计算的加速包,NNPACK可以在多核CPU平台上提高卷积层计算性能NNPACK采用的快速卷积算法是基于Fourier transform 和 Winograd transform算法
二:前向计算的性能
如下图(Intel Core i7 6700K vs BVLC Caffe master branch)
Library Caffe NNPACK NNPACK NNPACK
Algorithm im2col + sgemm FFT-8x8 FFT-16x16 Winograd F(6x6, 3x3)
AlexNet:conv2 315 ms 129 ms 86 ms N/A
AlexNet:conv3 182 ms 87 ms 44 ms 70 ms
AlexNet:conv4 264 ms 109 ms 56 ms 89 ms
AlexNet:conv5 177 ms 77 ms 40 ms 64 ms
VGG-A:conv1 255 ms 303 ms 260 ms 404 ms
VGG-A:conv2 902 ms 369 ms 267 ms 372 ms
VGG-A:conv3.1 566 ms 308 ms 185 ms 279 ms
VGG-A:conv3.2 1091 ms 517 ms 309 ms 463 ms
VGG-A:conv4.1 432 ms 228 ms 149 ms 188 ms
VGG-A:conv4.2 842 ms 402 ms 264 ms 329 ms
VGG-A:conv5 292 ms 141 ms 83 ms 114 ms
OverFeat:conv2 424 ms 158 ms 73 ms N/A
OverFeat:conv3 250 ms 69 ms 74 ms 54 ms
OverFeat:conv4 927 ms 256 ms 272 ms 173 ms
OverFeat:conv5 1832 ms 466 ms 524 ms 315 ms
三:NNPACK支持的层
  • 卷积层 (Convolutional layer
  • 全连接层 (Fully-connected layer
  • 池化层 (Max pooling layer
  • ReLU layer
  • Softmax layer
四:NNPACK 编译 (Linux OS)
1、编译安装 PeachPy
git clone https://github.com/Maratyszcza/PeachPy.git
cd PeachPy
[sudo] pip install --upgrade -r requirements.txt
python setup.py generate
[sudo] pip install --upgrade .
2、安装ninja 和 ninja-syntax python 模块
sudo apt-get install ninja-build || brew install ninja
[sudo] pip install ninja-syntax
3、下载编译NNPACK
git clone --recursive https://github.com/Maratyszcza/NNPACK.git
cd NNPACK
python ./configure.py
ninja
注意:
编译nnpack过程如果出现一些找不到头文件等情况,一般是需要下载第三方库。在nnpack的包中有对于的目录third-party,分别下载,放到对应得目录中,并分别编译。
四:测试
NNPACK编译完成之后,在NNPACK-master/bin目录下有测试卷积、全连接等可执行程序。
例如,测试卷积输入通道 16 ,输出通道 16 , 输入图像180*180,kernel 3*3 ,迭代100次,
执行结果:
五、使用NNPACK 实现卷积
  • input channels: 1
  • output channels:1
  • input size:4*4
  • kernel size:3*3
1、 代码(conv_nnpack.c)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/time.h>
#include<nnpack.h>
int main(int argc , char** argv)
{
	//init nnpack
	enum nnp_status init_status = nnp_initialize();
	if (init_status != nnp_status_success) {
		fprintf(stderr, "NNPACK initialization failed: error code %d\n", init_status);
		exit(EXIT_FAILURE);
	}

        enum nnp_convolution_algorithm algorithm = nnp_convolution_algorithm_auto;
        const size_t batch_size = 1;
        const size_t input_channels = 1;
        const size_t output_channels = 1;
        const struct nnp_padding input_padding = { 0, 0, 0, 0 };
        const struct nnp_size input_size ={ 4, 4 };
        const struct nnp_size kernel_size = { 3, 3 },;
        const struct nnp_size output_size = {
                .width = (input_padding.left + input_size.width + input_padding.right - kernel_size.width) / output_subsampling.width + 1,
                .height = (input_padding.top + input_size.height + input_padding.bottom - kernel_size.height) / output_subsampling.height + 1
        };
	int iter=1;

	//malloc memory for input, kernel, output, bias
	float* input = (float*)malloc(batch_size * input_channels *input_size.height *input_size.width * sizeof(float));
	float* kernel = (float*)malloc(input_channels * output_channels * kernel_size.height * kernel_size.width * sizeof(float));
	float* output = (float*)malloc(batch_size* output_channels * output_size.height * output_size.width * sizeof(float));
	float* bias = (float*)malloc(output_channels * sizeof(float));

	pthreadpool_t threadpool=NULL;
	//flase:only one thread, true: mutiple threads 
	if (false) { 
                threadpool = pthreadpool_create(options.threads);
                printf("Threads: %zu\n", pthreadpool_get_threads_count(threadpool));
    }

	struct nnp_profile computation_profile;//use for compute time;
	//init input data
	int i,j;
	for(int c=0; c<input_channels;c++ ){
		for(i=0; i<input_size.height; i++){
			for(j=0; j<input_size.width; j++){
				input[c*input_size.height*input_size.width+i*input_size.width+j] = (i*input_size.width+j)*1.0;
			}
		}
	}

	//init kernel data
	for(int i=0; i<output_channels;i++ ){
		for(j=0; j<input_channels*kernel_size.height*kernel_size.width; j++){
			kernel[i*input_channels*kernel_size.height*kernel_size.width+j] = 1.0;			
		}
	}

	//init bias data
	for(int i=0; i<output_channels;i++ ){
		bias[i] = 1.0;
	}

	//execute conv
	struct timeval conv_start;
	struct timeval conv_end;
	gettimeofday(&conv_start,NULL);
	for(int i=0;i<iter;i++){
		nnp_convolution_output(algorithm,
					batch_size,
					input_channels,
					output_channels,
					input_size,
					input_padding,
					kernel_size,
					input,
					kernel,
					bias,
					output,
					threadpool,
					&computation_profile);
	}
	gettimeofday(&conv_end,NULL);
	//printf ouput data
	for(i=0;i<output_channels; i++){
		for(j=0;j<output_size.height*output_size.width; j++){
			printf("%f\t",output[i*output_size.height*output_size.width+j]);	
		}
		printf("\n");	
	}
	float conv_time_use = 1000.0*(float)(conv_end.tv_sec-conv_start.tv_sec)+(float)(conv_end.tv_usec-conv_start.tv_usec)/1000.0;
	printf("conv Time use = %f(ms)\n",conv_time_use);
	printf("conv mean Time use = %f(ms) / iter\n",conv_time_use/iter);
	return 0;
}

2、编译
编译,要链接 -lnnpack -lphterad 。-lphterad是第三方库pthreadpool使用pthread创建线程,pthreadpool是根据平台CPU的核数,创建对应数量的线程。此处代码false使用一个线程。
3、输出结果:
六:NNPACK与 im2col+sgemm卷积性能对比
  • im2col+sgemm使用openblas
  • intput channels : 16
  • output channels :16
  • input size : 360*360
  • kernel size: 2*2 , 3*3, 5*5
如下图:
图 nnpack vs im2col_segemm
  2 3 5 10
nnpack 6.69ms 7.38ms 9.71ms 26.44ms
im2col_sgemm 37.83ms 86.95ms 236.91ms 929.66ms
表 nnpack vs im2col_segemm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nnpack详解 的相关文章

  • 在Caffe中调用TensorRT提供的MNIST model

    在TensorRT 2 1 2中提供了MNIST的model 这里拿来用Caffe的代码调用实现 原始的mnist mean binaryproto文件调整为了纯二进制文件mnist tensorrt mean binary 测试结果与使用
  • Caffe源码(十一):io.cpp 分析

    目录 目录 简单介绍 主要函数 ReadProtoFromTextFile 函数 WriteProtoToTextFile 函数 ReadProtoFromBinaryFile 函数 WriteProtoToBinaryFile 函数 Re
  • mnist example for lstm in caffe

    下面给出在caffe中使用lstm的一个例子 其中数据集采用mnist 为了实现mnist数据的序列话 将mnist的每一行看成一帧 每一列则就是该帧的特征矢量 在使用lstm时 一定要注意clip markers 每个序列以0开始 后面接
  • 【c++】14.编译proto和proto相关用法

    编译proto和proto相关用法 关于proto相关的知识可以参考系列博客 https blog csdn net daaikuaichuan category 9869251 html xx proto文件中如果要注释的话 注释符号也是
  • ubuntu16.04 安装CUDA 8.0 和 cuDNN 5.1 /cudnn6.0,可适用于gpu版本的(tensorflow,caffe,mxnet)

    转载https zhuanlan zhihu com p 27890924文章 略有修改 感谢原作者 环境 ubuntu 16 04 GTX 960 安装步骤 安装Nvidia驱动 系统设置 gt 软件与更新 gt 附加驱动 如下图选择nv
  • Windows7 64bit VS2013 Caffe test MNIST操作步骤

    在http blog csdn net fengbingchun article details 49849225中用Caffe对MNIST数据库进行训练 产生了model 下面介绍下如何将产生的model应用在实际的数字图像识别中 用到的
  • Caffe源码中caffe.proto文件分析

    Caffe源码 caffe version 09868ac date 2015 08 15 中有一些重要文件 这里介绍下caffe proto文件 在src caffe proto目录下有一个caffe proto文件 proto目录下除了
  • [caffe]:检查失败:检查失败:hdf_blobs_[i]->shape(0) == num(200 vs. 6000)

    我有训练并将数据标记为 data mat 我有 200 个训练数据 包含 6000 个特征 标签为 1 1 已保存在 data mat 中 我正在尝试将数据转换为 hdf5 并使用以下命令运行 C affe load data mat hd
  • Tensorflow的非对称填充假设

    为什么 TensorFlow 选择在右下角填充 With SAME填充 对我来说 在第一个真实像素处启动内核的中心锚点是合乎逻辑的 由于使用了不对称填充 这导致与其他一些框架存在差异 我确实明白 原则上不对称填充是好的 因为否则会留下未使用
  • 如何将 .npy 文件转换为 .binaryproto?

    我使用 python 创建了一个平均图像文件并将其保存到 numpy 文件中 我想知道如何将此 npy 文件转换为 binaryproto 文件 我正在使用此文件来使用 GoogLeNet 进行训练 您可以简单地使用 numpy 创建 bi
  • 如何修改Imagenet Caffe模型?

    我想修改 ImageNet caffe 模型 如下所述 由于时间网络的输入通道数与此不同 空间网络 20 vs 3 我们对 ImageNet 模型滤波器进行平均 先跨过通道一层 然后复制平均结果 20 时间网络的初始化 我的问题是如何才能达
  • Caffe 训练/测试网络输出是什么意思?

    在 Caffe 中训练时 每次迭代都有训练和测试网络输出 我知道这就是损失 但是 这是我批次的平均损失还是总损失 这对于分类和回归来说是一样的吗 例如 如果我有一批 100 个训练示例 并且该迭代的损失为 100 这是否意味着每个示例的平均
  • PyCaffe中的layer模块在哪里定义

    我正在修改一个Caffe教程 http nbviewer jupyter org github BVLC caffe blob master examples pascal multilabel with datalayer ipynb实现
  • 在 Caffe 中使用可学习参数编写自定义 Python 层

    我知道这个例子 https github com BVLC caffe blob master python caffe test test python layer py L31应该说明如何在Python层 https stackover
  • Caffe 运行测试失败

    成功构建 caffe 后 我进行了 runtest 但在 ImageDataLayer DBTest DataTransformTest HDF5OutputLayerTest 和一些求解器中失败 构建 链接到特定路径时是否缺少步骤 这是测
  • 如何在prototxt文件中写注释?

    我找不到如何写评论prototxt files 有没有办法在 prototxt 文件中添加注释 如何 Thanks 您可以通过添加评论 char 之后的行中的所有内容都是注释 layer name aLayerWithComments I
  • 在 Yosemite 上编译 caffe

    我正在尝试在 Yosemite 上安装 caffe 但我的 C 不是最强的 这是我的错误 Alis MacBook Pro caffe ali make all NVCC src caffe layers absval layer cu u
  • 如何在 CAFFE 的新网络中重复使用同一网络两次

    我有一个预训练的网络 我们称之为N 我想在新网络中使用两次 有人知道如何复制吗 然后我想为每个副本分配不同的学习率 例如 N1是第一个副本N N2是第二个副本N 新网络可能如下所示 N1 gt joint ip N2 gt layer 我知
  • 查找带有 Anaconda cmake 前缀的 boost-python3

    DLDR如何将 cmake 指向 boost python3 库 cmake 不会自动检测到它 我正在尝试建立caffe https github com BVLC caffe对于 Python 3 6 使用提供的 cmake 我的系统规格
  • Caffe,在层中设置自定义权重

    I have a network In one place I want to use concat As on this picture 不幸的是 该网络无法训练 为了理解为什么我想连续改变权重 这意味着 FC4096 中的所有值一开始都

随机推荐

  • yolov5,yolov4,yolov3乱七八糟的

    结构对比 别问这么好看的图哪来的 问就是善假于人 toulai 的 下面简单讲讲图中我认为比较明显的变化 yolov4 backbone 全部用的都是Mish激活函数取代了yolov3的Leakyrelu 在backbone就开始使用con
  • 【PCL】的五大依赖库及作用

    安装点云PCL Point Cloud Library 库时 需要额外安装5个依赖库 它们有什么作用呢 如下 Boost 用于共享指针和多线程 Eigen 一个标准的C 模板库用于线性代数 矩阵 向量等计算 FLANN Fast Appro
  • SpringBoot集成Spring Security

    1 Spring Security介绍 Spring security 是一个强大的和高度可定制的身份验证和访问控制框架 它是确保基于Spring的应用程序的标准 来自官方参考手册 Spring security 和 shiro 一样 具有
  • 模型训练到一个新batch时会被killed【原因以及解决方法】

    模型训练到一个新batch时会被killed 原因以及解决方法 1 减小batchsize 2 减小num workers 在Dataloader函数中
  • 【区块链】周鸿祎:写区块链最好的一篇文章;曾鸣:大部分关于区块链未来伟大前景的讨论还只是猜想而已

    区块链就是未来 也是一种回到互联网本来意义的方式 文 机器之能 注 奇虎360创始人周鸿祎说 这是了解区块链最深入浅出的一篇文章 以下正文 这组词序并没有任何意义 真正让它们有价值的地方在于 这个词序是由一个被称为 MetaMask 的软件
  • 类对象的私有数据是无法被直接访问的,但是为什么在复制构造函数中,可以直接通过引用访问被复制对象的私有数据?

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • csdn获取自己所有博客的地址,包含分页

    获取自己的所有博客地址 一 步骤 1 先获取首页看到的部分 2 正则截取每月发表的博客数 总和即是所有的博客数 3 分页请求获取每一页的博客 4 正则截取获得每篇博客的地址 二 代码 import re import math import
  • 感应(异步)电机无速度传感器技术—TI例程解析

    电机控制系列文章 感应 异步 电机磁场定向控制MATLAB Simulink建模 感应 异步 电机磁场定向控制电流环PI控制参数设计 感应 异步 电机磁场定向控制速度环PI控制参数设计 感应 异步 电机无速度传感器技术 电压模型法 目录 电
  • Python实现简单猜数字游戏,输入不是整数时,给出提示

    猜数字游戏 要求 1 使用random 函数产生一个预设整数 让用户通过键盘输入所猜的数 如果小于预设的数 显示 遗憾 太小了 如果大于预设的数 显示 遗憾 太大了 如此循环 至猜中 提示 恭喜 预测N次 你猜中了 2 当用户输入的不是整数
  • thinkPHP_V5漏洞

    php rce攻防世界 百度thinkphpv5 查询到其存在过漏洞 在网页中随便注入 可观察到其版本为V5 0 20 再上旬该版本漏洞 描述为 只要在url后添加 s index think app invokefunction func
  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 作者主页 https www weiyigeek top 博客 https b
  • (董付国)Python 学习笔记---Python序列(4)

    字典应用案例 已有大量用户对若干电影的打分数据 现有某用户 也看过一些电影并进行过评分 要求根据已有打分数据为该用户进行推荐 1 代码采用基于用户的过滤协同算法 也就是根据用户喜好来确定与当前用户最相似的用户 然后再根据最相似用户的喜好为当
  • 数据分析02——numpy模块的在jupyter中的使用

    0 numpy 在计算机中会把数学当中的矩阵叫做数组 在很多应用中的表格也就是通过矩阵表示的 所以numpy广泛用于机器学习 数据分析 和图像处理领域 1 numpy常用方法和函数 前言 在使用numpy创建数组之前必须先导入模块 impo
  • php升级

    1 要使用lumen的单元测试 https lumen laravel com docs 5 2 testing 使用单元测试 cd 项目目录 phpunit tests 里面需要使用phpunit https phpunit de man
  • freeRTOS---空闲任务与阻塞延时(1)

    在上传这篇文章的时候 同时也上传了代码 欢迎下载 RTOS中的延时是在需要延时的时间内任务放弃CPU的使用权 超过延时时间后重新获得CPU的使用权 叫做 阻塞延时 空闲任务是在启动调度器后创建的 是CPU空闲时候运行的 是优先级最低的 空闲
  • Linux实时调度策略(SCHED_RR)和CFS(SCHED_OTHER)之间的区别

    本文试图从直观角度 说明SCHED RR调度策略和SCHED OTHER调度策略之间的区别 在Linux上 SCHED OTHER和SCHED NORMAL的意思相同 它们都是指的CFS调度策略 只不过 在内核中 CFS定义为SCHED N
  • java中的next()方法,nextline()方法,hasnext()方法的用法系列(1)。

    这是王秀秀的第23篇博客 看下方目录 next 方法 nextline 方法 hasnext 方法 最近本菜鸡做题呀 遇到了一些很好玩的事情 那就是scanner类中的一些方法 经过了解后 真挺好玩的 next 方法 话不多说上代码 imp
  • Java中的strip(), split() 分割字符串

    jdk11引进了strip 用来去除字符串的前导和后缀空格 eg str hello world str str strip str hello world split 加上正则化用来分割字符串 1 正则表达式 s 表示匹配任何空白字符 表
  • javaSE从入门到精通的二十万字总结(二)

    目录 前言 5 集合 5 1 集合两大类 5 2 Collection 5 2 1 常用方法 5 2 2 迭代器 5 2 3 contains方法 5 2 4 remove方法 5 3 List 5 3 1 ArrayList 5 3 2
  • nnpack详解

    NNPACK详解 一 NNPACK简介 NNPACK由facebook开发 是一个加速神经网络计算的加速包 NNPACK可以在多核CPU平台上提高卷积层计算性能 NNPACK采用的快速卷积算法是基于Fourier transform 和 W