thumbnail
大语言模型:LoRA 微调
本文继续上一篇文章(大语言模型入门:从训练到推理)介绍一下 LoRA 微调的实现过程与原理,大语言模型由于参数量巨大,如果使用传统的全参数微调,需要大量的 GPU 资源且耗费很长时间,LoRA 微调就是为了解决这类问题, 可以通过 LoRA 微调让一个大语言模型更好的回答特定领域(eg. 医疗)的相关问题,LoRA 是一种参数高效微调(Parameter-Efficient Fine-Tuning…
thumbnail
大语言模型:从训练到推理
随着大语言模型能力的越来越强,以及各种结合 LLM 的工具横空出世,在赞叹其惊人效果的同时也会去思考他是如何做到这一点的。在学习了相关的网络结构之后,比如 Transformer,MoE 等,还是难以理解他的工作过程;几年前通过 RNN 训练可以写藏头诗的模型,同样是处理序列数据,工作过程和 RNN 又有什么差异呢? 大模型动辄数百亿参数,个人设备很难复现训练过程,只有了解一个模型是如何训练的,训…
搭建 PyTorch GPU 环境:轻松开启深度学习之旅
你是否曾经因为配置深度学习环境而头疼不已?或者因为显卡驱动、CUDA版本不兼容而抓狂?别担心,这篇文章将带你从零开始,一步步搭建一个完整的PyTorch GPU环境,让你轻松驾驭深度学习的力量!无论你是刚入门的小白,还是想升级环境的老手,这篇指南都能帮你搞定。 为什么要用GPU?——从“龟速”到“光速” 在深度学习中,模型的训练往往需要大量的计算资源。CPU虽然能完成任务,但它的并行计算能力有限,…
thumbnail
理解循环网络及其在移动端的趣味应用:AI诗人
本文主要分析循环神经网络(RNN)的大致原理及其 TensorFlow 实现,文章后半部分详细介绍循环网络结合移动端的一次趣味实践:AI诗人(别忘记点个Star哦)。 之前介绍的神经网络包括卷积网络,HED 网络等网络结构都是从输入层到隐藏层再到输出层,每次输入对应输出,输入、输出之间是无关联的。这些网络都无法提取时间序列的相关特征和上小文语义的相关特征,循环神经网络便是为了解决这类问题而生的。 …
thumbnail
使用机器学习 HED 网络优化 SmartCropper 边缘检测
SmartCropper 是我写的一个开源库,主要用于卡片及文档的识别与裁剪 。最近主要对 SmartCropper 进行了两次较大升级,一是升级了 OpenCV 框架到官方最新版,解决了饱为诟病的打包问题(ISSUE), 通过升级 OpenCV 自然也支持了 64 位架构(ISSUE), Google 已经向开发者下发了最后通牒:Support 64-bit architectures。二是完成…
thumbnail
深入理解 VGG 卷积神经网络
VGG 网络是一种经典的图像分类网络,通过多层卷积操作提取图像特征实现图片分类。由于能够提取图像的特征,也应用于风格迁移网络中的损失函数。另外用于边缘检测的 HED(Holistically-Nested Edge Detection) 网络也是基于 VGG 网络发展而来。 VGG 名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)。 本文主要分析 VGG 网络的…
thumbnail
Android 端图像多风格迁移
图像风格迁移是利用机器学习算法实现的图像风格转换, 本篇文章会从风格迁移网络发展历史出发一步步了解风格迁移网络算法,然后带领大家搭建单模型多风格的训练网络,最终给出如何将训练出的模型移植到 Android 端运行的工程化实践。 何为图像风格迁移? 使用机器学习训练特定图片的风格,然后将对应的风格应用到任意图片。效果如下所示: 风格迁移在移动端的最佳实践:Prisma 风格迁移网络发展史 《A Ne…
深入理解 Java 锁与线程阻塞
相信大家对线程锁和线程阻塞都很了解,无非就是 synchronized, wait/notify 等, 但是你有仔细想过 Java 虚拟机是如何实现锁和阻塞的呢?它们之间又有哪些联系呢?如果感兴趣的话请接着往下看。 为保障多线程下处理共享数据的安全性,Java 语言给我们提供了线程锁,保证同一时刻只有一个线程能处理共享数据。当一个锁被某个线程持有的时候,另一个线程尝试去获取这个锁将产生线程阻塞,直…
thumbnail
Android 端相机视频流采集与实时边框识别
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本文是 SmartCamera 原理分析的文章,SmartCamera 是我开源的一个 Android 相机拓展模块,能够实时采集并且识别相机内物体边框是否吻合指定区域。 SmartCamera 是继 SmartCropper 之后开源的另外一个基于 OpenCV 实现的开源库,他们的不同点主要包括以下几个方面: SmartCr…
thumbnail
SmartCamera 相机实时扫描识别库
SmartCamera 是一个 Android 相机拓展库,提供了一个高度可定制的实时扫描模块能够实时采集并且识别相机内物体边框是否吻合指定区域。如果觉得还不错,欢迎 star,fork。 语言描述起来略显生涩,具体实现的功能如下图所示,适用于身份证,名片,文档等内容的扫描、自动拍摄并且裁剪: 在相机实现上,SmartCamera 以源码的方式引用了 Google 开源的 CameraView ,…
高性能日志框架 Log4a 原理分析
本文主要分析 Android 端基于 mmap 的高性能日志框架 Log4a 的实现原理。 项目地址:https://github.com/pqpo/Log4a(求star) 前言 对于移动开发者来说,针对一些用户反馈难以复现的线上问题,分析日志有时候是解决问题的必要手段。 但是日志的收集一直有个痛点,就是性能与日志完整性无法兼得。 要实现高性能的日志收集,势必要使用大量内存,先将日志写入内存中,…
thumbnail
Android 端基于 OpenCV 的边框识别功能
之前写了一个智能图片裁剪库:SmartCropper,选择照片之后会自动识别出边框的位置,适用于身份证,名片,文档等照片的裁剪。 你也可以关注我新开源的另外一个库 SmartCamera,也是基于 OpenCV 实现的, 能够实时采集并且识别相机内物体边框是否吻合指定区域, 由于是实时采集安卓相机视频流并且识别, 对于性能的要求会更高。 本篇文章主要就边框识别部分说一下开发过程及实现原理,通过阅读…
thumbnail
热修复之 Method Hook 原理分析
引言 目前国内大厂均开源了自己的 Android 热修复框架,阿里的《深入探索 Android 热修复技术原理》一书全面介绍了热修复技术的现状,原理与展望。一方面是阿里系为代表的底层方法替换,另一方面是以腾讯系为代表的类加载方案。前者支持立即生效,但是限制比较多;后者必须冷启动生效,相对较稳定,修复范围广。之前分析过微信的热修复框架 Tinker 即属于后者( 《Tinker 接入及源码分析》)。…
深入理解 Android 控件
概述 本篇文章主要通过源码讲述 Android 控件系统,包括输入事件是如何产生的, View 是如何绘制的,输入事件是如何传递给 View 的,Window token 与 type 之间的联系等。整个系统比较复杂,每个部分只能点到为止,有兴趣可以继续深入,主要是让读者对 Android 控件系统有一个大体的认识。 例子 下面是创建 Window 并显示 View 最简单的一个例子: publi…
C++11 学习笔记
上篇文章《理解JNI技术》介绍了Java与C/C++代码交互的一项技术。由于在项目中有用到C++代码,所以重拾吃灰半年多的《C++ Primer 第5版》。大学期间也学过Hello World版的C++,由于C++11版标准变化之大(据悉ART虚拟机的实现代码已经切换到了C++11了),完全不是我以前认识的那个C++了,所以专门记录一下,并且会不定期更新,最近很火的Kotlin之后也会写一篇学习笔…
深入理解 System.loadLibrary
本文主要讲述 Android 加载动态链接库的过程及其涉及的底层原理。 会先以一个Linux的例子描述native层加载动态链接库的过程, 再从Java层由浅入深分析System.loadLibrary 首先我们知道在Android(Java)中加载一个动态链接库非常简单,只需一行代码: System.loadLibrary("native-lib"); 事实上这是Java提供的API,对于Jav…
Kotlin 函数与函数式编程
自从Google爸爸宣布Kotlin为自己的干儿子之后,Kotlin被各大社区炒的火热。 如果你对Kotlin语法一无所知,推荐先阅读官方文档或者中文站(https://www.kotlincn.net/docs/reference/)之后再看这篇文章会有更深刻的理解。本篇文章主要介绍Kotlin函数的用法,以及自己对函数式编程的一些理解。并且会和Python,C++做一些比较。 下面是维基百科上…
理解 JNI 技术
JNI 即Java native interface,,是一种技术,提供了丰富的接口,可以在Java层调用native代码,也可以在native层调用Java代码,native代码一般是指C/C++程序。JNI就像是一座桥,连通着Java与native。阅读Android源代码的时候可以发现其用了大量的JNI技术,如果要深入学习Android了解JNI技术是必不可少的。在追求性能,对安全性要求高或…
深入理解 MessageQueue
Android 中有两个非常重要的知识点,分别是Binder机制和Handler机制。前者用于跨进程通讯,并且通过 ServiceManager 给上层应用提供了大量的服务,而后者用于进程内部通讯,以消息队列的形式驱动应用的运行。之前的文章已经多次分析了Binder相关的内容,复杂程度远高于Handler,之后还会继续分析Binder。说到Handler,做安卓开发的一定都不会陌生,一般用于切换线…
深入理解 ServiceManager
ServiceManager是安卓中一个重要的类,用于管理所有的系统服务,维护着系统服务和客户端的binder通信。 对此陌生的可以先看系统服务与ServiceManager来了解应用层是如何使用ServiceManager的。 我们可以通过 ServiceManager.getService(String name)来获取服务,返回的是一个Binder对象,用于与系统做远程通信。 public …
Android Toast 原理分析
Android Toast 是我们日常开发中常用的View组件,下面分析一下Toast是如何运作的,开始之前先要知道所有的视图都是通过 WindowManager.addView(mView, mParams) 添加并显示到屏幕上的,这是一个IPC调用。对此有疑问的可以先翻看一下相关的文章。 使用篇: 使用还不简单,一行代码搞定: Toast.makeText(MainActivity.this,…
系统服务与 ServiceManager
Android Binder 机制是安卓应用运行的基础,一个应用的运行需要无法避免地和系统提供的Binder做交互。Android 系统以服务(Service)的方式暴露出很多Binder对象,准确的说我们拿到的是Binder代理对象(BinderProxy),真正的Binder对象运行于安卓系统进程中(system_process)。我们的应用以夸进程的方式调用系统提供的各种服务,通常以Cont…
Android IPC 机制
本文为《Android 开发艺术探索》 第二章IPC机制 笔记及实践 文章中涉及的代码:https://github.com/pqpo/ServiceAndIpcDemo  建议先clone一份到本地,运行起来之后再继续阅读。 其中项目中包括Service生命周期的部分不在本文 讨论范围之内,并且只演示了使用Binder进行进程间通讯,其他方式比较简单。 IPC:Inter-Process Com…
thumbnail
JVM 内存结构与内存溢出异常
本文为《深入理解Java虚拟机》读书笔记,加入了一些自己的见解。 Jvm内存溢出异常就是我们常说的OOM,即java.lang.OutOfMemoryError,当然还包括java.lang.StackOverflowError。 那么它和内存泄漏有什么区别与联系呢? 对于内存泄漏,维基百科的定义是:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。 对应于Java虚拟机…
Tinker 接入及源码分析(三)
该系列文章分析基于 Tinker1.7.6 版本 Tinker项目地址:https://github.com/Tencent/tinker Tinker接入及源码分析(一):简单介绍以及如何接入 Tinker接入及源码分析(二):加载补丁源码分析 Tinker接入及源码分析(三):合成补丁源码分析 上篇文章分析了加载补丁的源码,本篇文章会继续分析tinker初始化过程以及合成补丁的过程。 之前也说…