自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

这个人很懒什么都没有~

这个人很懒什么都没有~

  • 博客(153)
  • 问答 (1)
  • 收藏
  • 关注

原创 【开发语音助手】android 语音识别、合成、唤醒 sherpa

前面介绍了 android 部署大模型,下一步就是语音处理,这里我们选用 sherpa 开源项目部署语音识别、合成、唤醒等模型。离线语音识别库有whisper、kaldi、pocketshpinx等,在了解这些库的时候,发现了所谓“下一代Kaldi”的sherpa。从文档和模型名称看,它是一个很新的离线语音识别库,支持中英双语识别,文件和实时语音识别。sherpa是一个基于下一代 Kaldi 和 onnxruntime 的开源项目,专注于语音识别、文本转语音、说话人识别和语音活动检测(VAD)等功能。

2024-10-19 12:16:01 894

原创 【开发语音助手】android 部署大模型 MLC-LLM

MLC-LLM 是一个开源项目,旨在为大规模语言模型(LLM)提供高效的训练和推理框架。它支持各种模型架构和训练策略,并且致力于优化计算资源的使用,以提高模型的性能和可扩展性。这里稍微讲解了一些MLC的基本概念,以帮助我们使用和了解 MLC LLM。MLC-LLM 由三个不同的子模块组成:模型定义、模型编译和模型运行。使用 mlc-llm开发流程:➀ Python 中的模型定义。

2024-09-14 09:12:34 738

原创 低音频码率 codec

分享两个神经网络的超低音频码率 codec:这两个都是传统声码基础上使用神经网络进一步压缩音频,Lyra 是 google 开发的最低码率 3.2k,音频质量较好而且编译工具是谷歌官方的 bazel(直接支持android,源码使用了 tensorflow lite 推理加速)。LpcNet 码率是 1.6k 不过在嵌入式平台或者移动端有算力要求,音质也稍微差一些。

2024-06-30 14:30:37 774

原创 大模型 Agent 任务 ,如何开发一个 AI 代理?

而大模型代理使用类似的思想,利用大模型的自然语言分析能力根据当前对话梳理达到目标需要执行的策略,然后一边执行操作一边根据反馈分析下一个操作,最后达到目标,生成总结输出。Agent 是目前认为最能够将大模型实际落地的应用方向,总的来说 Agent 其实就是提示词工程,通过更好的提示词来激发模型的能力。聊天机器人型AI Agent:聊天机器人型AI Agent是- -种能够通过文本消息与用户进行对话的大模型AI Agent。数据分析型AI Agent可以帮助企业做出更明智的决策、发现潜在的商机、优化运营流程。

2024-04-20 12:19:12 1456

原创 Elasticsearch 混合检索优化大模型 RAG 任务

Elastic 社区在自然语言处理上面做的很不错官方博客更新速度也很快,现阶段大模型的应用场景主要在 Rag 和 Agent 上,国内 Rag(Retrieval-Augmented Generation 检索增强生成) 的尤其多,而搜索对于 Elasticsearch 来说是强项特别是 8.9 之后的版本提供了 ESRE 模块(集成了高级相关性排序如 BM25f、强大的矢量数据库、自然语言处理技术、与第三方模型如 GPT-3 和 GPT-4 的集成,并支持开发者自定义模型与应用),经过我的各种尝试在 El

2024-04-16 16:55:29 2061 2

原创 中文nlp处理常用工具(ltp、apache-nlp、spark-nlp等)

ltp是哈工大社会计算和信息检索研究中心(HIT-SCIR)开源的中文自然语言处理工具集,用户可以使用 ltp 对中文文本进行分词、词性标注、命名实体识别、语义角色标注、依存句法分析、语义依存分析等等工作。目前是我觉得比较好用的nlp工具、相比 apache-opennlp、spark-nlp 等工具对中文支持度更好。ltp是 pytorch 开发,项目上是整合到 elasticsearch 服务中使用。

2024-03-19 10:33:00 843

原创 Weka 算法总结以及接口使用

Weka 算法总结。

2024-03-04 17:04:59 1012

原创 webrtc-agc 自动增益控制算法

最近又开始调 webrtc-agc 算法,这里记录自适应模拟增益模式下音量反馈调节的过程。

2023-11-08 22:05:29 1519 1

原创 DJL 强化学习(附带 FlappyBird示例)

