自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Deepseek-强化学习算法(通俗易懂版)

首先先贴一张Deepseek核心技术的梳理图:上图详细了讲述了Deepseek主要在哪些阶段用了强化学习方法(GRPO)

2025-02-23 17:59:30 1109

原创 softmax防止上下溢出问题

下溢(Underflow)是指在计算过程中,数值变得太小,低于计算机能够表示的最小值,导致结果为0。由于指数函数 ex 对于任何实数 x 都是正的,所以即使 zi−C 是一个很大的负数,ezi−C 也不会是0,因此不会出现分母为0的情况,从而避免了下溢。由于 max(z) 是最大的输入值,减去它之后,所有的 zi−max⁡(z)都会小于或等于0,因此 ezi−max⁡(z)的值会小于或等于1,从而避免了上溢。通过减去最大值102,我们避免了上溢,并且由于 e−2,e−2 和1都是正数,不会出现下溢。

2024-12-09 14:53:17 240

原创 主流PEFT(详细版)

大模型微调可以大概分为全量微调和PEFT两种。PEFT旨在最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务的性能,从而缓解大型预训练模型的训练成本。主流的PEFT有七种,Lora,Qlora,Adapter Tuning, Prefix Tuning, P-Tuning和 P-Tuning v2好处:不增加太多额外的计算负担的情况下,有效调整模型,保持其原有的性能。

2024-12-04 10:33:08 1059

原创 KV Cache(通俗易懂版)

由于单向注意力的存在,新加入的token并不会影响前面序列的计算,因此可以将已计算过的每层的Kv值保存起来,这样子可以节省和本次生成无关的计算量。每个时间步的Query(Q)是基于模型的当前输入动态生成的,它直接依赖于当前生成的token。相反,K和V矩阵对于过去时刻的输入是静态的,不再变化,因此可以缓存以节省计算资源。通过将kv值存储在速度远快于显存的L2缓存中,可以减少kv值的保存和读取,大大加快推理速度。在进行自回归解码的时候,新生成的token会加入序列,一起作为下一次解码的输入。

2024-11-27 17:40:58 391 1

原创 位置编码(通俗易懂总结版)

Embedding技术具有许多优势。首先,它可以完成语义表示,将具有相似语义的数据点映射到接近的位置,这对于很多任务非常有用。其次,Embedding可以完成降维,降低数据的维度,减少计算量,提高计算效率。此外,Embedding还可以学习语义关系,捕捉到数据之间的内在联系,为后续的机器学习任务提供更有用的信息。什么是??什么又是??如果模型的输出会随着输入文本数据顺序的变化而变化,那么这个模型就是关于位置敏感的,反之则是位置不敏感的。用更清晰的数学语言来解释。

2024-11-21 18:26:51 1101

原创 分词器的概念(通俗易懂版)

什么是分词器?简单点说就是将字符序列转化为数字序列,对应模型的输入。通常情况下,Tokenizer有三种粒度:word/char/subword可以看到这三种粒度分词截然不同,各有利弊。最后为了平衡以上两种方法, 又提出了基于 subword 进行分词:它可以较好的平衡词表大小与语义表达能力;这种方法的目的是通过一个有限的词表 来解决所有单词的分词问题,同时尽可能将结果中 token 的数目降到最低。

2024-11-19 20:48:49 1650

原创 分布式训练(DP和DDP)

DP里面只有一个优化器Optimizer,这个优化器Optimizer只在Master GPU上进行参数更新,当环境不再不在改变的时候,其它GPU选择了躺平,当GPU:0忙前忙后去分发数据、汇总梯度,更新参数的时候,其它GPU就静静躺着。负载不均衡:其中一个GPU被指定为Master GPU,负责汇总梯度和广播更新等,Master GPU可能会承担额外的通信和计算负担,导致负载不均衡。同时导致GPU利用率不足。GPU:0将自身的模型参数复制到其它GPU,确保每个GPU上的模型参数完全相同。

2024-11-14 19:29:22 990

原创 Transformer和BERT的区别

在BERT中,与一般的词嵌入编码类似,位置编码也是随机生成且可训练的,维度为[seq_length, width],其中seq_length代表序列长度,width代表每一个token对应的向量长度。我们知道,BERT模型最多只能处理512个token的文本,其原因在于BERT使用了随机初始化训练出来的绝对位置编码,最大位置设为为512,若是文本长于512便无位置编码可用。BERT的位置编码是可学习的Embedding,因此不仅可以标记位置,还可以学习到这个位置有什么用。pos表示位置,i 表示所在维度。

