自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 收藏
  • 关注

原创 01-PyTorch张量操作总踩坑这5个细节90%的人忽略了

PyTorch张量操作5大避坑指南 reshape与view区别:view要求内存连续,reshape自动处理,优先使用reshape避免报错 维度变换选择: view/reshape改变形状但保持顺序 transpose/permute改变维度顺序(可能破坏连续性) 变换后如需view应先contiguous() 设备一致性: 新建张量默认在CPU,与GPU模型运算会报错 统一使用.to(device)管理张量位置 注意numpy转Tensor保持设备一致 in-place操作风险: 会破坏自动梯度计算

2026-07-31 11:44:10 425

原创 04-ByteBuf:内存管理与池化

本文深入Netty ByteBuf源码。双指针设计(readerIndex/writerIndex)消除flip操作;扩容策略4MB以下倍增、4MB以上按4MB步进;引用计数通过CAS管理生命周期,配合四级泄漏检测发现未释放ByteBuf。内存池借鉴jemalloc:PoolArena分层管理Tiny/Small/Normal/Huge四种规格,PoolChunk用完全二叉树管理Page分配,PoolThreadCache实现无锁的Tiny/Small内存分配。

2026-08-04 21:39:23 259

原创 03-Netty核心组件:Channel与EventLoop

本文拆解Netty Channel继承体系与EventLoop核心源码。AbstractChannel绑定Pipeline和Unsafe,Unsafe封装底层socket操作。NioEventLoopGroup默认创建CPU*2个NioEventLoop,线程数为2的幂次时用位运算选择EventLoop。

2026-08-04 21:36:54 273

原创 02-Reactor模式与Netty线程模型

本文从Doug Lea的Reactor三种模型出发,拆解单Reactor单线程、单Reactor多线程、主从Reactor的演进逻辑。Netty采用主从Reactor:BossGroup负责接受连接,WorkerGroup负责I/O读写,Channel一旦绑定EventLoop后续所有操作同线程执行无需同步。EventLoop数量为2的幂次时用位运算替代取模优化分配。最后分析了业务线程池隔离策略。

2026-08-03 21:15:19 152

原创 01-Java NIO基础:Buffer、Channel与Selector

本文从JDK源码层面拆解NIO三大核心组件:Buffer通过position/limit/capacity三指针实现读写切换,DirectByteBuffer利用堆外内存减少一次拷贝;Channel统一I/O操作接口,支持分散读与集中写;Selector基于epoll/kqueue实现多路复用,一个线程管理数千连接。最后分析了空轮询Bug及Netty的重建Selector方案。理解NIO三大组件,是深入Netty源码的第一步。

2026-08-03 21:13:43 451

原创 07-FSDP分布式训练多卡跑大模型不再OOM

本文介绍了使用PyTorch FSDP进行大模型分布式训练的核心方法。FSDP通过模型参数分片解决了传统DDP方案显存不足的问题,使多卡训练大模型成为可能。文章详细对比了不同分片策略(FULL_SHARD、SHARD_GRAD_OP等)的优缺点,并提供了完整的FSDP配置代码示例,包括分布式环境初始化、混合精度设置、自动包装策略等关键实现。同时还分享了训练循环、模型保存等实战经验,帮助开发者高效利用多卡资源训练大模型,避免OOM错误。相比DDP方案,FSDP能在相同硬件条件下支持更大模型的训练。

2026-08-02 14:11:20 509

原创 06-LoRA微调实战16GB显存跑7B模型的秘密

LoRA技术大幅降低大模型微调显存需求,仅需原参数量的0.1%即可实现高效微调。其核心思想是用低秩矩阵分解(B×A)表达权重调整量ΔW,将7B模型的可训练参数从6.9B降至16.8M,使16GB显存显卡也能微调。关键实现包括:零初始化B矩阵保持初始行为一致、引入alpha/rank缩放因子稳定训练、冻结原始权重仅优化LoRA参数。推荐配置:简单任务rank=4-8,复杂任务rank=16-64,alpha设为2×rank。该技术使大模型微调在消费级硬件上成为可能,极大降低了应用门槛。

2026-08-02 13:52:01 266

原创 05-Transformer手写实现面试能讲工程能用

本文介绍了从零手写Transformer核心组件的实现方法,包括缩放点积注意力、多头注意力和旋转位置编码(RoPE)。作者指出PyTorch内置Transformer不够灵活,无法支持新技术特性,且不利于面试时展示底层原理理解。手写实现能深入理解注意力机制(如除以√d_k防止梯度消失、mask处理等细节),掌握多头注意力的拆分原理和工程实现技巧,并实现当前大模型主流的RoPE位置编码方式。这些组件代码可直接用于实际模型训练,而不仅是面试题级别。

2026-08-02 13:48:39 323

原创 04-从零训练语言模型小模型跑通全流程再说大的