经过我的测试 Java 下面做强化学习有以下几个方案,Deeplearning4j(后面的版本已经移除了rl4j库官方也不维护了,做一些小Work还是可以的),DJL(亚马逊开源,目前这个在 Java 深度学习方向是比较全面的),另外就是强化学习仿真平台 gym、mujoco 这些都可以在 Java 平台找到使用方案。

2023-10-21 11:11:44 823 2

原创 android 使用 onnxruntime 部署 yolov5_face_landmark 人脸检测

下面是使用 opencv-camera,实时处理区域内人脸检测 android 推理 demo。

2023-08-03 12:14:27 1624 2

原创 使用 java-onnx 部署 Meta-ai Segment anything 分割一切

近日,Meta AI在官网发布了基础模型 Segment Anything Model(SAM)并开源,其本质是用GPT的方式(基于Transform 模型架构)让计算机具备理解了图像里面的一个个“对象”的通用能力。SAM模型建立了一个可以接受文本提示、基于海量数据(603138)训练而获得泛化能力的图像分割大模型。图像分割是计算机视觉中的一项重要任务,有助于识别和确认图像中的不同物体,把它们从背景中分离出来,这在自动驾驶(检测其他汽车、行人和障碍物)、医学成像(提取特定结构或潜在病灶)等应用中特别重要。

2023-05-16 14:00:51 1571 11

原创 使用 java-onnx 部署 PaddleOCR-v3 文本检测

模型推理输出文本区域需要经过二值化之后使用 opencv 查找轮廓,然后获取最小外接矩形并扩展得到最终的文本区域,后续需要矩形旋转、投影变换等操作作为文本识别的输入。文本识别可以用crnn等各种模型。

2023-05-13 17:59:31 2256 4

原创 【PostgreSQL】客户端请求处理 PostgresMain()

参数化 Prepared-statement 的解析阶段:bind,将上一阶段的 PreparedStatement 生成执行计划并绑定保存,后续相同的参数化请求可以复用,还需要对已有的计划进行校验。请求传递的是参数、参数格式和返回列格式。参数化 Prepared-statement 的解析阶段:parse,对语法进行分析并重写,请求传递的是带参数占位符的sql语句。参数化 Prepared-statement 的解析阶段:execute,参数和计划 Portal 都有了直接执行请求。

2023-04-26 17:21:16 242

原创 【Hotspot】 JNI/JNA调用、Native调用

因为前面 Java Static 中调用的 RegisterNatives 函数用于 JNI 注册,而底层调用的 Java_java_lang_Xxxx_registerNatives() 这些函数本身也是一个 JNI ,那么这些起始的 JNI 函数就是通过 NativeLookup::lookup() 进行注册的。native 是与C++联合开发的时候用的!JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。

2023-04-26 17:20:36 1507

原创 【Hotspot】类生命周期(4):对象引用管理:HandleMark 和 HandleArea

