深度学习(六十一)NNPACK 移植与实验
一、Ubuntu下使用:
1、克隆下载NNPACK
git clone https://github.com/Maratyszcza/NNPACK.git
2、安装nijia,并编译
Install ninja build system
sudo apt-get install ninja-build || brew install ninja
Install PeachPy assembler and confu configuration system
[sudo] pip install --upgrade git+https://github.com/Maratyszcza/PeachPy [sudo] pip install --upgrade git+https://github.com/Maratyszcza/confu
Then clone NNPACK, install dependencies, configure, and build
cd NNPACK confu setup python ./configure.py ninja
3、链接的时候还需要用到pthread库,否在会遇到找不到实现函数。
target_link_libraries(NNPACK libnnpack.a libpthreadpool.a pthread)
需要加入pthread库,否这会报错。
4、测试代码
#include <iostream>
#include "nnpack.h"
#include <ctime>
#include <vector>using namespace std;
float test_nnpack(){//init nnpackenum nnp_status init_status = nnp_initialize();if (init_status != nnp_status_success) {return 0;}enum nnp_convolution_algorithm algorithm = nnp_convolution_algorithm_auto;enum nnp_convolution_transform_strategy strategy=nnp_convolution_transform_strategy_tuple_based;const size_t batch_size = 1;const size_t input_channels = 128;const size_t output_channels = 128;const struct nnp_padding input_padding = { 1, 1, 1, 1 };const struct nnp_size input_size ={ 256, 256};const struct nnp_size kernel_size = { 5, 5 };const struct nnp_size stride={.width=2,.height=2};const struct nnp_size output_size = {.width = (input_padding.left + input_size.width + input_padding.right - kernel_size.width)/stride.width + 1,.height =(input_padding.top + input_size.height + input_padding.bottom - kernel_size.height)/stride.height + 1};//malloc memory for input, kernel, output, biasfloat* 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= nullptr;struct nnp_profile computation_profile;//use for compute time;//init input dataint 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)*0.1;}}}//init kernel datafor(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] = 0.1;}}//init bias datafor(int i=0; i<output_channels;i++ ){bias[i] = 1.0;}//execute convfor(int i=0;i<10;i++){nnp_convolution_inference(algorithm,strategy,input_channels,output_channels,input_size,input_padding,kernel_size,stride,input,kernel,bias,output,threadpool,nullptr);}std::vector<float>out;for(int i=0;i<output_channels*output_size.height*output_size.width;i++){out.push_back(output[i]);}return conv_time_use;
}
int main() {cout << test_nnpack()<< endl;return 0;
}
在mxnet、tiny-dnn中的引用方法:
https://www.insight.io/github.com/dmlc/mxnet/blob/master/src/operator/nnpack/nnpack_convolution-inl.h
https://github.com/tiny-dnn/tiny-dnn/blob/master/tiny_dnn/core/kernels/conv2d_op_nnpack.h
在tiny-dnn中,底层调用nnpack为啥只采用了一个线程,于是我测试了多线程的速度,经过测试发现nnpack的弱点,原来在于多线程:
二、android使用
1、添加ndk-build环境变量路径:
export NDK_ROOT=/home/hjimce/Android/Sdk/ndk-bundle/
cd到nnpack所在的目录,更改jni APP_PLATFORM := android-21
2、直接运行:
${NDK_ROOT}/ndk-build
3、代码中引用cmake要指定相关的库文件:
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
ndk {// Specifies the ABI configurations of your native// libraries Gradle should build and package with your APK.abiFilters 'x86','armeabi-v7a'
}
手机速度测试:
修改:多线程时间测试不能使用time.clock(),可使用auto begin =std::chrono::high_resolution_clock::now();
深度学习(六十一)NNPACK 移植与实验相关推荐
- 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层
目录 0. 前言 1. 最大池化(max pooling) 2. 平移不变形 3. 其他池化函数 4. 卷积和池化作为一种无限强的先验 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常 ...
- 深度学习 第3章线性分类 实验四 pytorch实现 Logistic回归 上篇
目录: 第3章 线性分类 3.1 基于Logistic回归的二分类任务 3.1.1 数据集构建 3.1.2 模型构建 1. Logistic函数 2. Logistic回归算子 3.1.3 损失函数 ...
- 深度学习 第3章线性分类 实验四 pytorch实现 Softmax回归 鸢尾花分类任务 下篇
目录: 第3章 线性分类 3.3 实践:基于Softmax回归完成鸢尾花分类任务 3.3.1 数据处理 3.3.1.1 数据集介绍 3.3.1.2 数据清洗 1. 缺失值分析 2. 异常值处理 3.3 ...
- 【深度学习】猫狗识别TensorFlow2实验报告
实验二:猫狗识别 一.实验目的 利用深度学习实现猫狗动物识别,采用Kaggle提供的公开数据集,训练深度学习模型,对测试集猫狗中的图片准确分类.通过该实验掌握深度学习中基本的CV处理过程. 二.实验原 ...
- 基于深度学习的春联自动生成系统 实验记录
基于深度学习的春联自动生成系统主要分成两个方面: 1.数据集构造 2.模型搭建 本文将主要从这两个方面展开,之后将介绍实验结果和结果分析. 目录 一.[数据集构造] 1.分词方面 2.编码方面 3.数 ...
- 全栈深度学习第3期: 怎样科学管理实验数据?
一起追剧鸭 简介 Berkeley全栈深度学习追剧计划是由夕小瑶的卖萌屋发起的优质公开课打卡项目,通过微信群为同期追剧的小伙伴提供交流平台.关于该计划的详请见这里. 1. Berkeley深度学习追剧 ...
- 基于深度学习的环路滤波的消融实验
本文来自提案JVET-Z0106,在上一篇文章<基于深度学习的环路滤波和残差缩放>中介绍了JVET-Y0143提案使用深度学习模型来做环路滤波带来了性能提升,但是整个模型还是一个" ...
- 深度学习(十一)RNN入门学习
RNN入门学习 原文地址:http://blog.csdn.net/hjimce/article/details/49095371 作者:hjimce 一.相关理论 RNN(Recurrent Neu ...
- 推荐系统遇上深度学习(六)--PNN模型理论和实践
全文共2621字,21张图,预计阅读时间15分钟. 原理 PNN,全称为Product-based Neural Network,认为在embedding输入到MLP之后学习的交叉特征表达并不充分,提 ...
最新文章
- 台式计算机如何自动关机,台式机如何设置自动关机
- leaq c 汇编语言,汇编语言lea指令使用方法解析
- ifconfig没有命令 kali_kali学习笔记之——端口扫描工具
- .NET开发人员必知的八个网站
- 算法与数据结构(快速排序)
- office2016中插入公式心得
- 微信小程序js数组初始化_微信小程序学习Course 3-2 JS数组对象学习
- mysql query cache 查询缓存
- Codeforces 708D 上下界费用流
- vpx计算机论文,vpx总线
- 基于NSIS的Qt项目打包
- 什么是数据结构?是举一个例子,叙述逻辑结构、存储结构和运算三个方面的内容。
- SQL语句--简单的函数书写举例(1)
- 2022年最细Java 17新特性,是真的猛,被征服了!
- MySQL 自增序号
- win11 ms-settings;display(该文件没有与之关联的应用来执行该操
- Google 重申对 Kotlin 编程语言 Android 的承诺:谷歌推出 Kotlin 免费在线课程 Kotlin Bootcamp Course 1
- 借助工具规划并定义Skype For Business的网络需求
- Android逆向实例笔记—手游中的内购破解(火柴人联盟最新版1.9.2 BB弹 )
- 【docker】新镜像推送到私服库配置
热门文章
- mysql 时间段在不在另外的时间段中_你知道自来水一天中哪个时间段最脏、最具毒性吗?记住这几点避开致命自来水...
- 计算机的未来科技作文700字,未来的科技与绿*的作文700字
- OpenSSH 命令注入漏洞(CVE-2020-15778)
- uri=/struts-tags 出错
- html div 水平垂直居中显示,利用CSS实现div水平垂直居中
- tshark mysql_使用tshark抓包分析http请求
- Django---模版层
- ubuntu18.04 出现 Command 'ifconfig' not found 问题的解决办法
- MyEclipse非正常关闭问题
- 分享一些自己的学习过程和学习方法