本文介绍了从零开始训练小型语言模型的完整流程。作者建议先从小模型入手,逐步理解训练过程中的每个环节,避免直接训练大模型带来的各种问题。 文章提供了一个极简语言模型的实现,包含嵌入层、4层Transformer和语言模型头,并详细解释了关键设计决策: 采用Pre-LN结构提升训练稳定性 共享token嵌入和输出层的权重以正则化 使用因果掩码确保自回归特性 同时实现了一个玩具数据集生成随机token序列,并提供了完整的训练循环代码框架。

2026-08-01 10:38:41 148

原创 03-DataLoader加载慢拖后腿高效数据管道搭建实战

本文介绍了如何优化PyTorch数据管道,重点关注Dataset和DataLoader的高效实现。主要内容包括: Dataset类型选择:Map-style适合可索引数据,Iterable-style适合流式大数据 大模型训练推荐使用内存映射文件(memmap)和IterableDataset处理海量数据

2026-08-01 10:36:45 260

原创 02-自动求导搞不定nn_Module和autograd原理一次讲透

本文深入解析PyTorch自动求导(autograd)和nn.Module的核心原理。主要内容包括: autograd机制:在前向传播时构建计算图,反向传播时自动求导,采用反向模式更高效 requires_grad的规则:运算结果梯度由输入决定,区分叶子张量(保留梯度)和非叶子张量(默认释放梯度) backward细节:标量才能直接反向传播,梯度会累加,梯度裁剪应在backward之后 nn.Module的5大功能:参数注册追踪、子模块递归管理、设备转移、训练/推理模式切换、状态保存加载 实际应用技巧

2026-07-31 18:01:37 226

原创 Java并发踩坑实录:CyclicBarrier这3个坑,我差点让项目上线崩了!

CyclicBarrier是Java并发中的线程同步工具,适用于多线程相互等待的场景。文章分享了电商大促压测中的真实踩坑经历,包括线程数与parties不匹配导致的阻塞问题。通过3个典型应用场景(分阶段数据分析、压测协作、定时任务同步)对比了与CountDownLatch的区别。详细解析了基础用法和带收尾任务的进阶实现,并剖析了底层基于ReentrantLock+Condition+Generation代机制的源码设计。最后总结了超时处理、异常恢复等实战要点,为Java并发开发提供实用参考。

2026-01-15 13:55:24 674

原创 Java AQS底层原理:面试深度解析(附实战避坑)

摘要: Java并发面试核心难点AQS(AbstractQueuedSynchronizer)是ReentrantLock等并发工具的基础实现,采用"共享状态变量+双向阻塞队列"机制。公平锁通过hasQueuedPredecessors()保证排队顺序,非公平锁直接CAS抢锁性能更高。加锁流程包含tryAcquire、入队和阻塞等待三阶段,解锁时通过tryRelease和唤醒后继节点完成。

2026-01-15 13:48:17 1038

原创 在MyBatis中,BoundSql对象的生成过程是怎样的?

对象的生成过程是一个关键步骤,它涉及到多个组件和方法的协作。对象、解析动态SQL、处理动态参数、生成最终的SQL语句以及缓存机制。

2025-02-06 22:53:13 596

原创 StaticSqlSource与RawSqlSource在MyBatis中的具体区别是什么?