(new 出来的对象的实例存储在堆中,但是仅仅存储的是成员变量,也就是平时所说的实例变量,成员变量的值则存储在常量池中。成员方法被存储在方法区,并不是存储在第一个创建的对象中,因为那样的话,第一个对象被回收,后面创建的对象也就没有方法引用了。与堆一样,是被线程共享的内存区域,要注意线程安全问题。在HandleMark的析构函数中会将HandleArea的当前内存地址到方法调用前的内存地址top之间的所有分配的oop都销毁掉,然后恢复当前线程的HandleArea的内存地址top到方法调用前的状态。

2023-04-25 11:28:25 247

原创 【Hotspot】类生命周期(3):对象创建 new 关键字

也就是说,Java中每个线程都会有自己的缓冲区称作TLAB(Thread-local allocation buffer),每个TLAB都只有一个线程可以操作,TLAB结合bump-the-pointer技术可以实现快速的对象分配,而不需要任何的锁进行同步,也就是说,在对象分配的时候不用锁住整个堆,而只需要在自己的缓冲区分配即可。在一般应用中,不会逃逸的局部对象所占的比例很大,如果能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,无须通过垃圾收集器回收,可以减小垃圾收集器的负载。

2023-04-25 11:27:06 133

原创 【Hotspot】类生命周期(2):类解析、类链接:Oop和Klass机制

oop 指的是 Ordinary Object Pointer(普通对象指针,指向被创建的对象),它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象;也就是说 oopDesc 是所有对象类的顶级基础类,Java 所有对象都转换为 C++ 下 oopDesc 类对象,以此通过 C++ 方法来访问 Java 对象。HotSpot的解决方案是,为每一个已加载的Java类创建一个instanceKlass对象,用来在JVM层表示Java类。是 JVM 的规范,所有虚拟机 必须遵守的。

2023-04-25 11:24:40 520

原创 【Hotspot】类生命周期(1):类加载 Bootstrap 以及双亲委托

这个ClassLoader类是用C++/C语言编写的,负责将/lib目录、-Xbootclasspath选项指定的目录或系统属性sun.boot.class.path指定的目录下的核心类库加载到内存中。扩展类加载器由sun.misc.Launcher$ExtClassLoader类 Java 实现,负责将/lib/ext目录或者由系统变量-Djava.ext.dir所指定的目录中的类库加载到内存中。JVM在运行时,需要一种用来标识Java内部类型的机制。

2023-04-25 11:19:55 341

原创 【hotspot】执行字节码指令流程(4):编译器C1/C2

在HotSpot VM 中,除了模板解释器外,有很多地方也会用到运行时机器代码生成技术,如广为人知的C1编译器产出、C2编译器产出、C2I/I2C 适配器代码片段、解释器到JNI适配器的代码片段等。C2即时编译器采用了激进乐观的优化技术,并采用传统编译器许多的编译优化手段,如内联优化、全局值编码(GVN)、图着色的寄存器分配、BURS指令选择算法等。接着进行平台无关优化并生成平台相关的 MachNode图:最后进行平台相关优化,包括指令选择、代码重排、寄存器分配、窥孔优化,直至输出目标机器代码。

2023-04-25 11:17:20 504

原创 【Hotspot】执行字节码指令流程(3):编译任务队列/热点统计

其中 _goto d调用了 branch 指令就用于 for、分支跳转等,而即使编译并执行OSR(用编译后的本地代码替换掉原来的字节码指令,所谓的栈上替换就是替换调用入口地址,将原来解释器上的变量,monitor等迁移到编译后的本地代码对应的栈帧中)这一部分逻辑就在 branch 实现中。0 -> (3->2) -> 4,这种情形下已经把方法加入到3的编译队列中了,但是C1队列太长了导致在0的时候就开启了profile,然后就调整了编译策略按level 2来编译,即时还是3的队列中,这样编译更快。

2023-04-25 11:11:41 268

原创 【Hotspot】执行字节码指令流程(2):解释器(TemplateInterpreter/C++)

entry_table 属性是一个 entry_point 数组,按照 MethodKind 类型保存入口点,例如普通方法的入口点为_entry_table[0]、同步的普通方法的入口点为_entry_table[1],这些_entry_table[0],_entry_table[1]指向的就是之前_code队列里面的例程。模板解释器就继承自抽象解释器,在那些例程之上还有自己的特设例程,例如上面定义的一些属性,保存了程序异常时的入口例程,其实还有许多为保存例程入口而定义的字段或数组。

2023-04-25 11:07:51 465

原创 【Hotspot】 执行字节码指令流程(1):堆栈的创建以及Java函数调用

Stub代码是HotSpot生成的固定调用点的代码。* 将一个常量加载到操作数栈: bipush, sipush, ldc, ldc_w, ldc2_w, aconst_null, iconst_m1, iconst_i, lconst_l, fconst_f, dconst_d;注意按照后缀就知道,JVM会根据不同的操作系统使用的cpu指令集来调用不同的实现,例如这里的x86_64所对应的源文件 hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp。

2023-04-25 11:04:17 415

原创 【Hotspot】线程 Thread 创建到执行 thread_entry

每个 Java 中的 Thread.java 对象的创建,会在 C++ 中创建 JavaMethod 对象,并且调用系统内核线程创建的函数创建系统线程。而对于不同的操作系统来说,它们本身的设计思路基本上是完全不一样的,因此它们各自对于线程的设计也存在种种差异,所以 JVM 中明确声明了:虚拟机中的线程状态,不反应任何操作系统中的线程状态。前面已经分析了栈帧的内存结构,Java 函数的调用,以及JVM的初始化流程,会发现里面都穿插了线程,一个函数的调用就必定有线程的创建以及线程栈帧的创建。

2023-04-25 10:57:19 269

原创 【Hotspot】JVM启动流程

jdk/src/share/bin/java.c InitializeJVM() => 初始化jvm,调用CreateJavaVM进行初始化,调用libjvm中的库函数JNI_CreateJavaVM。hotspot/src/share/vm/prims/jni.cpp JNI_CreateJavaVM() => 进入jvm初始化阶段,Threads::create_vm()执行入口。到这一步就进入了jvm运行真正的入口。

2023-04-25 10:53:42 761

原创 【Meta-AI】Sam-分割一切 测试

近日,Meta AI在官网发布了基础模型 Segment Anything Model(SAM)并开源,其本质是用GPT的方式(基于Transform 模型架构)让计算机具备理解了图像里面的一个个“对象”的通用能力。图像分割是计算机视觉中的一项重要任务,有助于识别和确认图像中的不同物体,把它们从背景中分离出来,这在自动驾驶(检测其他汽车、行人和障碍物)、医学成像(提取特定结构或潜在病灶)等应用中特别重要。下载三个权重文件中的一个,我用的第一个,三个模型从大到小,8G以下显存选vit_b。

2023-04-24 12:20:58 2830 1

原创 强化学习仿真:mujoco-py 搭建-路径过长问题解决

pip install -r requirements.dev.txt #下载并安装相关依赖。pip install -r requirements.txt #下载并安装相关依赖。如果出现了路径太长的问题,从本地文件进行安装。python setup.py install #安装mujoco-py。然后pycharm创建一个项目,选择当前py环境。

2023-04-23 22:08:11 414

原创 使用 java-onnx 部署 mask rcnn 实例分割

使用 java-ort 部署 mask rcnn 实例分割。

2023-03-30 21:00:40 866

原创 使用 java-onnx 部署 yolovx 实例分割

和目标检测的区别在于,需要将数据1的后32位,乘数据2的32*160*160矩阵来得到目标的 mask 信息。将 output1 的 32*160*160 也就是 float[][][] 转换成二维矩阵 32*25600 的 float[][],相当于把160*160展平,得到矩阵1,是 32行、25600列,将 output2 的每个检测框的 117 取最后32位,转为一维矩阵 float[],得到矩阵2,是1行,32列。将矩阵3再转换为二位矩阵 160*160,再进行插值扩展到原始图像大小得到矩阵4。

2023-03-28 14:25:52 958

原创 使用 java-onnx 部署 yolovx 目标检测

这里使用 --include torchscript onnx 生成 onnx 文件,并指定 --opset 16,后续使用 com.microsoft.onnxruntime Java 库加载依赖时要求 opset 不超过16.流程是加载权重,输入图片,将图片resize到模型输入的shape,预测完了之后解析 25200*85,根据置信度、nms等阈值进行过滤,然后将过滤剩下的框将坐标按照缩放比例转换到原始图像坐标系中,最后标注即可。

2023-03-21 16:47:25 19570 26

原创 kafka 各模块启动全流程 KafkaServer

KafkaScheduler.schedule() 执行定时任务 name=shutdown-idle-replica-alter-log-dirs-thread (kafka.utils.KafkaScheduler)KafkaScheduler.schedule() 执行定时任务 name=kafka-log-start-offset-checkpoint (kafka.utils.KafkaScheduler)

2023-03-01 22:38:05 1085

原创 kafka 日志管理器、分区机制

另外缓存文件的读写是使用MappedByteBuffer,底层是使用了页缓存PageCache,而操作系统使用LRU机制管理页缓存,同时由于Kafka写入索引文件是文件末尾追加写入,因此几乎所有索引查询都集中在尾部,如果在文件全文进行二分查找可能会碰到不在页缓存中的索引,导致缺页中断,阻塞等待从磁盘加载没有被缓存到page cache的数据。在创建主题时,不同 broker 节点的现有负载一样,所以多个分区到broker的分配,以及不同分区的多个副本到 broker 的分配都需要一些分配计算以均衡负载。

2023-03-01 22:32:05 540

原创 kafka 请求 OffsetForLeaderEpoch 处理、epoch机制、副本截断

2、如果消息写入了follower副本B,则follower副本B的LEO与leader副本的LEO是一致的,对应的offset是最新的,即使此后follow副本B宕机也不受影响。这个LastOffset有两种可能,一种是比follower发送的请求中的Leader Epoch大1的开始offset,另一种是如果当前leader epoch与请求中的leader epoch相等,那么就返回当前leader的LEO。而在主副本处理请求时,请求中是携带了 Controller 分配的 epoch 值的。

2023-03-01 22:27:09 1267

原创 kafka 请求 Produce、二次Fetch 处理、ISR维护

Partition.checkEnoughReplicasReachOffset() => 校验从副本是否都同步成功 requiredOffset=1,当前是否主副本:Some(Log(dir=C:\workspace\kafkaData\data1\flinkin-01-0, topic=flinkin-01, partition=0, highWatermark=0, lastStableOffset=0, logStartOffset=0, logEndOffset=1))

2023-03-01 22:23:57 15878

原创 kafka 请求 UpdateMetadata 处理

集群 Controller 负责元数据的管理,保存有一个 event 事件队列,如果 event 事件是通知其他节点更新集群元数据的话就会广播元数据更新请求出去。NetworkClient.doSend() 发送集群内部请求 ApiKey=UPDATE_METADATA (org.apache.kafka.clients.NetworkClient)KafkaApis.handleUpdateMetadataRequest() => 更新元数据。// 主副本所在 brokerId。

2023-03-01 22:20:38 677

原创 Kafka CreateTopic 集群处理

Partition.makeLeader() 当前分区:LeaderAndIsrPartitionState(topicName='flinkin-30', partitionIndex=1, controllerEpoch=36, leader=1, leaderEpoch=0, isr=[1], zkVersion=0, replicas=[1], addingReplicas=[], removingReplicas=[], isNew=true)

2023-02-21 17:41:37 661 1

原创 【PostgreSQL】检查点机制 CheckpointerMain()

WAL 文件顺序记录了提交的数据修改记录,每个操作都有一条 xlog 日志而 LSN 就是这一条条日志的编号,在某一个 LSN 执行 Checkpoint 后,这个 LSN 之前的 WAL 日志所对应的内存的脏数据就持久化了,WAL 在这个 LSN 之前的日志也就不需要了,在执行了 CheckPoint 之后,控制文件会记录这一次执行的 CheckPoint 具体在哪个 WAL 文件的哪一条 xlog 记录上。这两个文件都比较重要,控制文件损坏影响的是系统恢复、wal 文件损坏影响的是备份。

2023-02-19 19:14:29 16568

原创 【Elasticsearch】ES机器学习源码分析

它是一种数据框分析,通过分析每个数据点与其他数据点的接近程度及其周围点簇的密度来识别数据集中的异常点。以 customer_full_name(顾客名称)为实体聚合每个顾客所有订单的总金额 sum/avg(taxful_total_price),得到一个每个顾客的平均消费金额和总消费金额,也就是 transfer 得到的是一般意义的样本数据而不是 datafeed 一样的时序数据。这是一种监督的途径。在这种模式下,用户不用训练机器学习什么是异常,期望得到的是什么,什么是对的,什么是错误的。

2023-02-18 15:49:37 16372

原创 【Redis】内存淘汰处理

* 对象类型 REDIS_STRING(字符串)、REDIS_LIST (列表)、REDIS_HASH(哈希)、REDIS_SET(集合)、REDIS_ZSET(有序集合)*/在 redis 中为了节省空间以及提高性能没有使用链表来维护这个lru链表,而是在每次操作一个key时更新这个key的操作时间,按照操作时间排序来代替lru的链表维护操作所以是近视 lru 算法。首先 lru 算法需要维护一个链表,每次对一个key进行更新、方位、插入之后需要将这个key从链表的中间位置移动到头部。

2023-02-08 22:49:57 124

原创 【Redis】AOF持久化

定时任务调用 serverCron() 驱动 aof 持久化,持久化调用的入口函数是 aof.c flushAppendOnlyFile(),会判断缓冲区 server.aof_buf 中是否有内容,然后根据策略执行 fsync 写入磁盘。(1)处理key的操作后,将操作记录到 server.aof_buf (写缓存)之外还会记录到 aof_rewrite_buf_blocks(重写缓存),因为重写是遍历内存所有数据耗时较长用重写缓存来保存本次重写过程中新产生的数据。这是重写持久化入口函数。

2023-02-08 22:47:47 245

原创 【Redis】RDB持久化

通过SAVE或者BGSAVE操作可以显式调用RDB.SAVE创建RDB文件的速度会比BGSAVE快,SAVE可以集中资源来创建RDB文件,如果数据库正在上线当中.就要使用BGSAVE,如果数据库需要维护,可以使用SAVE命令.【log】server.c redisSetCpuAffinity() 绑定进程和cpu,当前进程:42949672976,配置的cpu:(null)【log】rdb.c rdbSave() 开始rdb持久化,filename=dump.rdb。RDB(后台)基本的执行过程是这样的。

2023-02-08 22:47:09 266

空空如也

空空如也

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

TA关注的人

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