2024-11-04 20:05:43 1243

原创 16天自制CppServer-day09

在之前的教程中,一个完整的单线程服务器设计模式已经编码完成了。在进入多线程编程之前,应该完全理解单线程服务器的工作原理,因为多线程更加复杂、更加困难,开发难度远大于之前的单线程模式。不仅如此,读者也应根据自己的理解进行二次开发,完善服务器,比如非阻塞式socket模块就值得细细研究。今天的教程和之前几天的不同,引入了一个最简单、最基本的的缓冲区,可以看作一个完善、改进服务器的例子,更加偏向于细节而不是架构。除了这一细节,读者也可以按照自己的理解完善服务器。

2024-10-31 17:47:22 946

原创 16天自制CppServer-day08

这个版本是一个比较重要的版本,服务器最核心的几个模块都已经抽象出来,Reactor事件驱动大体成型(除了线程池),各个类的生命周期也大体上合适了,一个完整的单线程服务器设计模式已经编码完成了,读者应该完全理解今天的服务器代码后再继续后面的学习。对于TCP协议,三次握手新建连接后,这个连接将会一直存在,直到我们四次挥手断开连接。//该连接的Channel。中,键为该连接客户端的socket fd,值为指向该连接的指针。至此,今天的教程已经结束,我们将TCP连接抽象成一个类,服务器模型更加成型。

2024-10-30 18:46:46 600

原创 量化与知识蒸馏的区别

如果对目前的网络模型A的时延不满意,可以先找到一个时延更低,参数量更小的模型B,通常来讲,这种模型精度也会比较低,然后通过训练一个更高精度的teacher模型C来对这个参数量小的模型B进行知识蒸馏,使得该模型B的精度接近最原始的模型A,从而达到降低时延的目的。如果对目前的网络模型A的精度不是很满意,那么可以先训练一个更高精度的teacher模型B(通常参数量更多,时延更大),然后用这个训练好的teacher模型B对student模型A进行知识蒸馏,得到一个更高精度的A模型。2.3 标签之间的域迁移。

2024-10-30 15:20:21 1241

原创 LN 在 LLMs 中的不同位置 有什么区别么

LN的计算是在单个样本的特征维度上进行的,这意味着它不依赖于batch size,因此它特别适用于那些难以使用BN的场景,比如在循环神经网络(RNN)和变换器(Transformer)模型中,以及在处理不同长度的序列时。此外,LN在训练和测试时执行相同的计算,这与BN不同,BN在训练时使用mini-batch的统计量,而在测试时使用运行时的统计量。在大型语言模型(LLMs)中,Layer Normalization(LN)可以放置在不同的位置上,这些不同的位置对模型的训练和性能有不同的影响。

2024-10-29 22:03:55 592

原创 16天自制CppServer-day07

虚函数使用起来比较繁琐,程序的可读性也不够清晰明朗,而std::function、std::bind等新标准的出现可以完全替代虚函数,所以本教程采用第二种方式。在今天的代码中,Acceptor的Channel使用了ET模式,事实上使用LT模式更合适,将在之后修复。所以新的TCP连接应该由。在这里务必先理解TCP的面向连接这一特性,在谢希仁《计算机网络》里有详细的讨论。仔细分析可发现,对于每一个事件,不管提供什么样的服务,首先需要做的事都是调用。类里也并没有打破服务器的通用性,因为对于所有的服务,都要使用。

2024-10-29 18:29:13 996

原创 16天自制CppServer-day06

从代码中我们可以看到,不管是接受客户端连接还是处理客户端事件,都是围绕epoll来编程,可以说epoll是整个程序的核心,服务器做的事情就是监听epoll上的事件,然后对不同事件类型进行不同的处理。我们的服务器已经基本成型,但目前从新建socket、接受客户端连接到处理客户端事件,整个程序结构是顺序化、流程化的,我们甚至可以使用一个单一的流程图来表示整个程序。事件驱动是一种设计应用的思想、开发模式,而服务器是根据客户端的不同请求提供不同的服务的一个实体应用,服务器开发可以采用事件驱动模型、也可以不采用。

2024-10-28 17:56:59 677

原创 使用语言模型进行文本摘要的五个级别(llm)

视频链接:

2024-10-28 17:39:06 375

原创 16天自制CppServer-day05

