自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

SunnyZhou-1024的博客

欲知其所以然

  • 博客(64)
  • 资源 (2)
  • 收藏
  • 关注

原创 看PyTorch源代码的心路历程

1. 起因曾经碰到过别人的模型prelu在内部的推理引擎算出的结果与其在原始框架PyTorch中不一致的情况,虽然理论上大家实现的都是一个算法,但是从参数上看,因为经过了模型转换,中间做了一些调整。为了确定究竟是初始参数传递就出了问题还是在后续传递过程中继续做了更改、亦或者是最终算法实现方面有着细微差别导致最终输出不同,就想着去看一看PyTorch一路下来是怎么做的。但是代码跟着跟着就跟丢了,才会发现,PyTorch真的是一个很复杂的项目,但就像舌尖里面说的,环境越是恶劣,回报越是丰厚。为了以后再想跟踪

2021-01-22 17:45:13 1454

原创 CMake笔记:add_custom_command不执行

0x00. 前言在网上看别人做一些手工教程视频,经常能看到这样的评论:脑子:我感觉我会了。手:你行你来。之前一直通过编译脚本去寻找代码入口,感觉我已经懂得CMake的语法了,直到今天寄己要写一个脚本去编译一个工程才发现,事情并不简单:脚本并没有按照我期望的去执行。此工程需要用到Protocol Buffer,因此当代码构建的时候需要使用使用Protocol Buffer编译器去编译.proto文件获得对应的生成文件。理论上,想要达到这个目的,我们只需要在CMakeLists.txt中使用add

2021-01-22 17:32:40 3324 1

原创 Chrom插件开发:入门教程

插件由不相同但是内聚的组件组成,这些组件可以包括多个 后台脚本、多个内容脚本、一个设置页面、多个图形用户界面元素以及其他多种逻辑文件组成。插件组件通过HTML、CSS以及JavaScript这些Web开发技术构建,组件依赖于这些Web开发技术所提供的功能,但却又不必包含其全部功能。本教程会教你创建一个可以任意改变developer.chrome.com网站页面背景颜色的插件,在此插件中会用到许多关键组件,用于讲解每个组件以及展示各个组件之间的关系。就让我们从创建一个保存此插件文件的目录开始此教程。你也可

2020-12-14 16:41:57 565

原创 TensorFlow Lite源码解析之三(委托)

1. 前言所谓劳心者治人,劳力者治于人(所以“劳力士”又叫“打工人”?)。小农经济下自己什么都干,虽然饿不死,但是生产效率也肯定非常低下;只有让专业的人做专业的事,才能最大限度发挥每个人的价值。同理,对于一个推理引擎而言,完成一次计算,可以有多种选择,从头到尾都让CPU做运算理论上也不是什么问题。但是除了结果正确之外,还有另外一项关键指标:时间!密集计算确实非CPU所长,因此他该做的是协调资源,脏活累活让GPU、DSP这些替他干。一个精诚合作的团队力量是非常强大的。那么,TensorFlow Lite是怎

2020-12-12 13:00:19 2004 4

原创 Chrom插件开发:什么是插件?

插件是一个可以自定义浏览体验的小应用程序。它们可以让用户根据自身需求或者喜好修改Chrome浏览器的功能以及行为。插件以HTML、JavaScript以及CSS等网络技术为基础。插件需满足目的单一的要求,也就是一个插件只解决一个问题,并且应该易于理解。一个插件可以包含多个组件以及多个功能,但这些组件和功能应该服务于同一个目的。用户界面应该尽可能小并且意图明显。它们可以小到仅仅是一个图标,例如下图所示的查收Google Mail的插件;也可以大到重写了整个页面。用户下载安装的插件所包含的文件都被打包在

2020-12-11 00:05:11 547

原创 TensorFlow Lite源码解析之二(内存管理)

相关阅读TensorFlow Lite源码解析之一1. 前言爱迪生说过,人工智能就是是百分之九十九的数据加上百分之一的算法。毕竟目前人工智能还没有达到T800这种以毁灭人类为己任的终结者级别,归根到底还是一个程序。这么一想,是不是觉得市面上说的AI要统治人类了根本就是危言耸听,对于弱人工智能,我治不住你,难道我的360强力卸载还治不住你?言归正传。很显然,想要了解一个程序,理解它是怎么管理用于存储数据的内存是一个绕不开的话题。想要了解TensorFlow Lite是如何工作的,我们首先要弄清楚它.

2020-12-03 14:14:27 1331 3

原创 TensorFlow Lite源码解析之一

每一个成功的人工智能背后,都有一个摸摸推理的引擎。想知道TFLite是怎么工作的么,戳我了解更多!