主要用于封装静态SQL语句,这些SQL语句在加载时就已经确定,不包含动态参数或动态标签(如<if><where>等)。它主要用于那些不需要动态拼接的SQL语句,可以直接提交给数据库执行。:同样用于封装静态SQL语句,但它允许直接使用SQL语句字符串,而不是通过XML配置文件中的占位符(如#{}这意味着可以处理更复杂的SQL语句,但需要手动管理SQL字符串的安全性和正确性。和的主要区别在于它们对SQL语句的处理方式和灵活性。

2025-02-06 22:52:58 666

原创 解锁ArrayBlockingQueue奥秘:深入源码的精彩之旅

ArrayBlockingQueue 是 BlockingQueue 接口的一个实现类,它基于数组实现了一个有界阻塞队列。创建 ArrayBlockingQueue 实例时需要指定队列的容量,队列的大小是固定的,无法动态增长。

2024-06-05 21:48:46 968 1

原创 揭秘Redis秘籍:SDS—编织数据的动态字符串魔法

Redis中的SDS(Simple Dynamic String,简单动态字符串)是一种专为Redis设计的字符串表示方式,旨在改进C语言中原生字符串的局限性。

2024-06-05 21:17:14 517

原创 线程创建的4种方式

这4种方式都可以用来创建线程,但是使用的场景和优缺点不同。继承Thread类和实现Runnable接口是最基本的两种方式,使用Callable接口可以获取线程执行结果,使用线程池Executor框架可以更好地管理和复用线程,提高性能和效率。需要根据具体的业务场景和需求选择合适的方式。

2024-02-26 17:47:14 1483

原创 线程的基本属性和方法

线程有一些基本属性和方法,包括id、name、优先级、状态、是否daemo线程、sleep方法、yield方法、join方法、过时方法等,我们简要介绍。

2024-02-26 11:52:05 1154

原创 HotSpot虚拟机对象探秘

建立对象是为了使用对象,我们的Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位、访问堆中的对象的具体位置,所以对象访问方式也是取决于虚拟机实现而定的。目前主流的访问方式有使用句柄和直接指针两种。

2024-02-22 12:09:07 1062

原创 jvm垃圾收集器-三色标记算法

在三色标记算法中,垃圾回收器会从根对象开始,将根对象标记为灰色,然后遍历对象引用关系,将灰色对象引用的对象标记为灰色,直到无法再找到新的灰色对象为止。接着,垃圾回收器将所有未标记为灰色的对象标记为黑色,表示这些对象是活跃的。最后,垃圾回收器将白色对象认定为垃圾,进行回收。

2024-02-21 09:22:43 1957

原创 mybatis PropertyTokenizer 属性标记器

​PropertyTokenizer 是 MyBatis 中的一个工具类,主要用于处理属性表达式(property expressions)。在 MyBatis 中,属性表达式是用于访问对象属性的一种语法,类似于 Java 中的点号操作符。例如,对于一个对象 user,可以使用属性表达式 "user.name" 来访问其 name 属性。PropertyTokenizer 类提供了一些方法来解析和处理这样的属性表达式。

2024-02-21 09:22:13 634

原创 jvm几个常见面试题整理

TLAB表示JVM为每个线程分配了一个私有缓存区域,这块缓存区域包含在Eden区内。简单说TLAB就是在堆内存中的Eden区分配了一块线程私有的内存区域

2024-02-07 16:58:43 1229

原创 jvm垃圾收集器之七种武器

老年代单线程收集器,Serial 收集器的老年代版本,使用“标记-整理”(Mark-Compact)算法来进行垃圾收集。然后在整理阶段,将所有存活的对象向一端移动,从而清理出连续的空闲内存空间,减少内存碎片。使用-XX:+UseParNewGC(新生代使用并行收集器,老年代使用串行回收收集器) 或者-XX:+UseConcMarkSweepGC(新生代使用并行收集器,老年代使用 CMS):对于有限的资源环境,Serial 收集器由于其简单的算法和单线程的执行方式,在垃圾收集上能够达到一定的效率。

2024-02-07 15:39:26 1899

原创 jvm垃圾收集器特性描述

在Java虚拟机(JVM)中,垃圾回收器(Garbage Collector, GC)是自动管理内存的重要组成部分,其主要职责是识别和删除不再被使用的对象,以释放和回收内存资源。随着技术的发展,为了适应不同的应用场景和性能需求,JVM提供了多种垃圾回收器,每种回收器都有其特定的算法和使用场景

2024-02-06 16:34:52 916

原创 StringJoiner Sql拼接利器

StringJoiner sql拼接利器

2024-02-06 10:08:24 1960

原创 netty零拷贝图解

netty零拷贝图解

2023-12-25 09:00:32 1067

原创 Path和Files类使用

针对文件的操作

2023-12-25 08:59:53 975

原创 redis键值相关命令整理

键值相关命令整理

2023-12-14 17:11:42 189

原创 redis HyperLogLog数据结构

HyperLogLog是一种概率性数据结构,用于估计一个集合的基数(不重复元素的数量)。。

2023-12-14 11:39:41 325

原创 redis set命令总结

set常用命令总结

2023-09-28 14:23:15 372

原创 Redis hash 命令总结

redis hash命令总结

2023-09-28 09:19:00 365

原创 leetCode 1333. 餐厅过滤器

在按照 veganFriendly = 1, maxPrice = 50 和 maxDistance = 10 进行过滤后,我们得到了餐馆 3, 餐馆 1 和 餐馆 5(按评分从高到低排序)。餐馆 1 [id=1, rating=4, veganFriendly=1, price=40, distance=10]餐馆 5 [id=5, rating=1, veganFriendly=1, price=15, distance=1]两个过滤器,它们分别考虑餐厅的价格因素和距离因素的最大值。

2023-09-28 09:04:48 198

原创 redis List常用命令整理

Redis list列表常用命令整理

2023-09-27 10:57:00 782

原创 redis String常用命令总结

redis String常用命令总结

2023-09-27 09:12:22 956

原创 mybaits Discriminator鉴别器

mybaits Discriminator鉴别器的简单使用

2023-09-26 13:42:37 329

原创 DefaultParameterHandler 参数处理器

ParameterHandler和其默认实现类DefaultParameterHandler的简单说明。

2023-09-26 11:52:04 368

原创 Mybatis值ResolverUtil的使用

ResolverUtil工具类主要用于在指定的包下查找接口的实现类。

2023-05-15 16:47:53 240

原创 Mybatis PropertyNamer属性名称处理器的使用

配合动态代理,判断方法的类型和和根据方法获取对应的操作属性

2023-05-05 16:01:46 298

原创 Mybatis PropertyCopier 属性拷贝器的使用

对象复制

2023-05-05 15:35:16 211

空空如也

空空如也

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

TA关注的人

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