- 博客(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
原创 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
原创 DefaultParameterHandler 参数处理器
ParameterHandler和其默认实现类DefaultParameterHandler的简单说明。
2023-09-26 11:52:04
368
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