2020-11-30 11:20:32 1625

原创 为Chrome插件Google Dictionary进行的一次小手术

一步一步教你如何修改Chrome插件

2020-11-10 23:32:05 633

原创 如何使用Python开发自己的编译器

1. 前言总所周知,编译器是一个将一种语言(源语言)翻译成另一种语言(目标语言)的程序,如果我们只想使用它,我们只需要将它看作一个黑盒子即可不必关心它的实现,如图1所示。但是如果你想发明一种新的语言,你就需要了解它的内部构造了,因为要发明一门新语言,其实你需要做的就是编写一个新的编译器。实际上,编译器将源程序翻译成目标程序的过程可以分为词法分析、语法分析、语义分析以及目标代码生成等多个阶段,如图2所示。通常,我们称词法分析、语法分析、语义分析以及中间代码生成这几个阶段为前端,而代码优化以及目标代码生成

2020-10-15 16:26:37 4501 2

原创 Linux虚拟内存技术初窥

1. 为什么要用虚拟内存总所周知,从做系统的主要作用是对计算机资源的管理以及程序调度,者其中就包括对内存的管理。现在很多的系统都是用虚拟内存技术来对内存的管理,所谓虚拟内存,就是一种让应用程序觉得它拥有一个很大的内存可以使用,例如对于一个64位的操作系统,操作系统会给应用程序制造一种它可以有2^64Bytes那么大的内存可以使用的假象,虽然实际情况可能是这个电脑上只有4G的内存。对于一个多任务操作系统,如果不适用虚拟内存,计算机所拥有的那点内存显然不够分,虽然我们可以选择增加物理内存的方式让程序拥有更多

2020-09-24 17:31:05 243

原创 FlatBuffers:flatc源码简析

在简单的编译器他也是编译器

2020-09-04 17:21:17 1671

原创 使用Node.js+React+EUI快速搭建网页应用

别再犹豫了,看一篇文章学三个框架它不香么?

2020-08-24 18:51:09 1398

原创 RPMsg:协议简介

两台计算机可以通过TCP/IP进行通信,那么同一颗芯片上的两个核心怎么通信呢?

2020-07-19 22:42:33 8106 1

原创 布隆过滤器简介

其实就像老师上课点名,没回答的肯定逃课了;回答的有可能也逃课了。。。。。。

2020-07-16 21:40:11 268

原创 从《七里香》到GCC as汇编语言

行走江湖,不会点汇编怎么行?

2020-05-31 14:59:08 731

原创 Kibana插件开发之环境搭建

教你怎么一步步搭建Kibana插件开发环境

2020-05-09 13:11:38 1017 2

原创 RPC原理与FastRPC实现

你到一家餐厅吃饭,店里有一个服务员为你服务。你点完菜之后,服务员就走进了后厨。但是,服务员并不是直接将你点的菜告诉他们店里的厨师,相反的,他打电话到别的店点了外卖,外卖到了之后他将饭菜重新装盘,然后给你端了上来。但是你是不知道这个细节的,在你看来,这次吃饭和以往的任何一次没有区别,服务员端上的饭菜在哪里做的你是不知道的,你和平常一样点了菜然后菜就上了,你并不需要自己去关心怎么找到外卖电话,怎么将饭菜装盘。你只管点菜和吃,除了可能等的时间比以往略久,没有任何区别。这个栗子中,服务员就扮演着RPC 中代理的角色

2020-05-01 14:37:43 5054 1

原创 一只Python小爬虫的Linux定时任务之旅

戳进来,告诉你怎么在Linux上设置定时任务。

2020-04-26 20:50:51 623

原创 Docker,系统影分身之术

容器化其实就是一种虚拟化技术,与传统虚拟机相比,它有着轻量、独立、可伸缩、可移植以及灵活等特点。容器直接运行于内核之上,多个容器共用系统的内核,直接通过内核获取系统资源,用多少取多少;而虚拟机则通过一个管理程序来获取宿主系统的资源,运行在其上的程序有着自己的内核,就算你跑的是个`Hello World`,它也占用这很大一块资源。拿吃饭打个比方,容器是按点的菜收钱:你点多少菜付多少钱;虚拟机是按人头收钱,只要你人在那,就算你只喝了一口水也照样收你这么多钱。

2020-04-24 20:38:26 356

原创 使用Github+Markdown搭键自己的笔记本