在上一天,我们已经完整地开发了一个echo服务器,并且引入面向对象编程的思想,初步封装了Socket和Epoll,大大精简了主程序,隐藏了底层语言实现细节、增加了可读性。让我们来回顾一下我们是如何使用epoll:将一个文件描述符添加到epoll红黑树,当该文件描述符上有事件发生时,拿到它、处理事件,这样我们每次只能拿到一个文件描述符,也就是一个int类型的整型值。

2024-10-27 18:39:11 710

原创 16天自制CppServer-day04

在上一天,我们开发了一个支持多个客户端连接的服务器,但到目前为止,虽然我们的程序以.cpp结尾,本质上我们写的仍然是C语言程序。虽然C++语言完全兼容C语言并且大部分程序中都是混用,但一个很好的习惯是把C和C++看作两种语言,写代码时需要清楚地知道自己在写C还是C++。

2024-10-25 15:02:39 1011

原创 16天自制CppServer-day03

在上一天,我们写了一个简单的echo服务器,但只能同时处理一个客户端的连接。但在这个连接的生命周期中,绝大部分时间都是空闲的,活跃时间(发送数据和接收数据的时间)占比极少,这样独占一个服务器是严重的资源浪费。事实上所有的服务器都是高并发的,可以同时为成千上万个客户端提供服务,这一技术又被称为IO复用。IO复用和多线程有相似之处,但绝不是一个概念。IO复用是针对IO接口,而多线程是针对CPU。

2024-10-24 19:08:08 1026

原创 16天自制CppServer-day02

第一个参数是是否发生错误,如果为真,则表示有错误发生,会调用<stdio.h>头文件中的perror,这个函数会打印出errno的实际意义,还会打印出我们传入的字符串,也就是第函数第二个参数,让我们很方便定位到程序出现错误的地方。但现在,我们的服务器只能处理一个客户端,我们可以试试两个客户端同时连接服务器,看程序将会如何运行。到现在最简单的错误处理函数已经封装好了,但这仅仅用于本教程的开发,在真实的服务器开发中,错误绝不是一个如此简单的话题。上一天我们写了一个客户端与服务器通过socket进行连接,对。

2024-10-23 21:17:27 1065

原创 16天自制CppServer-day01

首先在服务器,我们需要建立一个socket套接字,对外提供一个网络通信接口,在Linux系统中这个套接字竟然仅仅是一个文件描述符,也就是一个。

2024-10-22 22:29:38 727

原创 Windows本地部署中文羊驼模型(Chinese-Alpaca-Pro-7B)(通俗易懂版)

