最近的一篇工作里面需要频繁的从网络forward path中提取中间结果,因为ncnn比较好魔改,所以就选了ncnn来做工作本身的实现。同时也非常感谢nihui同学,中间获得了nihui同学大量的帮助。这里稍微整理一下,如何正确在ncnn中取出结果。

(如果不知道什么是ncnn的话,点击下面卡片,是一个超好用的端侧inference框架!)

Github - Tencent/ncnn​github.com


基本概念

这里需要理解ncnn的几个重要的concept,方便后面解释。

  1. Layer

ncnn的layer对应着实际的计算node,比如说conv或者add。

需要注意的是,在转换pytorch或者tf的模型到ncnn中时,除了对于基本graph的翻译之外,ncnn还会插入额外的node,最常见也是最重要的就是split。split node本身的意义是将输入的blob(也就是tensor)浅拷贝一份。ncnn不像tf或者torch,和tflite的结构类似,blob是producer和consumer是严格一一对应的,单一producer只支持单一consumer,不允许一个producer对应多个consumer。

2. Blob

这个概念在pytorch和tf中并不存在,所以可能广大pythoner比较难以理解。blob的本质是构建一个producer-consumer对,其内容是tensor。在param中的表达是一个blob name,(也就是我们在input和extract中填写的那个)。一个producer 只能对应一个consumer,如果要一对多,需要借助split layer来实行producer的拷贝。

3. Extractor

ncnn是将网络的结构用blob链接构成一个DAG(有向无环图),给定input以及extract之后,从extract向上查找,找到通往input的路径,让后再顺序路径forward下来。所以流程中对于output不必需要的node不会被计算,同时,如果extract一次之后,再重新extract,重复计算过的node也不会被计算。

那么,有些同学可能要问了,如果ncnn每一层都缓存,会不会占用内存特别大呢?实际上ncnn并不是每一层都会缓存,只有分叉的split,那么ncnn会在分叉的位置缓存blob。


CPU Runtime中的Extractor

在CPU上比较简单,只需要简单的构建一个生成器,给定输入数据,再extract就行了。

ncnn

这里的out_mat是网络结构中的浅拷贝,并不需要实际搬运数据。如果存在packing或者使用了低精度的计算,比如说fp16/bf16,那么extractor默认也会还原成无packing的fp32状态。

如果需要在网络中抽取多次,同时这些还原的操作不是必要的,比如说我还需要把得到的结果feed进其他layer里处理,那么可以直接extract不经过还原的mat。

ncnn

给定extract的flag为1,那么就会输出不经过还原的mat了,实测还是可以节省几个ms的。(mobilenetv2,抽10层的中间结果,高通骁龙855)

GPU Runtime中的Extractor

在GPU上,如果你不在意gpu到cpu上的缓存拷贝,那么可以完全参考cpu上的实现,那么这里主要介绍一下,如果我需要实现zero copy的提取gpu上的Vulkan Mat(VkMat)应该怎么做。

ncnn

需要先新建一个vkCmd,这样可以保证操作的都是同一个设备,之后使用extractor的重载,就可以直接得到GPU上的tensor了。

需要注意的是,虽然这样不存在拷贝时间了,但是Host和Device(GPU)的Sync依旧需要一定的时间(几百us到几个毫秒),频繁的extract还是会很耗时的。


大概就是这样)下次有空讲讲怎么样在程序中自己构建一个layer,并forward Mat或者vkMat。感谢nihui,小字母和大家的帮助qwq)

顺路带货)Keras用户也可以用ncnn啦!支持tf1或tf2导出的keras h5文件,如果遇到不能支持的layer,只要ncnn支持,开issue都会解决的qwq

https://github.com/MarsTechHAN/keras2ncnn​github.com