Github优点显而易见,因为本身已经熟悉了Git的常规操作,上传下载轻而易举。并且由于它核心是Git,可以轻松实现备份,最多写个脚本就好了,毕竟是自己的专业。Github一份、Gitee一份、本地还可以有一份,万一哪天Github真把中国区锁了(毕竟这个魔幻的年份),Gitee还有。如果三份一起丢失,那就是命吧。另外由于它基于Git,文档一路的变迁都有迹可寻,只要修改提交了,就不用担心后续手贱删除了什么东西。是要`.git`这个地基还在,我们就能重建家园。

2020-04-19 16:39:00 13358 8

原创 PyTorch框架Tensor底层原理

PyTorch中数据全部保存在一个由`Storage`对象维护的一位数组中(更确切的说是一块连续的内存区域),而`Tensor`只不过是对这个一维数组的一个视角。`Tensor`通过`Size, storage offset, strides`这三个属性的值的不同组合,可以让同一个`Storage`一维数组看起来像多个不同的多维数组。

2020-04-17 20:15:02 3481

原创 Composition, Aggregation and Association

平常不管是写代码或者是读代码,为了清晰的表示类与类之间的关系,我们需要画UML图。而想要清晰明了的表达类之间的关系,首先要直到它们之间都存在一些什么关系。简单的说,类与类之间通常有以下这几种关系:1. 继承(Inheritance);2. 实现(Implementation);3. 泛化(Generalization);4. 联合(Association);5. 聚合(Aggregation);6. 组合(Composition)。

2020-04-05 23:18:43 200

原创 LLVM,一堆积木的故事

如果我说,C可以像Java一样被虚拟机解释执行,也可以对热点代码使用Just-In-Time(JIT)技术编译,也可以实现“一次编译,到处运行”,你信吗?

2020-04-04 20:09:24 924

原创 冰山之下:使用new申请内存的背后

Linux是个多任务操作系统,同一时段内有多个进程在运行着,它们各自拥有很多的资源,其中比较重要的资源之一就是它们拥有的内存。但毕竟内存资源是有限的,不管你4G、8G或者是64G内存,总归是有个尽头。一个进程可能就耗费几百上千兆内存,操作系统怎么让有限的内存运行更多的进程?解决办法是虚拟内存技术。

2020-03-29 16:55:25 1635 1

原创 ONNX Runtime 源码阅读:引擎运行过程总览

之前的文章中,我们一直从源码细节的角度去看某个功能的实现。总会有一种一叶障目不见泰山的感觉,对ONNX Runtime缺乏一个比较总体的认识。通过前面的几篇文章,在看细节源码的过程中,脑海渐渐浮现出了ONNX Runtime总体的轮廓,但是并不是很清晰。今天打算暂时跳出细节,站在高处,看看ONNX Runtime它的筋骨、它的脉络,也更能方便以后进行局部分析。

2020-03-28 11:28:48 2935 1

原创 内存对齐是什么?为什么要对齐?怎么对齐?

所谓内存对齐,就是将数据存放到一个是字的整数倍的地址指向的内存之中。处理器在执行指令去操作内存中的数据,这些数据通过地址来获取。不论什么数据都有一定的大小,当一个数据所在的地址和它的大小对齐的时候,就说这个数据自然对齐了(naturally aligned),否则就是没对齐。

2020-03-18 21:33:06 1370 2

原创 一文教你如何用Python读取图片GPS定位

JPEG(Joint Photographic Experts Group,联合图像专家组)标准定义了一套对静态图片进行压缩的算法,用于对图像或者视频进行压缩。JPEG标准定义了四种操作,分别是顺序DCT(sequential Discrete Cosine Transform) 模式、渐进DCT(progressive DCT)模式、无损(Lossless)模式和分层(hierarchical)模式。根据不同模式会对原是图像进行多次扫描,每扫描一次就得到一帧。

2020-03-15 22:35:36 4316

原创 ONNX Runtime 源码阅读:模型分区的实现

为了实现高效的推理,神经网络推理引擎应该尽可能将主机(Host)上能提供更高效计算的硬件设备(Device)利用上,ONNX Runtime当然不能例外。ONNX Runtime目前已经支持了多种不同设备,移动端的支持也在开发中。一台主机上很可能同时存在多种设备,ONNX Runtime是如何选择在那种设备上运行的呢(也就是怎么分区)?对于某些运行时不支持的操作怎么处理(回落)?不同硬件的运行时优先级怎么确定呢?这些就是本文探究的主要内容。

2020-03-13 21:34:06 2780 2

原创 Ubuntu 登录界面无限循环无法登陆解决方案