最近由于项目原因需要部署大语言模型, 但碍于经济实力, 只能部署在笔记本电脑上部署量化模型, (电脑至少有16G运行内存),搜集了网上的相关部署资料仍然踩了不少坑,原因在于开源项目在不断更新,导致我们看了别人的教程仍然会出错。(切记,开源项目一定要看准更新版本,很多教程并没有对这个进行详细说明,导致我们按照教程下载了最新的开源项目会出现新的问题。

2024-10-18 17:42:48 1297

原创 阻塞socket 和非阻塞socket的区别(浅显易懂版)

对于这个问题,我们要先弄清什么是阻塞/非阻塞。阻塞与非阻塞是对一个文件描述符指定的文件或设备的两种工作方式。阻塞的意思是指,当试图对该文件描述符进行读写时,如果当时没有东西可读或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止。非阻塞的意思是,当没有东西可读或者不可写时,读写函数就马上返回,而不会等待。现在来理解什么是阻塞socket,什么是非阻塞socket。

2024-10-11 15:16:10 1540

原创 Reactor和Proactor的区别(通俗易懂版)

线程池:复用线程以处理多个连接,减少资源消耗。非阻塞 I/O:避免线程阻塞,但效率低下。I/O 多路复用:高效地监控多个连接,只在必要时处理 I/O 操作。select/poll/epoll 是如何获取网络事件的呢?如果没有事件发生,线程只需阻塞在这个系统调用,而无需像前面的线程池方案那样轮训调用 read 操作来判断是否有数据。如果有事件发生,内核会返回产生了事件的连接,线程就会从阻塞状态返回,然后在用户态中再处理这些连接对应的业务即可。

2024-09-30 15:52:07 1538

原创 socket是什么?套接字是什么?

Socket的原意是“插座”。在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而 socket 就是用来连接到因特网的工具。

2024-09-26 17:29:28 488

原创 deque、queue 和 priority_queue 的区别

访问方式std::deque支持两端和中间的随机访问,std::queue和只允许访问队首元素。元素顺序std::queue按照先进先出的顺序处理元素,根据元素的优先级处理元素,而std::deque不维护元素的特定顺序。底层实现std::deque通常由多个数组块组成,std::queue和通常使用std::deque或std::list作为底层容器,但这些底层容器对用户是隐藏的。适用场景:根据需要的数据结构特性选择合适的容器或容器适配器。

2024-09-14 14:29:49 831

原创 HTTP请求⽅法

与强制缓存不同,协商缓存依赖于客户端和服务器之间的交互,在协商缓存中,服务器在响应中提供了资源的⼀些标识信息,客户端在后续请求中通过这些信息来判断资源是否发⽣了变化,进⽽判断是否需要重新传输资源。强缓存:浏览器判断请求的⽬标资源是否有效命中强缓存,如果命中,则可以直接从内存中读取⽬标资源,⽆需与服务器做任何通讯。为安全幂等的,因为它为只读操作,⽆论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。,如果下⼀次传输的数据相同,那么就返回缓存中的内容,以求更快的展示数据,⽽ POST。

2024-09-09 19:13:34 537

原创 什么是TCP粘包问题?如何解决TCP粘包问题?

算法做了这样⼀件事,当来了⼀个很⼩的数据包,我不急于发送这个包,⽽是等来了更多的包,将这些⼩包组合成⼤包之后⼀并发送,不就提⾼了⽹络传输的效率的嘛。这个想法收到了很好的效果,但是我们想⼀下,如果是分属于两个不同⻚⾯的包,被合并在了⼀起,那客户那边如何区分它们呢?格式化数据:每条数据有固定的格式(开始符,结束符),这种⽅法简单易⾏,但是选择开始符和结束符时⼀定要确保每条数据的内部不包含开始符和结束符。算法,⽤途是这样的:通信两端有很多⼩的数据包要发送,虽然传送的数据很少,但是流程⼀点没少,也需要tcp。

2024-09-06 18:41:48 536

原创 Linux是如何收发网络包的

⽐如,当有⽹络包到达时,⽹卡发起硬件中断,于是会执⾏⽹卡硬件中断处理函数,中断处理函数处理完需要「暂时屏蔽中断」,然后唤醒「软中断」来轮询处理数据,直到没有新数据时才恢复中断,这样⼀次中断处理多个⽹络包,于是就可以降低⽹卡中断带来的性能开销。机制,它是混合「中断和轮询」的⽅式来接收⽹络包,它的核⼼概念就是不采⽤中断的⽅式读取数据,⽽是⾸先采⽤中断唤醒数据接收的服务程序,然后poll 的⽅法来轮询数据。⽹卡是计算机⾥的⼀个硬件,专⻔负责接收和发送⽹络包,当⽹卡接收到⼀个⽹络包后,会通过。

2024-09-06 17:33:47 699

原创 TCP的传输速度

如果系统的空闲内存很多,就可以⾃动把缓冲区增⼤⼀些,这样传给对⽅的接收窗⼝也会变⼤,因⽽提升发 送⽅发送的传输数据数。反之,如果系统的内存很紧张,就会减少缓冲区,这虽然会降低传输效率,可以保证更多的并发连接正常⼯作发送缓冲区的调节功能是⾃动开启的,⽽接收缓冲区则需要配置 tcp_moderate_rcvbuf。如果发送缓冲区「超过」带宽时延积,超出的部分就没办法有效的⽹络传输,同时导致⽹络过载,容易丢包;发送缓冲区⼤⼩可⾃⾏调节,三个数值分别为:动态范围的最⼩值,初始默认值,动态范围的最⼤值。

2024-09-05 20:19:53 984

原创 TCP如何关闭连接(详细版)

函数关闭的孤⼉连接,由于⽆法再发送和接收数据,所以这个状态不可以持续太久,⽽tcp_fin_timeout 控制了这个状态下连接的持续时⻓,默认值是。,⾜以让两个⽅向上的数据包都被丢弃,使得原来连接的数据包在⽹络中都⾃然消失,再出现的数据包⼀定都是新建⽴连接所产⽣的。状态,就表示主动⽅的发送通道已经关闭,接下来将等待对⽅发送FIN 报⽂,关闭对⽅的发送通道。,如果接收缓冲区有已接收的数据,则将会被丢弃,并且后续再收到新的数据,会对数据进⾏ ACK。函数的⼀⽅的连接叫做「孤⼉连接」,如果你⽤。

2024-09-04 18:26:03 2114 1

原创 什么是抓包(详细版)

抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。

2024-08-25 13:29:48 595

原创 ICMP互联网控制报文协议

⽹络包在复杂的⽹络传输环境⾥,常常会遇到各种问题。当遇到问题的时候,总不能死个不明不⽩,没头没脑的作⻛不是计算机⽹络的⻛格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局⾯。包因为某种原因未能达到⽬标地址,那么这个具体的原因将由。⼀类是通知出错原因的错误消息,也就是「差错报⽂类型」⼀类是⽤于诊断的查询消息,也就是「查询报⽂类型」的⾸部和数据域以后得知具体发⽣问题的原因。包被废弃的原因和改善⽹络设置等。,也就是互联⽹控制报⽂协议)。的主要功能包括:确认。的这种通知消息会使⽤。