.net 怎么使用github_如何正确的使用ncnn的Extractor相关推荐

  1. jmeter结果树为空_Jmeter查看结果树之查看响应的13种方法[详解]

    查看结果树查看响应有哪几种方法,可通过左侧面板底部的下拉框选择 1.Text 查看结果树中请求的默认格式为text,会显示请求的取样器结果.请求.响应数据3个部分内容. 取样器结果: 默认Raw视图, ...

  2. 域适应(Domain Adaptation)综述

    根据李宏毅老师的视频所归纳的笔记 视频链接:https://www.bilibili.com/video/BV1TL411p7Us?spm_id_from=333.999.0.0 假设我们在训练集上训 ...

  3. Unix编程/应用问答中文版(转)

    Unix编程/应用问答中文版 名称 -- Unix编程/应用问答中文版 版本 -- 0.04 ( 2003-10-09 外发版 ) 维护 -- 小四 <scz@nsfocus.com> 主 ...

  4. GNU Make 使用手册(中译版)

    如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件.目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的M ...

  5. Linux下的pup软件,PUP 文件扩展名: 它是什么以及如何打开它?

    PUP 文件并发症 常见的 PUP 打开问题 PS3 PUP Extractor 已删除 你尝试加载 PUP 文件并收到错误,例如 "%%os%% 无法打开 PUP 文件扩展名". ...

  6. python正确方法,方法 - 廖雪峰的官方网站

    在一个对象中绑定函数,称为这个对象的方法. 在JavaScript中,对象的定义是这样的: var xiaoming = { name: '小明', birth: 1990 }; 但是,如果我们给xi ...

  7. short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确

    这个问题以前碰到过,也研究过,发表一下:     如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确.这两个表达式都被称为赋值表达式.第二个表达式使用的是简单赋值操 ...

  8. oracle为什么不用指定数据库,两个数据库怎么保持数据正确显示

    当前位置:我的异常网» Oracle管理 » 两个数据库怎么保持数据正确显示 两个数据库怎么保持数据正确显示 www.myexceptions.net  网友分享于:2015-08-26  浏览:23 ...

  9. python正确的变量名称_Python基础之变量的命名

    变量的命名 目标 标识符和关键字 变量的命名规则 0.1 标识符和关键字 1.1 标识符 标示符就是程序员定义的 变量名.函数名 名字 需要有 见名知义 的效果,见下图: 标示符可以由 字母.下划线 ...

最新文章

  1. mysql释放练级_面试官:谈谈Mysql事务隔离级别?
  2. 解决: Cannot find module ‘webpack-cli/bin/config-yargs‘、Error: Cannot find module ‘webpack-cli‘
  3. Java加密与解密的艺术~数字证书~证书管理
  4. C++语言基础 —— STL —— 容器与迭代器
  5. Git --- 傻瓜内容跟踪器
  6. 带你自学Python系列(十四):Python函数的用法(四)
  7. 7-125 切分表达式——写个tokenizer吧 (20 分)
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的民宿客栈系统
  9. 今天,你用智能音箱了吗?
  10. C#通过Kernel32.dll动态调用C++生成dll相关接口(结构体转换)相关问题整理
  11. VS 2017 + EF6 + MySQL5.7 建立实体模型闪退问题
  12. 深入理解二阶段提交协议(DDB对XA悬挂事务的处理分析)(一)
  13. 忙活了一天,PDF转epub基本成功
  14. 陶陶摘苹果编程(C语言)
  15. 使用oschina的git服务器
  16. 阿里云centOS 、linux 常用安全软件
  17. 实测:TB级倾斜摄影模型合并根节点前后加载效果对比,结果惊人
  18. wave.Error: unknown format: 3解决方法
  19. Arduino音乐代码《卡农》(简易版)
  20. 正确的Python学习路线图,来了!

热门文章

  1. 海上瓶子下有东西吗_小小的瓶盖竟有如此大的作用, 闻名不如眼见, 你知道吗?...
  2. mysql order by sql注入_mybatis中#{}和${}的区别及order by的sql注入问题
  3. html表格高度适应屏幕,Table的自适应高度
  4. 本科不是985\211都会被歧视?
  5. 入门C语言20问20答
  6. 如何测量程序运行时间?
  7. 计算机视觉算法实战书籍推荐_岗位内推 | 字节跳动招聘NLP、计算机视觉、推荐算法实习生...
  8. 使用verilog设计实现QR分解
  9. python秒转换成小时分钟秒_新闻联播66分钟,康辉口播22分38秒,零失误
  10. linux git指令不存在,一些常用的Git命令