背景复工第一天,再次登录公司电脑的时候,Ubuntu每次验证完密码都会再次跳转登录界面,重启电脑什么的都不好使。解决方案Ubuntu UI界面进不去,只能先用TTY1进去,发现各项功能都还好使,因此怀疑就是Ubuntu的图形界面有问题。回想起年前最后一次有关图形界面的安装操作是安装了一个NVIDIA的驱动程序。所以打算试一下把NVIDIA的包全部移除。命令使用:sudo apt-get p...

2020-03-09 11:03:02 1787

原创 冰山之下:从extern C到程序链接

extern "C" 是什么?起什么作用? 它背后它和C++的改名机制有什么关系?它和ELF又有什么鲜为人知的秘密?如果你也有着同样的好奇,戳我,我将带你走进科学。不仅能学习C++,还能顺路了解ELF格式、链接器的工作原理。

2020-03-07 12:51:54 277

原创 交叉编译和ABI简介

本文介绍交叉编译和与之相关的Application Binary Interface的相关知识。

2020-03-05 16:04:27 1790

原创 就TM你叫std::forward啊?

之前介绍过std::move,今天我们就接着来说说std::forward。C++11引入了一个新特性:右值引用,这个特性可以避免不必要的拷贝从而提高性能。std::forward我们先看看std::forward是干什么的,然后说说为什么需要它。根据前文,资源高效转移的问题不是已经有std::move来解决了么,为什么还需要另外一个std::forward来参和?注意“不必要”这个词,既然...

2020-03-04 18:12:09 205

原创 cmake 脚本编程简介

本文通过介绍cmake的语法入手,一步一步的讲解cmake中关键命令的作用,不仅可以帮你看懂和修改开源代码中的cmake文件,还能让你学会编写构建自己工程的cmake脚本文件。

2020-03-03 15:34:04 562

原创 就TM你叫std::move啊?

`std::move`的作用就是将左值转换为右值,使得可以和右值引用绑定。而引入右值引用的目的就是解决资源高效转移,免去不必要的拷贝操作。同时,还明确资源的所有权问题。方法就是移动构造函数或者移动赋值函数来实现。想了解详情,进来玩啊。

2020-02-28 22:54:13 176

原创 ONNX一个沟通各大AI框架的桥梁

概述ONNX全称Open Neural Network Exchange,是微软设计的一个开放式深度学习神经网络模型的格式。旨在通过一个统一的模型格式标准,建立一个强大的人工智能生态。深度神经网络的实现是通过数据流图实现的,数据(张量等)从输入,流过一个个集选节点,最终在输出结点得到推理结果。不同的框架实现数据流图的的方式不尽相同,有的使用静态图,有的在运行的过程中动态创建。但是不管哪种方式,...

2020-02-27 22:03:30 1430

原创 Python调用C++之PYBIND11源码分析

知其然更知其所以然。看了本文你不经能学会怎么使用pybind11去为Python编写C++扩展模块,还能知道接口背后的秘密。

2020-02-26 14:12:08 2141

原创 Python调用C++之PYBIND11简介

使用传统的方法去编写Python C++扩展模块日子一去不复返啦。看了这篇文章你就懂得如何更快更好的去编写Python C++扩展模块。

2020-02-25 18:40:41 3761

原创 U盘制作Ubuntu启动盘后无法格式化解决办法

U盘制作Ubuntu启动盘后无法格式化 This partition cannot be modified because it contains a partition table; >please reinitialize layout of the whole device. (udisks-error-quark, 11)

2020-02-24 18:09:38 4567

原创 GCC 命令简明教程

前言GCC,全称The GNU Compiler Collection,包含了 C, C++, Objective-C, Fortran, Ada, Go等语言的编译器前端以及这些语言所依赖的一些库文件。虽然现在的IDE基本可以搞定很多编译的事情,但是很多时候,b比如我们看源码的时候、自己编写一些Python C++扩展模块的时候等,使用IDE可能会比较繁琐,这时候就需要手动编译,需要看懂或者会...

2020-02-18 13:40:40 752

原创 ONNX Runtime 源码阅读:模型结点串行执行顺序的确定

概要ONNX模型中的结构是一个有向图,包含了很多节点。每个节点执行一个特定的操作,最终就得到了推理结果。ONNX模型格式标准并没有要求所有节点按照拓扑顺序来存储,进行模型解析的时候也基本不要求解析出来的节点一定要符合拓扑顺序排列。有些模型很简单,从输入到输出,可能只有一条通路;有些模型很复杂,不仅输入和输出节点间存在多条通路,还有可能存在多个输入和输出节点。ONNX Runtime 是如何确定模...

2020-01-17 17:22:27 3055 2

28BYJ48电机详细使用说明.pdf

28BYJ48电机详细使用说明。简介步进电机原理,以及其应用,并附有源码

2014-07-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除