2024-08-19 15:02:19 167

原创 IPV6基本知识

IPV4⾸部与IPV6⾸部。

2024-08-14 15:29:46 1705

原创 IP基础(通俗易懂版)

如果路由控制表中存在多条相同⽹络地址的记录,就选择相同位数最多的⽹络地址,也就是最⻓匹配。还有另⼀种划分⽹络号与主机号形式,那就是⼦⽹掩码,掩码的意思就是掩盖掉主机号,剩余的就是⽹络号。环回地址是在同⼀台计算机上的程序之间进⾏⽹络通信时所使⽤的⼀个默认地址。路由器寻址⼯作中,也就是通过这样的⽅式来找到对应的⽹络号的,进⽽把数据包转发给对应的⽹络内。通过⼦⽹掩码划分出⽹络号和主机号,那实际上⼦⽹掩码还有⼀个作⽤,那就是划分⼦⽹。⼦⽹划分实际上是将主机地址分为两个部分:⼦⽹⽹络地址和⼦⽹主机地址。

2024-08-13 17:46:54 2347

原创 什么是网关?网关有什么作用?

如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机(如附图所示)。假如你想找你的同学小明聊天,小明家住在很远的另外一个院子里,他家的院子里也有一个看门的王大爷(小明的网关)。假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大爷就是你的网关。李大爷:好,你等着。简单来说,网关是设备与路由器之间的桥梁,由它将不同的网络间进行访问的控制,转换,交接等等。

2024-08-10 17:15:37 2414 4

原创 TCP的重传机制和滑动窗口介绍(详细讲解版)

TCP每发送⼀个数据,都需要⼀次应答,然后继续发送,这样为每个数据包都进⾏确认应答,缺点是:数据往返时间越⻓,⽹络吞吐量越低。为了解决这个问题,TCP引⼊了窗。

2024-08-10 16:55:39 1552

原创 为什么需要 TIME_WAIT 状态

两倍:⽹络中可能存在发送⽅的数据包,当这些发送⽅的数据包被接收⽅处理后⼜会向对⽅发送响应,所以⼀来⼀回需要等待 2。状态,这些滞留的数据包可能会被传递给新连接,导致新连接的数据 被旧连接的数据⼲扰。,报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最⻓时间,超过这 个时间报⽂将被丢弃。报⽂的序列号值,表明已经收到客户端的报⽂了,此时服务端处于 CLOSE_WAIT。⾜以让两个⽅向上的数据包都被丢弃,使得原来连接的数据包在⽹络中都⾃然消失,再出现。,服务端⼀直在等待 ACK状态,⼀直没有等到,就会重发。

2024-08-09 18:24:51 578

原创 Springboot(快速入门)

Spring Boot 并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。它集成了大量常用的第三方库配置,Spring Boot应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box),大部分的 Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),开发者能够更加专注于业务逻辑。

2024-08-08 10:30:56 862

原创 请求转发和重定向的区别(通俗易懂版)

可见,在sendRedirect()里面是两个请求,两个响应。1、请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;4、因为转发只能访问当前WEB的应用程序,所以不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的情况,这个时候就只能使用重定向了。3、重定向的速度比转发慢,因为浏览器还得发出一个新的请求,所以如果在使用转发和重定向都无所谓的时候建议使用转发;

2024-08-08 09:51:30 680

原创 HTTPS是怎么建⽴连接的(通俗易懂版)

首先了解HTTPS的构造,如下图所示:SSL/TLS协议基本流程:客户端向服务器索要并验证服务器的公钥。双⽅协商⽣产「会话秘钥」。双⽅采⽤「会话秘钥」进⾏加密通信。

2024-08-07 21:02:33 1009

空空如也

空空如也

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

TA关注的人

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